Описание
Преобразование аудио в текст широко применяется, например для создания субтитров к видео, протоколов собраний и расшифровки интервью. С сервисом ML Kit процесс становится гораздо проще: он очень точно преобразует аудиозаписи в текст с корректной пунктуацией.
Подготовка к разработке
Настройте репозиторий Maven Huawei и интегрируйте SDK для расшифровки аудиозаписей. Подробное описание процесса можно найти здесь.
Указание прав в файле AndroidManifest.xml
Откройте файл AndroidManifest.xml в папке main. Добавьте разрешения на подключение к сети, доступ к статусу сети и чтению данных хранилища до <application. Обратите внимание, что запрашивать нужно динамические разрешения. В противном случае будет ошибка Permission Denied.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Процесс разработки
Создание и инициализация движка расшифровки аудиозаписей
Переопределите метод onCreate в классе MainActivity для создания движка расшифровки аудиозаписей.
private MLRemoteAftEngine mAnalyzer;
mAnalyzer = MLRemoteAftEngine.getInstance();
mAnalyzer.init(getApplicationContext());
mAnalyzer.setAftListener(mAsrListener);
Используйте MLRemoteAftSetting для настройки движка. Сейчас сервис поддерживает стандартный вариант китайского языка и английский, поэтому для параметра mLanguage есть только опции zh и en.
MLRemoteAftSetting setting = new MLRemoteAftSetting.Factory()
.setLanguageCode(mLanguage)
.enablePunctuation(true)
.enableWordTimeOffset(true)
.enableSentenceTimeOffset(true)
.create();
Параметр enablePunctuation указывает, нужно ли автоматически проставлять пунктуацию в полученном тексте. Значение по умолчанию — false.
Если установить для этого параметра значение true, в полученном тексте будет автоматически проставлена пунктуация, а если false — пунктуации не будет.
Параметр enableWordTimeOffset указывает, нужно ли добавлять временную метку к каждому сегменту аудиозаписи. Значение по умолчанию — false. Настраивайте этот параметр, только если длительность записи меньше минуты.
Если значение параметра — true, временные метки будут возвращены с расшифровкой. Эти параметры применяются при расшифровке коротких аудиозаписей длительностью не более минуты. Если значение параметра — false, будет возвращена только расшифровка аудиозаписи.
Параметр enableSentenceTimeOffset указывает, нужно ли добавлять временную метку к каждому предложению в аудиозаписи. Значение по умолчанию — false.
Если значение параметра — true, временные метки будут возвращены с расшифровкой. Если значение параметра — false, будет возвращена только расшифровка аудиозаписи.
Создание обратного вызова слушателя для обработки результата расшифровки
private MLRemoteAftListener mAsrListener = new MLRemoteAftListener()
После инициализации слушателя вызовите startTask в слушателе AftListener для начала расшифровки.
@Override
public void onInitComplete(String taskId, Object ext) {
Log.i(TAG, "MLRemoteAftListener onInitComplete" + taskId);
mAnalyzer.startTask(taskId);
}
Переопределите методы onUploadProgress, onEvent и onResult в слушателе MLRemoteAftListener.
@Override
public void onUploadProgress(String taskId, double progress, Object ext) {
Log.i(TAG, " MLRemoteAftListener onUploadProgress is " + taskId + " " + progress);
}
@Override
public void onEvent(String taskId, int eventId, Object ext) {
Log.e(TAG, "MLAsrCallBack onEvent" + eventId);
if (MLAftEvents.UPLOADED_EVENT == eventId) { // The file is uploaded successfully.
showConvertingDialog();
startQueryResult(); // Obtain the transcription result.
}
}
@Override
public void onResult(String taskId, MLRemoteAftResult result, Object ext) {
Log.i(TAG, "onResult get " + taskId);
if (result != null) {
Log.i(TAG, "onResult isComplete " + result.isComplete());
if (!result.isComplete()) {
return;
}
if (null != mTimerTask) {
mTimerTask.cancel();
}
if (result.getText() != null) {
Log.e(TAG, result.getText());
dismissTransferringDialog();
showCovertResult(result.getText());
}
List<MLRemoteAftResult.Segment> segmentList = result.getSegments();
if (segmentList != null && segmentList.size() != 0) {
for (MLRemoteAftResult.Segment segment : segmentList) {
Log.e(TAG, "MLAsrCallBack segment text is : " + segment.getText() + ", startTime is : " + segment.getStartTime() + ". endTime is : " + segment.getEndTime());
}
}
List<MLRemoteAftResult.Segment> words = result.getWords();
if (words != null && words.size() != 0) {
for (MLRemoteAftResult.Segment word : words) {
Log.e(TAG, "MLAsrCallBack word text is : " + word.getText() + ", startTime is : " + word.getStartTime() + ". endTime is : " + word.getEndTime());
}
}
List<MLRemoteAftResult.Segment> sentences = result.getSentences();
if (sentences != null && sentences.size() != 0) {
for (MLRemoteAftResult.Segment sentence : sentences) {
Log.e(TAG, "MLAsrCallBack sentence text is : " + sentence.getText() + ", startTime is : " + sentence.getStartTime() + ". endTime is : " + sentence.getEndTime());
}
}
}
}
Обработка результата расшифровки в режиме опроса
После выполнения расшифровки вызовите getLongAftResult для получения результата. Обрабатывайте полученный результат раз в 10 секунд.
private void startQueryResult() {
Timer mTimer = new Timer();
mTimerTask = new TimerTask() {
@Override
public void run() {
getResult();
}
};
mTimer.schedule(mTimerTask, 5000, 10000); // Process the obtained long speech transcription result every 10 seconds.
}
private void getResult() {
Log.e(TAG, "getResult");
mAnalyzer.setAftListener(mAsrListener);
mAnalyzer.getLongAftResult(mLongTaskId);
}
Работа функции в приложении
Создайте и запустите приложение со встроенной функцией расшифровки аудиозаписей. Затем выберите аудиофайл на устройстве и преобразуйте аудио в текст.