Android에서 Java로 음성 인식 시작하기

등록일시: 2018-02-15 08:00,  수정일시: 2018-05-02 04:27
조회수: 854
이 문서는 Cognitive Services 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.

Speech Recognition API를 사용하면 클라우드 기반의 Speech Service를 이용해서 음성 오디오를 텍스트로 변환하는 Android 응용 프로그램을 개발할 수 있습니다. API가 실시간 스트리밍을 지원하기 때문에, 응용 프로그램에서 오디오를 서비스에 전송함과 동시에 비동기적으로 부분적 인식 결과를 수신할 수 있습니다.

본문에서는 예제 응용 프로그램을 통해서 Android 기기를 위한 Speech-to-Text 응용 프로그램을 Android 용 Speech 클라이언트 라이브러리를 활용하여 Java로 개발하는 방법을 살펴봅니다.

요구 사항

플랫폼 요구 사항

본문의 예제는 Windows 용 Android Studio에서 Java로 개발되었습니다.

클라이언트 라이브러리 및 예제 응용 프로그램 가져오기

Speech 클라이언트 라이브러리와 Android 예제는 Speech client SDK for Android 저장소에서 다운로드 받을 수 있습니다. 빌드 가능한 예제는 samples/SpeechRecoExample 디렉터리에 위치해 있습니다. SpeechSDK/libs 하위의 armeabi 및 x86 디렉터리에는 여러분의 응용 프로그램에서 사용할 수 있는 두 가지 라이브러리가 위치해 있습니다. libandroid_platform.so 파일의 크기는 22 MB지만 배포 시에는 4MB로 줄어듭니다.

Speech Recognition API 구독 및 무료 평가판 구독 키 발급받기

Speech API는 Microsoft Cognitive Services의 (구 프로젝트 Oxford) 일부분입니다. 무료 평가판 구독 키는 Cognitive Services 체험하기 페이지에서 발급받을 수 있습니다. 음성 탭에서 Bing Speech API를 선택한 다음, API 키 가져오기(Get API Key) 버튼을 클릭합니다. 그러면 기본 키와 보조 키가 발급됩니다. 두 키 모두 동일한 할당량에 연결되어 있으므로 두 키 중 아무 키나 사용해도 무방합니다.

만약 인텐트를 이용한 인식 기능을 사용하고자 한다면, 먼저 LUIS(Language Understanding Intelligent Service)를 등록해야 합니다.

중요
  • 구독 키 발급받기. Speech 클라이언트 라이브러리를 사용하려면 반드시 구독 키가 필요합니다.

  • 구독 키 사용하기. 제공되는 Android 예제 응용 프로그램에서 samples/SpeechRecoExample/res/values/strings.xml 파일의 내용을 여러분이 발급 받은 구독 키로 변경합니다. 보다 자세한 정보는 예제 빌드 및 실행하기 절을 참고하시기 바랍니다.

Speech 클라이언트 라이브러리 사용하기

응용 프로그램에서 클라이언트 라이브러리를 사용하려면, 지시를 따르십시오.

Android 용 클라이언트 라이브러리의 참조는 Speech client SDK for Android 저장소의 docs 폴더에서 살펴볼 수 있습니다.

예제 빌드 및 실행하기

예제를 빌드하고 실행하는 방법은 README 페이지를 참고하시기 바랍니다.

예제 살펴보기

인식 클라이언트 생성하기

다음 예제 코드는 사용자의 시나리오에 따라 적절한 인식 클라이언트 클래스를 생성하는 방법을 보여줍니다:

void initializeRecoClient()
{
    String language = "en-us";

    String subscriptionKey = this.getString(R.string.subscription_key);
    String luisAppID = this.getString(R.string.luisAppID);
    String luisSubscriptionID = this.getString(R.string.luisSubscriptionID);

    if (m_isMicrophoneReco && null == m_micClient) {
        if (!m_isIntent) {
            m_micClient = SpeechRecognitionServiceFactory.createMicrophoneClient(this,
                                                                                 m_recoMode,
                                                                                 language,
                                                                                 this,
                                                                                 subscriptionKey);
        }
        else {
            MicrophoneRecognitionClientWithIntent intentMicClient;
            intentMicClient = SpeechRecognitionServiceFactory.createMicrophoneClientWithIntent(this,
                                                                                               language,
                                                                                               this,
                                                                                               subscriptionKey,
                                                                                               luisAppID,
                                                                                               luisSubscriptionID);
            m_micClient = intentMicClient;

        }
    }
    else if (!m_isMicrophoneReco && null == m_dataClient) {
        if (!m_isIntent) {
            m_dataClient = SpeechRecognitionServiceFactory.createDataClient(this,
                                                                            m_recoMode,
                                                                            language,
                                                                            this,
                                                                            subscriptionKey);
        }
        else {
            DataRecognitionClientWithIntent intentDataClient;
            intentDataClient = SpeechRecognitionServiceFactory.createDataClientWithIntent(this,
                                                                                          language,
                                                                                          this,
                                                                                          subscriptionKey,
                                                                                          luisAppID,
                                                                                          luisSubscriptionID);
            m_dataClient = intentDataClient;
        }
    }
}

