LoginSignup
0
1

More than 3 years have passed since last update.

音声認識

Posted at

音声認識を取り入れたアプリを開発した時にいろいろ詰まったことがあったので備忘録。

何を使った??

まず音声認識をするのに使ったのはSpeechRecognizer
Androidの音声認識をやるにはこれが基本みたいです。

やりたいこと

常に音声を拾いたい!拾ったら画面に認識した言葉を文字列として表示したい!

詰まったところ

ひとつめ

いざ音声認識をしてみたのですが、一回拾ったらその次の言葉を拾ってくれない。。
ええええ、なんで?となって調べまくりました。
連続して音声を拾うには、音声の取得が終わったところでまたSpeechRecognizer#startListening()を呼べばいいそう!
音声認識した文字列を受け取った先でstartListeningするためにリスナーを用意しました。
エラーの時も処理を継続させたかったので、onError時にもリスナーをよんでいます!

ざっくりですが、こんな感じ。

▼SpeechRecognizerのコールバック用クラス

class SpeechRecognizerListener(private val listener: SpeechResponseListener) : RecognitionListener {

    // 音声結果を返却する
    interface SpeechResponseListener {
        fun onResultsResponse(speechText: String)
    }

    ・・・略・・・
  
  // ネットワークまたは、音声認識エラー
    override fun onError(error: Int) {
        listener.onResultsResponse("")
    }

    // 認識結果
    override fun onResults(bundle: Bundle?) {

     ・・・略・・・

        // 結果を返却する
        if (speechText.isNullOrEmpty()) {
            listener.onResultsResponse("")
        } else {
            listener.onResultsResponse(speechText)
        }
    }
}

▼リスナー先

    override fun onResultsResponse(speechText: String) {
        if (speechRecognizer != null) {
            // SpeechRecognizerをdestroyする
            speechRecognizer!!.destroy()
        }
        setupSpeechRecognizer()
        setupRecognizerIntent()
        speechRecognizer.startListening(intent)
        muteBeepSoundOfRecorder(true, context)
    }

二回目以降のstartListening() を呼び出す前に、destroy()しないとうまくいかないことがあるみたいなので、nullじゃなかったらdestroyするようにしてます。

これで、連続して音声認識してくれることに成功しました。

ふたつめ

音声認識中になんだか音がピコンピコンうるさい。。
startListeningする時にmuteBeepSoundOfRecorderというとこで音ミュートにしたりしてるのになぜ?!と詰まる。

▼実際のイメージ

これじゃぴこぴこうるさいですよね。
でもこれを追加しただけで音が鳴り止んだんです。

am.adjustStreamVolume(AudioManager.STREAM_SYSTEM, AudioManager.ADJUST_MUTE, 0)

AudioManager.STREAM_MUSICに対してだけしか操作してなかったんですけど、AudioManager.STREAM_SYSTEMが必要だったんですねえ。笑

▼STREAM_SYSTEMを入れた後のイメージ

難しいなあ。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1