Описание
Преобразование аудио в текст широко применяется, например для создания субтитров к видео, протоколов собраний и расшифровки интервью. С сервисом 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); }
Работа функции в приложении

Создайте и запустите приложение со встроенной функцией расшифровки аудиозаписей. Затем выберите аудиофайл на устройстве и преобразуйте аудио в текст.
ссылка на оригинал статьи https://habr.com/ru/company/huawei/blog/655761/
Добавить комментарий