Save 37% off PRO during our Black Friday Sale! »

20190208 DroidKaigi2019

56d7bcf9b5071512c65e753a1619987a?s=47 KAKKA
February 08, 2019

20190208 DroidKaigi2019

Dialogflowによる自然言語処理(NLP)を用いたボイスコマンド音声認識の精度向上

近年、自然言語処理を用いた音声アシスタントやチャットBOTサービスが普及してきている。AndroidにおけるSpeechRecognizerも非常に認識精度が高い。
しかしこのような対話をベースとしたサービスは利用環境が制限される。例えば劣悪な環境雑音下での音声アシスタントとの会話や、文字自由に入力できないときのチャットBOTサービスはかなり使いづらい。対話が複数回必要になると更に難易度が増す。AndroidにおけるSpeechRecognizerが優秀であっても途中でユーザーがドロップする確率が高くなってしまう。

ユーザーにとって究極にフレンドリーなサービスは、何も言うことなく、何も文字を打つことなく正確に命令をすることであるが、現状では非常に実現難易度が高い。
よって今回は、ユーザーの仕事をなるべく減らし、かつ正確に命令をできる状態を目指す。

本セッションでは、最初にDialogflowやAndroidのSpeechRecognizerの基本を極めて簡単に説明する。次にユーザーが特定の環境で、なるべくユーザーの仕事を減らしながら特定の目的を果たすために、AndroidのSpeechRecognizerとDialogflowを組み合わせて用いることでボイスコマンド音声認識の精度向上を試みる。そしてその具体的な手法及び結果を示す。

56d7bcf9b5071512c65e753a1619987a?s=128

KAKKA

February 08, 2019
Tweet

