안드로이드는 음성인식(Speech Recognize)기능을 지원하고 있습니다.


그런데 안드로이드에서 지원하는 음성인식이 두가지 방식이라는 사실은 잘 모르시는 분들이 많습니다. 하나는 잘 알려진, 구글 음성인식 검색을 지원하는 음성인식 엔진이며, 다른 하나는 안드로이드 소스에 들어있으며 SpeechRecorder라는 안드로이드 내장 앱 등등에서 쓰이고 있는 Nuance SREC 네이티브 엔진입니다.

안드로이드의 음성인식 엔진은 두가지

구글 음성인식 검색용 엔진은 offline에서는 사용할 수 없었으나 (젤리빈부터 가능), Nuance SREC 엔진은 자체 내장 native 엔진이기때문에 offline에서 사용 가능하다는 장점이 있으며, 아파치 라이선스로 모든 소스가 공개되어 있다는 장점이 있습니다!

최근에 젤리빈에서 지원하기 시작한 오프라인 음성인식 지원은 Nuance SREC을 사용한 오프라인 음성인식이 아닌 것으로 보입니다. (http://forum.xda-developers.com/showthread.php?t=2014946 참조해서 보면 오프라인으로 쓰고자 하는 경우 데이터를 받게끔 되어있습니다. http://www.youtube.com/watch?v=BTARRXP_I24 넥서스 7에서 오프라인 음성인식 사용하기 영상 참조)

반면, 현재 SREC은 영문만 지원하는 단점이 있습니다. (SREC에서 쓰이는 사전도 영문만 있고, grammar도 영문만 지원) 또한 일반적인 grammar 문법은 잘 지원하지만 dictation을 아직 지원하지 않습니다.

Nuance SREC 엔진은 2008/2009년에 공개되었는데도 많이 사용되지 않고 있는 것은 아마도 관련 문서가 아직은 거의 없기 때문이 아닌가 합니다. (혹은 다른 음성인식 라이브러리를 사용한다거나 해서??)
비교적 최근에 데비안 프로젝트에서 Nuance SREC엔진을 포팅하려는 시도가 있는 것 같은데 별다른 진척은 없는 상태입니다. https://github.com/arthurv/srec 참조

추가: Nuance srec을 이용해 kinect를 리눅스상에서 쓸 수 있게 포팅한 (소스를 보면 고친 부분은 거의 없음) 것도 있더군요. http://www.keyboardmods.com/2011/10/kinect-speech-recognition-in-linux.html 이것을 보면 리눅스상에서도 많은 수고 없이도 사용할 수도 있을 것으로 생각됩니다.

그밖에 더 자세한 내용은 다음 사이트를 참조하시기 바랍니다.


Nuance SREC 음성엔진을 사용하는 프로젝트

그런데 Nuance SREC엔진은 안드로이드 SDK API로 지원되지 않으므로, 이 자체 내장 엔진을 이용해서 앱을 만드려면 android.speech.srec.* 소스를 복사해서 사용하는 방식으로 만들어야 합니다. 이와 같은 방식으로 안드로이드 내장 음성인식 엔진 SREC을 사용하는 대표적인 프로젝트/앱이 다음과 같은 것이 있습니다.

소스 예제

android.speech.srec.Recognizer 자바 소스를 살펴보면 다음과 같은 식으로 사용할 수 있다는 주석이 있습니다.
(아래 소스를 조금 보기좋게 해 두었습니다.)
https://github.com/CyanogenMod/android_frameworks_base/tree/jellybean/core/java/android/speech/srec
https://github.com/CyanogenMod/android_frameworks_base/blob/jellybean/core/java/android/speech/srec/Recognizer.java - CyanogenMod 소스

// create and start audio input
InputStream audio = new MicrophoneInputStream(11025, 11025*5);
// create a Recognizer
String cdir = Recognizer.getConfigDir(null);
Recognizer recognizer = new Recognizer(cdir + "/baseline11k.par");
// create and load a Grammar
Recognizer.Grammar grammar =
    recognizer.new Grammar(cdir + "/grammars/VoiceDialer.g2g");
// setup the Grammar to work with the Recognizer
grammar.setupRecognizer();
// fill the Grammar slots with names and save, if required
grammar.resetAllSlots();
for (String name : names) grammar.addWordToSlot("@Names", name, null, 1, "V=1");
// names 배열에 이름을 넣어두면 인식됨 예를 들어 { "hello", "foobar", "kim" }
grammar.compile();
grammar.save("/mnt/sdcard/foo.g2g"); // path를 고쳐둠
// start the Recognizer
recognizer.start();
// loop over Recognizer events
while (true) {
    switch (recognizer.advance()) {
    case Recognizer.EVENT_INCOMPLETE:
    case Recognizer.EVENT_STARTED:
    case Recognizer.EVENT_START_OF_VOICING:
    case Recognizer.EVENT_END_OF_VOICING:
        // let the Recognizer continue to run
        continue;
    case Recognizer.EVENT_RECOGNITION_RESULT:
        // success, so fetch results here!
        for (int i = 0; i < recognizer.getResultCount(); i++) {
            String result = recognizer.getResult(i, Recognizer.KEY_LITERAL);
            Log.d(TAG, "result = " + result); // 인식 결과값 출력
        }
        break;
    case Recognizer.EVENT_NEED_MORE_AUDIO:
        // put more audio in the Recognizer
        recognizer.putAudio(audio);
        continue;
    default:
        // notifyFailure();
        break;
    }
    break;
}
// stop the Recognizer
recognizer.stop();
// destroy the Recognizer
recognizer.destroy();
// stop the audio device
audio.close();

위의 소스를 거의 고치지 않고서 이를 이용해 간단한 샘플 앱을 만들어보니 자체 내장 음성인식 엔진 SREC이 아주 잘 작동하는 것을 확인하였습니다. (아래 링크를 참조하세요)
(이렇게 확인하고 구글링을 더 해보니 2011년에 이미 다른 분이 이 테스트를 해보신 모양입니다 :) http://www.eoeandroid.com/thread-54280-1-1.html 참고)

기타 참고 사이트


요청이 계속 있어서 간단한 앱을 급조했습니다~

(ICS 배포 이후부터 일부 기종은 srec을 제거한 상태인 기종의 경우에 libsrec_jni가 내장되지 않아서 제대로 작동하지 않습니다.)

https://github.com/wkpark/srec-example

컴파일하고 설치한 후에 사용법은 다음과 같습니다.

1. Start 버튼을 누른다.

2. Dial 123 123 같은 식의 VoiceDialer 명령을 내려본다. (이 명령 세트는 VoiceDialer.g2g 그래머 파일에 있는 내용)

(VoiceDialer.g2g는 external/srec/config/en.us/grammars/VoiceDialer.grxml 파일을 참조하세요)

컴파일된 앱: (libsrec_jni.so가 자체 내장된 기종에서만 제대로 작동합니다)

srec-example.apk



by dumpcookie 2013. 3. 16. 23:05