Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 KAKKA DroidKaigi 2017 音声認識と連続音声認識について DroidKaigi 2018 ActivityRecognitionについて

Slide 3

Slide 3 text

目次 ● ボイスコマンド音声認識の実現方法 ○ シンプルかつ単一要件の場合 ○ 複雑または複数要件の場合 ● Dialogflow ○ 概要 ○ 使い方 ● 音声認識率改善結果について

Slide 4

Slide 4 text

ボイスコマンド音声認識の実現方法

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

シンプルかつ単一要件の場合 音声認識 SpeechRecognizer recognizer = SpeechRecognizer.createSpeechRecognizer(application); recognizer.setRecognitionListener(new RecognitionListener() { ... @Override public void onResults(Bundle results) { List recognitionResultList = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); } ... }); recognizer.startListening(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH));

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

複雑または複数要件の場合 音楽再生したい 注文したい 教えてほしい 喋りたい 案内してほしい メッセージ送りたい 電話かけたい

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Dialogflow

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Dialogflowの使い方

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Intent Entity Agent Dialogflowの使い方

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

動作確認 Dialogflowの使い方

Slide 33

Slide 33 text

Training phrases Dialogflowの使い方

Slide 34

Slide 34 text

{ "queryText": "amazon musicで陰陽座 を再生", "action": "音楽再生", "parameters": { "MusicAppName": "amazon music", "ArtistName": "陰陽座" }, … } Dialogflowの使い方

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

{ "queryText": "陰陽座をSpotifyで再生", "action": "音楽再生", "parameters": { "MusicAppName": "Spotify", "ArtistName": ["陰陽座"] }, … } Dialogflowの使い方

Slide 37

Slide 37 text

Android Dialogflowの使い方 Androidから使うには?

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Android SpeechRecognizer “音楽を再生” { "queryText": "音楽を再生", "action": "音楽再生", "parameters": { "MusicAppName": "", "ArtistName": "" }, … } Dialogflowの使い方

Slide 41

Slide 41 text

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の使い方

Slide 42

Slide 42 text

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の使い方

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

Intent Entity Agent Dialogflowの使い方

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

Spotifyでマイケル・ジャクソンを再生 PlayerName MusicArtistName Spotify Amazon Music Google Play Music Apple Music Entity Dialogflowの使い方

Slide 58

Slide 58 text

Entityの画面 Dialogflowの使い方

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

System Entity Dialogflowの使い方

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

Dialogflowの使い方

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

アノテーション作業

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

App Launch 音声認識率の改善結果 Navigation Play Music Send Message Place a Call キーワード辞書マッチングしてた頃 VS Dialogflowで学習させたあと

Slide 90

Slide 90 text

No match率の変化 音声認識率の改善結果 32.6% 17.3%

Slide 91

Slide 91 text

まとめ(1/2) ● ボイスコマンドの要件がシンプルな場合はDialogflowを使う までもない ● ボイスコマンドの要件が複雑な場合、自然言語処理が必要。 Dialogflowを使うと便利 ● Dialogflowの基本はIntentとEntity ○ Intentは要件を判別、パラメータ検出 ○ Entityはパラメータの種類定義

Slide 92

Slide 92 text

まとめ(2/2) ● ボイスコマンド音声認識率改善のためにDialogflowが活用で きる ○ 予めユーザーにできることを伝える ○ データ集めからスタート ○ アノテーション作業は地道にがんばる ○ 音声認識の揺れを考慮し、本当にユーザーがやりたいこ とを考えてアノテーション作業を行う

Slide 93

Slide 93 text

宣伝: Androidエンジニア 1人募集中 ● Drivemode, Inc. ○ 車運転者向けのスマホアプリ提供 ○ 世界中にユーザーがいるが、アメリカ・ファースト ○ アーリーステージ(シリーズA)のスタートアップ ○ シリコンバレーの会社だけど、東京支社もあり ○ 公用語は英語、英語必須だけどやる気あればOK ○ 多国籍企業で英語力上がります ○ サーバーエンジニアも募集中 応募方法 →LinkedInかIndeedから応募か、私に連絡!(Twitterでも何でも)