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

20190208 DroidKaigi2019

KAKKA
February 08, 2019

20190208 DroidKaigi2019

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

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

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

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

KAKKA

February 08, 2019
Tweet

More Decks by KAKKA

Other Decks in Technology

Transcript

  1. シンプルかつ単一要件の場合 音声認識 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));
  2. シンプルかつ単一要件の場合 キーワード辞書 String[] dictionary = {"押す", "押せ", "押し", "雄", "推し"};

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

    for (String keyword : dictionary) { if (recognitionResult.contains(keyword)) { return true; } } 押す アプリ内で完結
  4. { "queryText": "amazon musicで陰陽座 を再生", "action": "音楽再生", "parameters": { "MusicAppName":

    "amazon music", "ArtistName": "陰陽座" }, … } Dialogflowの使い方
  5. 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の使い方
  6. 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の使い方
  7. Android 自社サーバー (1) get token (2) authentication (3) return token

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

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

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

    (4) detect intent (5) return result (6) return result V2 Dialogflowの使い方
  11. App Launch 音声認識率の改善結果 Navigation Play Music Send Message Place a

    Call キーワード辞書マッチングしてた頃 VS Dialogflowで学習させたあと
  12. 宣伝: Androidエンジニア 1人募集中 • Drivemode, Inc. ◦ 車運転者向けのスマホアプリ提供 ◦ 世界中にユーザーがいるが、アメリカ・ファースト

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