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

20170310

KAKKA
March 09, 2017

 20170310

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

KAKKA

March 09, 2017
Tweet

More Decks by KAKKA

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. 自己紹介

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. android.speech.SpeechRecognizer

    View Slide

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

    View Slide

  12. リスナー登録して

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. 音声認識スタート!

    View Slide

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

    View Slide

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

    View Slide

  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)
    エラーの種類

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. SpeechRecognizer他のやり方

    View Slide

  25. StartActivityForResult()でも

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. Googleアプリ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  40. Googleアプリ依存
    例: Googleアプリが5から6になったとき
    partialResultを使わないと使いものにならない

    View Slide

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

    View Slide

  42. Googleアプリ依存
    例: 現在の最新版Googleアプリ
    デバイスがオフラインのとき、

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  46. SpeechRecognizerの応用

    View Slide

  47. オフライン音声認識

    View Slide

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

    View Slide

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

    View Slide

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

    認識精度めっちゃ悪い

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  55. 多言語音声認識

    View Slide

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

    View Slide

  57. 多言語音声認識
    英語を設定して日本語を喋ると・・・
    Drivemodeは超安全、超便利!
    Drivemod is really safe and really useful!
    Driving mode Auto and then to Bandy
    ドラえもんエイジリアリゼーションリアルユース4
    日本語を設定して英語を喋ると・・・

    View Slide

  58. Listen時間の延長

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  63. ボイスコマンドとして利用
    雑音
    result = [
    risk,
    list,
    less,
    less than,
    list of,
    risk of,
    list for,
    is
    ]
    listen
    雑音環境下では短い1つの単語は認識しづらい

    View Slide

  64. ボイスコマンドとして利用
    listen listen to
    message
    reply reply to
    message
    send send
    message
    navigation start
    navigation
    不自然ではない程度に認識させる文章を長くする。
    結局人間が解釈しやすいレベルであればOK

    View Slide

  65. 連続音声認識

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  75. Drivemodeの連続音声認識
    “Yo Drivemode”を拾う
    連続音声認識
    SpeechRecognizer
    startListening()
    Yo, Drivemode
    Navigate to Gas
    Station
    Starting navigation...
    “Yo Drivemode”を拾う
    連続音声認識
    認識結果から諸々の処理

    View Slide

  76. Drivemodeの連続音声認識
    “Yo Drivemode”を拾う
    連続音声認識
    “Yo Drivemode”を拾う
    連続音声認識
    How to implement?

    View Slide

  77. Pocketsphinx

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  87. How to use Pocketsphinx?
    公式デモアプリ
    https://github.com/cmusphinx/pocketsphinx-android-de
    mo
    PocketSphinxActivity.java
    辞書をセット
    Cmudict-en-us.dictをみると英語の巨大な辞書ファイルが見られる
    要件次第でここを削って必要な分だけ定義し、容量を減らす

    View Slide

  88. How to use Pocketsphinx?
    公式デモアプリ
    https://github.com/cmusphinx/pocketsphinx-android-de
    mo
    PocketSphinxActivity.java
    人間の声を検出したらそれをファイルとしてガンガン保存していくようになる。
    ほぼデバッグ用?

    View Slide

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

    View Slide

  90. How to use Pocketsphinx?
    公式デモアプリ
    https://github.com/cmusphinx/pocketsphinx-android-de
    mo
    OK Googleのような特定のwordの音声認識モードを追加
    setKeywordThresholdが適用される
    KEYPHRASEに好きなワードを設定すると、そのワードを検出できるようになる
    ただし、ワードは一つのみ

    View Slide

  91. How to use Pocketsphinx?
    公式デモアプリ
    https://github.com/cmusphinx/pocketsphinx-android-de
    mo
    menuGrammarで定義された複数ワードの検出を行う
    しかしmenuGrammarで定義されたワードを必ず一つ検出して返す
    例: menu.gram
    public = digits | forecast | phones;
    「でぃ」といえば digitsが返る

    View Slide

  92. How to use Pocketsphinx?
    公式デモアプリ
    https://github.com/cmusphinx/pocketsphinx-android-demo
    menuGrammarと同じ
    digits.gram
    = oh | zero | one | two | three | four | five | six | seven | eight | nine;

    View Slide

  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/

    View Slide

  94. How to use Pocketsphinx?
    公式デモアプリ
    https://github.com/cmusphinx/pocketsphinx-android-demo
    単語辞書ファイルに造語の追記もできる

    View Slide

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

    View Slide

  96. Drivemodeの連続音声認識
    “Yo Drivemode”を拾う
    連続音声認識
    SpeechRecognizer
    startListening()
    Yo, Drivemode
    Navigate to Gas
    Station
    Starting navigation...
    “Yo Drivemode”を拾う
    連続音声認識
    認識結果から諸々の処理
    Pocketsphinx
    Googleアプリ

    View Slide

  97. Drivemodeの連続音声認識

    View Slide

  98. 問題点

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  103. マイクは一人しか使えない
    OK Google
    SpeechRecognizer
    OK Google
    OK Google
    OK Google
    Priorityが低いので勝手に
    stopしてくれる
    5秒ごとにstartをtry

    View Slide

  104. 自分の声を拾っちゃう
    Pocketsphinx

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  109. 最後に

    View Slide

  110. We are hiring!
    Android Engineer
    Data Scientist
    [email protected]

    View Slide