기계 학습을 통해 오디오 파일을 텍스트로 변환하는 방법

7000 단어 machinelearning

소개



오디오를 텍스트로 변환하는 작업에는 비디오 자막 생성, 회의록 작성, 인터뷰 대본 작성 등 다양한 응용 분야가 있습니다. 기계 학습은 오디오 파일을 정확한 구두점과 함께 세심하게 정확한 텍스트로 변환하여 그 어느 때보다 쉽게 ​​작업을 수행합니다!

실제 효과



오디오 파일 트랜스크립션이 통합된 앱을 빌드하고 실행합니다. 그런 다음 로컬 오디오 파일을 선택하고 텍스트로 변환합니다.



개발 준비



Huawei Maven 리포지토리 구성 및 오디오 파일 전사 SDK 통합에 대한 자세한 내용은 HUAWEI Developers의 Development Guide of ML Kit을 참조하십시오.

AndroidManifest.xml 파일에서 권한 선언
기본 폴더에서 AndroidManifest.xml을 엽니다. 앞에 네트워크 연결, 네트워크 상태 접근, 저장소 읽기 권한을 추가합니다.
이러한 권한은 동적으로 적용해야 합니다. 그렇지 않으면 권한 거부가 보고됩니다.

<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" />


개발 절차​



오디오 파일 전사 엔진 생성 및 초기화
MainActivity에서 onCreate를 재정의하여 오디오 전사 엔진을 만듭니다.

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로 설정하면 변환된 텍스트에 자동으로 구두점이 표시됩니다. 그렇지 않으면 거짓.

enableWordTimeOffset은 해당 오프셋을 사용하여 각 오디오 세그먼트의 텍스트 전사 결과를 생성할지 여부를 나타냅니다. 기본값은 false입니다. 오디오 지속 시간이 1분 미만인 경우에만 이 매개변수를 설정해야 합니다.
이 매개변수가 true로 설정되면 오프셋 정보가 텍스트 전사 결과와 함께 반환됩니다. 이것은 1분 이하의 짧은 오디오 파일의 트랜스크립션에 적용됩니다. 이 매개변수를 false로 설정하면 오디오 파일의 텍스트 전사 결과만 반환됩니다.

enableSentenceTimeOffset은 오디오 파일에서 각 문장의 오프셋을 출력할지 여부를 나타냅니다. 기본값은 false입니다.
이 매개변수가 true로 설정되면 오프셋 정보가 텍스트 전사 결과와 함께 반환됩니다. 이 매개변수를 false로 설정하면 오디오 파일의 텍스트 전사 결과만 반환됩니다.

전사 결과를 처리하기 위한 리스너 콜백 생성

private MLRemoteAftListener mAsrListener = new MLRemoteAftListener()


리스너가 초기화된 후 AftListener에서 startTask를 호출하여 트랜스크립션을 시작합니다.

@Override
public void onInitComplete(String taskId, Object ext) {
    Log.i(TAG, "MLRemoteAftListener onInitComplete" + taskId);
    mAnalyzer.startTask(taskId);


MLRemoteAftListener에서 onUploadProgress, onEvent 및 onResult를 재정의합니다.

@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 10s.
}

private void getResult() {
    Log.e(TAG, "getResult");
    mAnalyzer.setAftListener(mAsrListener);
    mAnalyzer.getLongAftResult(mLongTaskId);
}


참고문헌



자세한 내용은 다음으로 이동하십시오.
ML 키트official website
ML 키트Development Documentation page, 필요한 문서 찾기
Reddit 개발자 토론에 참여
GitHub ML Kit 샘플 코드 다운로드
Stack Overflow 통합 문제를 해결하기 위해

좋은 웹페이지 즐겨찾기