Описание

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

Работа функции в приложении

Создайте и запустите приложение со встроенной функцией расшифровки аудиозаписей. Затем выберите аудиофайл на устройстве и преобразуйте аудио в текст.

Комментарии (0)