Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20170310

56d7bcf9b5071512c65e753a1619987a?s=47 KAKKA
March 09, 2017

 20170310

2017/3/10 DroidKaigi 2017
「Androidで音声認識を使いこなす」
セッションの発表資料です。

56d7bcf9b5071512c65e753a1619987a?s=128

KAKKA

March 09, 2017
Tweet

Transcript

  1. Androidで音声認識を使いこなす DroidKaigi 2017 2017/03/10 14:20 - 14:50 KAKKA

  2. 対象者 ◦ Androidアプリ開発者 ◦ 音声認識に興味がある方

  3. 目次 AndroidのSpeech Recognizerについての詳細 • Androidで音声認識といえばこれという王道パターンを詳しく解説 • SpeechRecognizerのいろいろな使い方を解説 Androidで連続音声認識を使ってOK Googleみたいなものを作る方法 •

    連続音声認識について解説 • AndroidでどうやってGoogle home, Alexa, Siriのような実装するか
  4. 自己紹介

  5. KAKKA Company: Community: Twitter: Qiita: Github: Drivemode, Inc. ScrumMastersNight! KAKKA_Blog

    KAKKA KAKKA
  6. 音声認識とは 人間の声を機械に認識させること こんにちは こんにちは!

  7. 音声認識使ってるアプリ

  8. Drivemode 車運転者向けNo-Look UI 音声認識 目的地や連絡先の音声検索 LINEなどのメッセージに声だけ で返信 “Yo Drivemode”の声でボイス コマンド認識開始(英語)

  9. Androidで音声認識 といえば?

  10. android.speech.SpeechRecognizer

  11. コンテキスト渡してインスタンス作成

  12. リスナー登録して

  13. 成功した場合、結果はここに返ってきます

  14. エラーだった場合はこちら

  15. このIntentにいろんなオプション付与出来ます

  16. 音声認識スタート!

  17. SpeechRecognizer List<String> recResult = results.getStringArrayList( SpeechRecognizer.RESULTS_RECOGNITION ) 認識結果はlistで返ってくる 信頼度が高い順

  18. SpeechRecognizer float[] confidenceScores = results.getFloatArray( SpeechRecognizer.CONFIDENCE_SCORES ); 認識結果の信頼度も取得可能

  19. Error? ERROR_NETWORK_TIMEOUT(1) ERROR_NETWORK(2) ERROR_AUDIO(3) ERROR_SERVER(4) ERROR_CLIENT(5) ERROR_SPEECH_TIMEOUT(6) ERROR_NO_MATCH(7) ERROR_RECOGNIZER_BUSY(8) ERROR_INSUFFICIENT_PERMISSIONS(9)

    エラーの種類
  20. Error? ERROR_NETWORK_TIMEOUT(1) ネットワークタイムアウトエラー ERROR_AUDIO(3) オーディオレコーディングエラー ERROR_CLIENT(5) 何かしらのクライアント側エラー ERROR_INSUFFICIENT_PERMISSIONS(9) パーミッションエラー ほとんどみかけない

  21. Error? ERROR_NETWORK(2) ネットワークエラー。電波悪かったりとか ERROR_SERVER(4) 何かしらのサーバーエラー。モデルなしでオフラインで認識させようと したときにも。 ERROR_RECOGNIZER_BUSY(8) インスタンス複数生成してるなど設計に問題あり たまに見かける

  22. Error? ERROR_SPEECH_TIMEOUT(6) 認識スタートしてから無言で終わったとき ERROR_NO_MATCH(7) 意味不明な言葉を喋ったとき 一番多い

  23. Error? ERROR_SPEECH_TIMEOUT(6) 認識スタートしてから無言で終わったとき ERROR_NO_MATCH(7) 意味不明な言葉を喋ったとき 一番多いが 実環境に様々な雑音があるため、 SPEECH_TIMEOUTだからといってユーザーが何 も喋っていないと判断してはいけない

  24. SpeechRecognizer他のやり方

  25. StartActivityForResult()でも

  26. StartActivityForResult()でも この場合このExtraは必須

  27. StartActivityForResult()でも LANGUAGE_MODEL_WEB_SEARCH でgoogle検索結果画面に

  28. StartActivityForResult()でも おなじみのstartActivityで認識開始

  29. Googleアプリ

  30. Googleアプリ依存 認識処理の実態はGoogleア プリ MIUIに注意 Googleアプリのアップデート によって挙動が変わることが ある com.google.android.googlequicksearchbox/ com.google.android.voicesearch.serviceapi.GoogleRecognitionService

  31. Googleアプリ依存 例: Googleアプリが5から6になったとき

  32. Googleアプリ依存 例: Googleアプリが5から6になったとき 音声認識開始から終了までの時間がかなり長く なった。 →現在はもとに戻ってる

  33. Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは

  34. Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは

  35. Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは こんにちは

  36. Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは こんにちは こんにちは

  37. Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは こんにちは こんにちは こんにちは

  38. Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは こんにちは こんにちは こんにちは

    (もういいや)
  39. Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは こんにちは こんにちは こんにちは

    (もういいや) こんにちはこんにちはこんにちはこんにちはこんにちは
  40. Googleアプリ依存 例: Googleアプリが5から6になったとき partialResultを使わないと使いものにならない

  41. Googleアプリ依存 partialResults ? start! complete! こんにちは イェエエイ こんにちは ジャスティス onPartialResult

    こんにちは イェ エエイ onPartialResult こんにちは イェ エエイ ジャス ティス onPartialResult onResult
  42. Googleアプリ依存 例: 現在の最新版Googleアプリ デバイスがオフラインのとき、

  43. Googleアプリ依存 例: 現在の最新版Googleアプリ デバイスがオフラインなどのとき、onError返って 来ない!!

  44. Googleアプリ依存 例: 現在の最新版Googleアプリ start! 以降死ぬまで続く... ・・・ 10分 20分 30分 40分

    50分 60分
  45. Googleアプリ依存 例: 現在の最新版Googleアプリ start! 以降死ぬまで続く... ・・・ 10分 20分 30分 40分

    50分 60分 Timeoutを設定しよう!
  46. SpeechRecognizerの応用

  47. オフライン音声認識

  48. オフライン音声認識 Android Speech Recognizerは通常オンラインでgoogleのサーバー と通信して音声認識を行う Google 音声raw 認識結果

  49. オフライン音声認識 実はオフラインでの音声認識も同様に対応されている デフォルトの設定 オンラインで認識するか、オフラインで認識するかが自動的に切り替えら れて認識される

  50. オフライン音声認識 実はオフラインでの音声認識も同様に対応されている デフォルトの設定 オンラインで認識するか、オフラインで認識するかが自動的に切り替えら れて認識される インターネット繋がってるけど、速度めっちゃ遅い ↓ 認識精度めっちゃ悪い

  51. オフライン音声認識 強制的にオフラインで認識させよう intent.putExtra( RecognizerIntent.EXTRA_PREFER_OFFLINE, true ) API level 23より

  52. オフライン音声認識 オフラインで音声認識するためには当然デバイスにモデルデータが必要 Google 音声raw 認識結果 言語モデル 音響モデル 音声raw 認識結果

  53. オフライン音声認識 Marshmallow 設定→言語と入力→Google音声入力→オフラインの音声認識 Nougat 設定→Google→検索→音声→オフラインの音声認識 音響・言語モデルのダウンロード可能 言語モデル 音響モデル

  54. オフライン音声認識 このモデルなしで強制的にオフライン音声認識させた場合 かならず onError()でERROR_SERVERが返ってきて認識に失敗 コールバック何も返ってこない 言語モデル 音響モデル 最新のGoogleアプリ

  55. 多言語音声認識

  56. 多言語音声認識 intentにputExtraするだけ Language String is defined by BCP 47.

  57. 多言語音声認識 英語を設定して日本語を喋ると・・・ Drivemodeは超安全、超便利! Drivemod is really safe and really useful!

    Driving mode Auto and then to Bandy ドラえもんエイジリアリゼーションリアルユース4 日本語を設定して英語を喋ると・・・
  58. Listen時間の延長

  59. Listen時間は長くできる? EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS 今は動いていない!!

  60. ボイスコマンド音声認識

  61. ボイスコマンドとして利用 メッセージ届きました。読 み上げる? listen! 「DroidKaigiってなんな の?」from 槇原敬之 音声認識

  62. ボイスコマンドとして利用 listen! 音声認識 辞書 listen message play

  63. ボイスコマンドとして利用 雑音 result = [ risk, list, less, less than,

    list of, risk of, list for, is ] listen 雑音環境下では短い1つの単語は認識しづらい
  64. ボイスコマンドとして利用 listen listen to message reply reply to message send

    send message navigation start navigation 不自然ではない程度に認識させる文章を長くする。 結局人間が解釈しやすいレベルであればOK
  65. 連続音声認識

  66. SpeechRecognizer Android Speech Recognizerは認識スタートと認識完了が短いライフ サイクル イェエエエエエエエ イ!!!!! 認識スタート マイクON 認識完了

    マイクOFF 認識中
  67. SpeechRecognizer 認識スタート マイクON 認識完了 マイクOFF 認識中 ユーザーがボタンをタップするなど、なにかしらのイベントによりスタートする

  68. 連続音声認識 認識スタート マイクON listening...

  69. 連続音声認識 listening...

  70. 連続音声認識 やっほー やっほー トイレ行きたいなー トイレ行きたい な― listening...

  71. 連続音声認識 10分後... すっきりしたよー! すっきりしたよー listening...

  72. 連続音声認識 マイクOFF listening...

  73. 連続音声認識が日常に OK, Google Hey Siri Hey Alexa Hey Google

  74. 連続音声認識と通常の音声認識 “OK, Google”を拾う 連続音声認識 “OK, Google”を拾う 連続音声認識 通常の音声認識 OK, Google

    Play music OK, play music with Spotify
  75. Drivemodeの連続音声認識 “Yo Drivemode”を拾う 連続音声認識 SpeechRecognizer startListening() Yo, Drivemode Navigate to

    Gas Station Starting navigation... “Yo Drivemode”を拾う 連続音声認識 認識結果から諸々の処理
  76. Drivemodeの連続音声認識 “Yo Drivemode”を拾う 連続音声認識 “Yo Drivemode”を拾う 連続音声認識 How to implement?

  77. Pocketsphinx

  78. What is Pocketsphinx? オフラインで認識可能 音響モデル・言語モデルは限られている(日本語はない) キーワード定義が可能 実環境で利用可能 http://cmusphinx.sourceforge.net/

  79. What is Pocketsphinx? オフラインで認識可能 音響モデル・言語モデルは限られている(日本語はない) キーワード定義が可能 実環境で利用可能 http://cmusphinx.sourceforge.net/ 連続音声認識とオンライン認識処理は相性が悪い

  80. What is Pocketsphinx? オフラインで認識可能 音響モデル・言語モデルは限られている(日本語はない) キーワード定義が可能 実環境で利用可能 http://cmusphinx.sourceforge.net/ 日本語を使いたい場合は自分でモデルを作成する必要がある 英語でもwordと読み方を定義することは可能

  81. What is Pocketsphinx? オフラインで認識可能 音響モデル・言語モデルは限られている(日本語はない) キーワード定義が可能 実環境で利用可能 http://cmusphinx.sourceforge.net/ OK, Googleのような使い方ができる

    造語も使える
  82. What is Pocketsphinx? オフラインで認識可能 音響モデル・言語モデルは限られている(日本語はない) キーワード定義が可能 実環境で利用可能 http://cmusphinx.sourceforge.net/ 環境雑音の抑圧性能が優秀 (Juliusは自前で雑音抑圧しなければならない)

  83. How to use Pocketsphinx? 連続音声認識でインコアプリを作ろう http://qiita.com/KAKKA/items/1cbaa4adaf06b6439f2c

  84. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-demo PocketSphinxActivity.java

  85. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-demo PocketSphinxActivity.java

  86. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo PocketSphinxActivity.java setAcousticModel()では音響モデルを指定 このデモアプリでは英語の音響モデルがデフォルトで入っている

  87. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo PocketSphinxActivity.java 辞書をセット Cmudict-en-us.dictをみると英語の巨大な辞書ファイルが見られる

    要件次第でここを削って必要な分だけ定義し、容量を減らす
  88. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo PocketSphinxActivity.java 人間の声を検出したらそれをファイルとしてガンガン保存していくようになる。 ほぼデバッグ用?

  89. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo PocketSphinxActivity.java KeyPhraseSearchモード(後述)における検出閾値をセット 小さいほどよく検出するが、誤検出が多くなる。

    1e+60から1e-60くらいまでセット可能
  90. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo OK Googleのような特定のwordの音声認識モードを追加 setKeywordThresholdが適用される

    KEYPHRASEに好きなワードを設定すると、そのワードを検出できるようになる ただし、ワードは一つのみ
  91. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo menuGrammarで定義された複数ワードの検出を行う しかしmenuGrammarで定義されたワードを必ず一つ検出して返す 例:

    menu.gram public <item> = digits | forecast | phones; 「でぃ」といえば digitsが返る
  92. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-demo menuGrammarと同じ digits.gram <digit> =

    oh | zero | one | two | three | four | five | six | seven | eight | nine;
  93. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo keyPhraseSearchの複数wordバージョン menu.gram yo

    drivemode/1e-25/ ok google/1e-15/ hey siri/1e-10/ awesome droidkaigi/1e-60/
  94. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-demo 単語辞書ファイルに造語の追記もできる

  95. How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-demo 結果はpocketsphinxのRecognitionListerで受け取る

  96. Drivemodeの連続音声認識 “Yo Drivemode”を拾う 連続音声認識 SpeechRecognizer startListening() Yo, Drivemode Navigate to

    Gas Station Starting navigation... “Yo Drivemode”を拾う 連続音声認識 認識結果から諸々の処理 Pocketsphinx Googleアプリ
  97. Drivemodeの連続音声認識

  98. 問題点

  99. マイクは一人しか使えない Pocketsphinx SpeechRecognizer OK, Google Googleマップの SpeechRecognizer

  100. マイクは一人しか使えない SpeechRecognizer Pocketsphinx OK, Google Googleマップの SpeechRecognizer

  101. マイクは一人しか使えない Pocketsphinx SpeechRecognizer Pocketsphinx stop listening start listening

  102. マイクは一人しか使えない Pocketsphinx SpeechRecognizer stop listeningを 呼ばないといけない OK, Google OK, Google

    OK, Google OK, Google 5秒ごとにstartをtry
  103. マイクは一人しか使えない OK Google SpeechRecognizer OK Google OK Google OK Google

    Priorityが低いので勝手に stopしてくれる 5秒ごとにstartをtry
  104. 自分の声を拾っちゃう Pocketsphinx

  105. 自分の声を拾っちゃう Pocketsphinx Yo Drivemodeと言えば、ボイス コマンド認識がスタートします。 TTS

  106. 自分の声を拾っちゃう Pocketsphinx Yo Drivemodeと言えば、ボイス コマンド認識がスタートします。 TTS Yo Drivemodeを検出!

  107. プロセスがkillされちゃう Pocketsphinx On Service Service kill!!

  108. プロセスがkillされちゃう Pocketsphinx On Service App process プロセス分けて プロセス間通信で

  109. 最後に

  110. We are hiring! Android Engineer Data Scientist kakka@drivemode.com