Transcript

  1. Dialogflowによる自然言語処理 (NLP)を用いたボイスコマンド音声 認識の精度向上 DroidKaigi 2019 2019/02/08 10:30-11:00 @Room1 Drivemode, Inc.

    KAKKA (Nobuhisa Hirata) @KAKKA_Blog
  2. 自己紹介 KAKKA DroidKaigi 2017 音声認識と連続音声認識について DroidKaigi 2018 ActivityRecognitionについて

  3. 目次 • ボイスコマンド音声認識の実現方法 ◦ シンプルかつ単一要件の場合 ◦ 複雑または複数要件の場合 • Dialogflow ◦

    概要 ◦ 使い方 • 音声認識率改善結果について
  4. ボイスコマンド音声認識の実現方法

  5. シンプルかつ単一要件の場合

  6. シンプルかつ単一要件の場合 押 す

  7. シンプルかつ単一要件の場合 私は押すことが できます。 ボタン押せるヤツ

  8. シンプルかつ単一要件の場合 押して ボタン押せるヤツ

  9. シンプルかつ単一要件の場合 ピンポーン! ボタン押せるヤツ

  10. シンプルかつ単一要件の場合 ボタン押せるヤツ 音声認識 キーワード辞書 押す能力

  11. シンプルかつ単一要件の場合 音声認識 SpeechRecognizer recognizer = SpeechRecognizer.createSpeechRecognizer(application); recognizer.setRecognitionListener(new RecognitionListener() { ...

    @Override public void onResults(Bundle results) { List<String> recognitionResultList = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); } ... }); recognizer.startListening(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH));
  12. シンプルかつ単一要件の場合 キーワード辞書 String[] dictionary = {"押す", "押せ", "押し", "雄", "推し"};

    for (String keyword : dictionary) { if (recognitionResult.contains(keyword)) { return true; } } 押す
  13. シンプルかつ単一要件の場合 キーワード辞書 String[] dictionary = {"押す", "押せ", "押し", "雄", "推し"};

    for (String keyword : dictionary) { if (recognitionResult.contains(keyword)) { return true; } } 押す アプリ内で完結
  14. 複雑または複数要件の場合 音楽再生したい 注文したい 教えてほしい 喋りたい 案内してほしい メッセージ送りたい 電話かけたい

  15. 複雑または複数要件の場合 私はいろいろでき ます。 いろいろできるヤツ

  16. 複雑または複数要件の場合 よかろう! いろいろできるヤツ 東京駅まで連れ てって〜 ヘビメタの音楽を 再生 母に電話かけて Androidって何?

  17. 複雑または複数要件の場合 いろいろできるヤツ 音声認識 自然言語処理 いろんな実行能力

  18. 複雑または複数要件の場合 いろいろできるヤツ 音声認識 自然言語処理 いろんな実行能力 Dialogflowを使う

  19. Dialogflow

  20. Dialogflowの概要 教師データを用いた学習により、自然言語処理を行う 9時に東京に 案内して 要件: 案内 時間: 9時 目的地: 東京

  21. Dialogflowの概要 9時に東京に案内して 時間 場所 学習データ

  22. Dialogflowの概要 9時に東京に案内して 時間 場所 学習データ 10時に岐阜に案内して 10時に岐阜に案内します

  23. Dialogflowの概要 いつ、どこに、案内する なかったら今 で良い なかったら 案内できない。 必須パラメータ 命令に必要な情報の管理も可能

  24. Dialogflowの概要 9時に東京に案内して 学習データ 案内して どこに? 滋賀県 (今から)滋賀県に案内します 必須パラメータ

  25. Dialogflowの使い方

  26. Dialogflowの使い方 Intent Entity Agent 要件を判別 パラメータ検出 パラメータの 種類定義

  27. Intent Entity Agent Dialogflowの使い方

  28. Intentの設定画面 Training phrases Dialogflowの使い方 学習させる文章を入力

  29. Dialogflowの使い方 検出したいパラメータを定義

  30. 必須パラメータにできる Dialogflowの使い方

  31. リスト形式のパラメータに できる Dialogflowの使い方

  32. 動作確認 Dialogflowの使い方

  33. Training phrases Dialogflowの使い方

  34. { "queryText": "amazon musicで陰陽座 を再生", "action": "音楽再生", "parameters": { "MusicAppName":

    "amazon music", "ArtistName": "陰陽座" }, … } Dialogflowの使い方
  35. Intent リスト形式のパラメータに できる Dialogflowの使い方

  36. { "queryText": "陰陽座をSpotifyで再生", "action": "音楽再生", "parameters": { "MusicAppName": "Spotify", "ArtistName":

    ["陰陽座"] }, … } Dialogflowの使い方
  37. Android Dialogflowの使い方 Androidから使うには?

  38. Android SpeechRecognizer “音楽を再生” Dialogflowの使い方

  39. Android SpeechRecognizer “音楽を再生” Dialogflowの使い方

  40. Android SpeechRecognizer “音楽を再生” { "queryText": "音楽を再生", "action": "音楽再生", "parameters": {

    "MusicAppName": "", "ArtistName": "" }, … } Dialogflowの使い方
  41. Android AIConfiguration config = new AIConfiguration( DIALOG_FLOW_TOKEN, ai.api.AIConfiguration.SupportedLanguages.English, AIConfiguration.RecognitionEngine.System );

    aiDataService = new AIDataService(application, config); AIRequest aiRequest = new AIRequest(); aiRequest.setQuery(recognizedText); aiRequest.setResetContexts(resetContext); AIResponse response = aiDataService.request(aiRequest); Dialogflowの使い方
  42. Android AIConfiguration config = new AIConfiguration( DIALOG_FLOW_TOKEN, ai.api.AIConfiguration.SupportedLanguages.English, AIConfiguration.RecognitionEngine.System );

    aiDataService = new AIDataService(application, config); AIRequest aiRequest = new AIRequest(); aiRequest.setQuery(recognizedText); aiRequest.setResetContexts(resetContext); AIResponse response = aiDataService.request(aiRequest); Dialogflowの使い方
  43. Android 自社サーバー (1) get token V2 Dialogflowの使い方

  44. Android 自社サーバー (1) get token (2) authentication V2 Dialogflowの使い方

  45. Android 自社サーバー (1) get token (2) authentication (3) return token

    V2 Dialogflowの使い方
  46. Android 自社サーバー (1) get token (2) authentication (3) return token

    (4) return token V2 Dialogflowの使い方
  47. Android 自社サーバー (1) get token (2) authentication (3) return token

    (4) return token (5) detect intent V2 Dialogflowの使い方
  48. Android 自社サーバー (1) get token (2) authentication (3) return token

    (4) return token (5) detect intent (6) return result V2 Dialogflowの使い方
  49. Android 自社サーバー (1) detect intent V2 Dialogflowの使い方

  50. Android 自社サーバー (1) detect intent (2) authentication V2 Dialogflowの使い方

  51. Android 自社サーバー (1) detect intent (2) authentication (3) return token

    V2 Dialogflowの使い方
  52. Android 自社サーバー (1) detect intent (2) authentication (3) return token

    (4) detect intent V2 Dialogflowの使い方
  53. Android 自社サーバー (1) detect intent (2) authentication (3) return token

    (4) detect intent (5) return result V2 Dialogflowの使い方
  54. Android 自社サーバー (1) detect intent (2) authentication (3) return token

    (4) detect intent (5) return result (6) return result V2 Dialogflowの使い方
  55. Intent Entity Agent Dialogflowの使い方

  56. Entity Intentで検出するパラメータのうち、決まった候補(Entity)の中 から検出するために用いる Spotifyでマイケル・ジャクソンを再生 PlayerName MusicArtistName Dialogflowの使い方

  57. Spotifyでマイケル・ジャクソンを再生 PlayerName MusicArtistName Spotify Amazon Music Google Play Music Apple

    Music Entity Dialogflowの使い方
  58. Entityの画面 Dialogflowの使い方

  59. Dialogflowの使い方 Intentの画面に戻る

  60. Dialogflowの使い方 Intentの画面に戻る

  61. Dialogflowの使い方 Intentの画面に戻る 特定のMusicAppNameのみパラメータとして検出

  62. System Entity デフォルトで様々なEntityが定義されている。 Dialogflowの使い方

  63. DestinationEntityを新規作成 住所検出 city name検出 観光スポット検出 Dialogflowの使い方

  64. Intentの設定画面にもどる Dialogflowの使い方

  65. System Entity Dialogflowの使い方

  66. System Entityにより住所を検出 Dialogflowの使い方

  67. System Entityによって検出されず Dialogflowの使い方

  68. Entityに追加してやる Dialogflowの使い方

  69. DestinationEntityによって検出 Dialogflowの使い方

  70. Entityから消して、Training phrasesに追加すると? Dialogflowの使い方

  71. Entityから消して、Training phrasesに追加すると? Dialogflowの使い方

  72. Entityから消して、Training phrasesに追加すると? 検出されない! という仕様らしい Dialogflowの使い方

  73. Entityに固有名詞をすべて定義する のは難しい Dialogflowの使い方

  74. 「スターバックス」のような固有名詞を検出できるSystem Entity はあるのか? Dialogflowの使い方 ない!

  75. System Entity: @sys.any なんでも検出できるEntity Dialogflowの使い方

  76. System Entity: @sys.any Dialogflowの使い方

  77. Dialogflowの使い方

  78. System Entity: @sys.any ↓ なんでも検出できるように Dialogflowの使い方

  79. ボイスコマンド音声認識率の改善

  80. 音声認識率の改善 →音声認識部分はAndroidのSpeechReocgnizerに頼る →正しいintent検出の精度を上げる 音声認識率の改善

  81. いろいろできるマンは何ができる? 私はいろいろでき ます。 いろいろできるヤツ

  82. ユーザーはなんでも聞いてしまう いや、 無理っす。 いろいろできるヤツ 日本の将来は? あの娘の好きな人は? 俺、実は既婚者なんだ トリプルアクセルして 100mを10秒台で走って コード書いて

  83. 自信を持ってできることを明確に 私はいろいろでき ます。 いろいろできるヤツ ナビゲーションと 音楽再生と 電話発信と メール送信

  84. 私はいろいろでき ます。 いろいろできるマン ナビゲーションと 音楽再生と 電話発信と メール送信 得意なことをユーザーに伝える 自信を持ってできることを明確に

  85. まずは学習データ集め 最初はユーザーがなんと命令するかというデータがないの で、自分で頑張ってTraining phrasesに定義する。

  86. アノテーション作業

  87. アノテーション作業 DialogflowのTrainingページだとやりづらい 自分で解析ツール作るのがいいかも

  88. 音声認識の揺れを吸収 音楽を再生 “雲鶴を再製” “雲鶴を再製” を学習 アノテーション作業においてユーザーの意図を読み取ることが 重要

  89. App Launch 音声認識率の改善結果 Navigation Play Music Send Message Place a

    Call キーワード辞書マッチングしてた頃 VS Dialogflowで学習させたあと
  90. No match率の変化 音声認識率の改善結果 32.6% 17.3%

  91. まとめ(1/2) • ボイスコマンドの要件がシンプルな場合はDialogflowを使う までもない • ボイスコマンドの要件が複雑な場合、自然言語処理が必要。 Dialogflowを使うと便利 • Dialogflowの基本はIntentとEntity ◦

    Intentは要件を判別、パラメータ検出 ◦ Entityはパラメータの種類定義
  92. まとめ(2/2) • ボイスコマンド音声認識率改善のためにDialogflowが活用で きる ◦ 予めユーザーにできることを伝える ◦ データ集めからスタート ◦ アノテーション作業は地道にがんばる

    ◦ 音声認識の揺れを考慮し、本当にユーザーがやりたいこ とを考えてアノテーション作業を行う
  93. 宣伝: Androidエンジニア 1人募集中 • Drivemode, Inc. ◦ 車運転者向けのスマホアプリ提供 ◦ 世界中にユーザーがいるが、アメリカ・ファースト

    ◦ アーリーステージ(シリーズA)のスタートアップ ◦ シリコンバレーの会社だけど、東京支社もあり ◦ 公用語は英語、英語必須だけどやる気あればOK ◦ 多国籍企業で英語力上がります ◦ サーバーエンジニアも募集中 応募方法 →LinkedInかIndeedから応募か、私に連絡!(Twitterでも何でも)