클라이언트 라이브러리는 일반적인 음성 인식 시나리오들에 대한 미리 구현된 인식 클라이언트 클래스들을 제공해줍니다:

  • DataRecognitionClient: PCM 데이터를 이용한 음성 인식 (예, 파일 또는 오디오 원본). 데이터가 버퍼로 분할되어 각각의 버퍼가 Speech Service로 전송됩니다. 버퍼를 수정하지 않기 때문에, 필요한 경우 사용자가 직접 묵음 탐지를 적용할 수 있습니다. WAV 파일의 데이터를 제공할 경우, 파일로부터 Speech Service로 데이터를 직접 전송할 수 있습니다. RAW 데이터, 예를 들어 블루투스를 통해서 오디오가 전달되는 등의 경우, 먼저 형식 헤더부터 Speech Service에 전송한 다음 데이터를 전송합니다.

  • MicrophoneRecognitionClient: 마이크로부터 전달된 오디오에 대한 음성 인식. 마이크가 켜져 있고 마이크로부터 전달된 데이터가 음성 인식 서비스로 전송되는지 확인하시기 바랍니다. 마이크의 데이터가 인식 서비스에 전송되기 전에 내장된 "묵음 감지기(Silence Detector)"가 적용됩니다.

  • DataRecognitionClientWithIntentMicrophoneRecognitionClientWithIntent: 이 클라이언트들은 인식된 텍스트 뿐만 아니라, 응용 프로그램에서 추가 작업을 수행하는데 활용할 수 있는, 화자의 의도에 대한 구조화된 정보를 함께 반환합니다. "인텐트(Intent)"를 사용하려면 먼저 LUIS를 이용하여 모델을 훈련시켜야합니다.

인식 언어

SpeechRecognitionServiceFactory를 이용해서 클라이언트를 생성할 때, 언어를 반드시 지정해야 합니다. Speech Service가 지원하는 모든 언어의 목록은 Supported Languages에서 확인하실 수 있습니다.

SpeechRecognitionMode

그리고 SpeechRecognitionServiceFactory를 이용해서 클라이언트를 생성할 때, SpeechRecognitionMode도 지정해야 합니다:

  • ShortPhrase: 최대 15 초까지 말하거나 데이터를 전달할 수 있습니다. 데이터가 서버로 전송되면, 클라이언트는 여러 번의 부분 결과와 n-BEST 선택 항목 형태의 단일 최종 결과를 반환받습니다.

  • LongDictation: 최대 2 분까지 말하거나 데이터를 전달할 수 있습니다. 데이터가 서버로 전송되면, 클라이언트는 서버가 감지한 문장의 일시 중지 위치에 따라 여러 번의 부분 결과와 여러 번의 최종 결과를 반환받습니다.

이벤트 핸들러 연결하기

직접 작성한 클라이언트에 다양한 이벤트 처리기를 연결할 수 있습니다:

  • Partial Results 이벤트: 말하기를 멈추거나 (MicrophoneRecognitionClient를 사용할 경우) 데이터 전송을 마치지 않았어도 (DataRecognitionClient를 사용할 경우), 여러분이 말하는 내용을 Speech Service가 예측할 때마다 매번 호출됩니다.

  • Error 이벤트: 서비스가 오류를 감지하면 호출됩니다.

  • Intent 이벤트: 최종 인식 결과가 구조화된 JSON 인텐트로 파싱된 후, "WithIntent" 클라이언트에서 (ShortPhrase 모드에서만) 호출됩니다.

  • Result 이벤트:
    • ShortPhrase 모드의 경우, 말하기를 멈추면 호출되어 n-BEST 결과를 반환합니다.

    • LongDictation 모드의 경우, 서비스가 문장의 일시 중단을 식별한 위치에 따라 여러 번 호출됩니다.

    • 각각의 n-BEST 선택 항목마다, 신뢰값과 몇 가지 다른 형태의 인식된 텍스트가 반환됩니다. 더 자세한 내용은 Output format을 참고하시기 바랍니다.