Удобная расшифровка для быстрой обработки аудиозаписей

от автора

Описание

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


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *