Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20170310
Search
KAKKA
March 09, 2017
Technology
3
2.6k
20170310
2017/3/10 DroidKaigi 2017
「Androidで音声認識を使いこなす」
セッションの発表資料です。
KAKKA
March 09, 2017
Tweet
Share
More Decks by KAKKA
See All by KAKKA
みてねエンジニアリング組織の 変革と現在地、そして今後〜3本柱編〜
kakka
1
86
RSGT2021_シリコンバレースタートアップから日系大企業までの組織別DX
kakka
0
6k
20190208 DroidKaigi2019
kakka
3
1.6k
20180209 DroidKaigi2018 ActivityRecognition simulation
kakka
4
2.1k
Other Decks in Technology
See All in Technology
RubyのWebアプリケーションを50倍速くする方法 / How to Make a Ruby Web Application 50 Times Faster
hogelog
3
940
[FOSS4G 2024 Japan LT] LLMを使ってGISデータ解析を自動化したい!
nssv
1
210
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間
oracle4engineer
PRO
28
12k
【若手エンジニア応援LT会】ソフトウェアを学んできた私がインフラエンジニアを目指した理由
kazushi_ohata
0
140
信頼性に挑む中で拡張できる・得られる1人のスキルセットとは?
ken5scal
2
520
Shopifyアプリ開発における Shopifyの機能活用
sonatard
4
250
SREによる隣接領域への越境とその先の信頼性
shonansurvivors
2
510
Incident Response Practices: Waroom's Features and Future Challenges
rrreeeyyy
0
160
Security-JAWS【第35回】勉強会クラウドにおけるマルウェアやコンテンツ改ざんへの対策
4su_para
0
170
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
3.8k
OCI Vault 概要
oracle4engineer
PRO
0
9.7k
サイバーセキュリティと認知バイアス:対策の隙を埋める心理学的アプローチ
shumei_ito
0
380
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
How GitHub (no longer) Works
holman
310
140k
Docker and Python
trallard
40
3.1k
A Tale of Four Properties
chriscoyier
156
23k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
Rails Girls Zürich Keynote
gr2m
94
13k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Practical Orchestrator
shlominoach
186
10k
Happy Clients
brianwarren
98
6.7k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Transcript
Androidで音声認識を使いこなす DroidKaigi 2017 2017/03/10 14:20 - 14:50 KAKKA
対象者 ◦ Androidアプリ開発者 ◦ 音声認識に興味がある方
目次 AndroidのSpeech Recognizerについての詳細 • Androidで音声認識といえばこれという王道パターンを詳しく解説 • SpeechRecognizerのいろいろな使い方を解説 Androidで連続音声認識を使ってOK Googleみたいなものを作る方法 •
連続音声認識について解説 • AndroidでどうやってGoogle home, Alexa, Siriのような実装するか
自己紹介
KAKKA Company: Community: Twitter: Qiita: Github: Drivemode, Inc. ScrumMastersNight! KAKKA_Blog
KAKKA KAKKA
音声認識とは 人間の声を機械に認識させること こんにちは こんにちは!
音声認識使ってるアプリ
Drivemode 車運転者向けNo-Look UI 音声認識 目的地や連絡先の音声検索 LINEなどのメッセージに声だけ で返信 “Yo Drivemode”の声でボイス コマンド認識開始(英語)
Androidで音声認識 といえば?
android.speech.SpeechRecognizer
コンテキスト渡してインスタンス作成
リスナー登録して
成功した場合、結果はここに返ってきます
エラーだった場合はこちら
このIntentにいろんなオプション付与出来ます
音声認識スタート!
SpeechRecognizer List<String> recResult = results.getStringArrayList( SpeechRecognizer.RESULTS_RECOGNITION ) 認識結果はlistで返ってくる 信頼度が高い順
SpeechRecognizer float[] confidenceScores = results.getFloatArray( SpeechRecognizer.CONFIDENCE_SCORES ); 認識結果の信頼度も取得可能
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)
エラーの種類
Error? ERROR_NETWORK_TIMEOUT(1) ネットワークタイムアウトエラー ERROR_AUDIO(3) オーディオレコーディングエラー ERROR_CLIENT(5) 何かしらのクライアント側エラー ERROR_INSUFFICIENT_PERMISSIONS(9) パーミッションエラー ほとんどみかけない
Error? ERROR_NETWORK(2) ネットワークエラー。電波悪かったりとか ERROR_SERVER(4) 何かしらのサーバーエラー。モデルなしでオフラインで認識させようと したときにも。 ERROR_RECOGNIZER_BUSY(8) インスタンス複数生成してるなど設計に問題あり たまに見かける
Error? ERROR_SPEECH_TIMEOUT(6) 認識スタートしてから無言で終わったとき ERROR_NO_MATCH(7) 意味不明な言葉を喋ったとき 一番多い
Error? ERROR_SPEECH_TIMEOUT(6) 認識スタートしてから無言で終わったとき ERROR_NO_MATCH(7) 意味不明な言葉を喋ったとき 一番多いが 実環境に様々な雑音があるため、 SPEECH_TIMEOUTだからといってユーザーが何 も喋っていないと判断してはいけない
SpeechRecognizer他のやり方
StartActivityForResult()でも
StartActivityForResult()でも この場合このExtraは必須
StartActivityForResult()でも LANGUAGE_MODEL_WEB_SEARCH でgoogle検索結果画面に
StartActivityForResult()でも おなじみのstartActivityで認識開始
Googleアプリ
Googleアプリ依存 認識処理の実態はGoogleア プリ MIUIに注意 Googleアプリのアップデート によって挙動が変わることが ある com.google.android.googlequicksearchbox/ com.google.android.voicesearch.serviceapi.GoogleRecognitionService
Googleアプリ依存 例: Googleアプリが5から6になったとき
Googleアプリ依存 例: Googleアプリが5から6になったとき 音声認識開始から終了までの時間がかなり長く なった。 →現在はもとに戻ってる
Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは
Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは
Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは こんにちは
Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは こんにちは こんにちは
Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは こんにちは こんにちは こんにちは
Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは こんにちは こんにちは こんにちは
(もういいや)
Googleアプリ依存 例: Googleアプリが5から6になったとき start! complete! こんにちは こんにちは こんにちは こんにちは こんにちは
(もういいや) こんにちはこんにちはこんにちはこんにちはこんにちは
Googleアプリ依存 例: Googleアプリが5から6になったとき partialResultを使わないと使いものにならない
Googleアプリ依存 partialResults ? start! complete! こんにちは イェエエイ こんにちは ジャスティス onPartialResult
こんにちは イェ エエイ onPartialResult こんにちは イェ エエイ ジャス ティス onPartialResult onResult
Googleアプリ依存 例: 現在の最新版Googleアプリ デバイスがオフラインのとき、
Googleアプリ依存 例: 現在の最新版Googleアプリ デバイスがオフラインなどのとき、onError返って 来ない!!
Googleアプリ依存 例: 現在の最新版Googleアプリ start! 以降死ぬまで続く... ・・・ 10分 20分 30分 40分
50分 60分
Googleアプリ依存 例: 現在の最新版Googleアプリ start! 以降死ぬまで続く... ・・・ 10分 20分 30分 40分
50分 60分 Timeoutを設定しよう!
SpeechRecognizerの応用
オフライン音声認識
オフライン音声認識 Android Speech Recognizerは通常オンラインでgoogleのサーバー と通信して音声認識を行う Google 音声raw 認識結果
オフライン音声認識 実はオフラインでの音声認識も同様に対応されている デフォルトの設定 オンラインで認識するか、オフラインで認識するかが自動的に切り替えら れて認識される
オフライン音声認識 実はオフラインでの音声認識も同様に対応されている デフォルトの設定 オンラインで認識するか、オフラインで認識するかが自動的に切り替えら れて認識される インターネット繋がってるけど、速度めっちゃ遅い ↓ 認識精度めっちゃ悪い
オフライン音声認識 強制的にオフラインで認識させよう intent.putExtra( RecognizerIntent.EXTRA_PREFER_OFFLINE, true ) API level 23より
オフライン音声認識 オフラインで音声認識するためには当然デバイスにモデルデータが必要 Google 音声raw 認識結果 言語モデル 音響モデル 音声raw 認識結果
オフライン音声認識 Marshmallow 設定→言語と入力→Google音声入力→オフラインの音声認識 Nougat 設定→Google→検索→音声→オフラインの音声認識 音響・言語モデルのダウンロード可能 言語モデル 音響モデル
オフライン音声認識 このモデルなしで強制的にオフライン音声認識させた場合 かならず onError()でERROR_SERVERが返ってきて認識に失敗 コールバック何も返ってこない 言語モデル 音響モデル 最新のGoogleアプリ
多言語音声認識
多言語音声認識 intentにputExtraするだけ Language String is defined by BCP 47.
多言語音声認識 英語を設定して日本語を喋ると・・・ Drivemodeは超安全、超便利! Drivemod is really safe and really useful!
Driving mode Auto and then to Bandy ドラえもんエイジリアリゼーションリアルユース4 日本語を設定して英語を喋ると・・・
Listen時間の延長
Listen時間は長くできる? EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS 今は動いていない!!
ボイスコマンド音声認識
ボイスコマンドとして利用 メッセージ届きました。読 み上げる? listen! 「DroidKaigiってなんな の?」from 槇原敬之 音声認識
ボイスコマンドとして利用 listen! 音声認識 辞書 listen message play
ボイスコマンドとして利用 雑音 result = [ risk, list, less, less than,
list of, risk of, list for, is ] listen 雑音環境下では短い1つの単語は認識しづらい
ボイスコマンドとして利用 listen listen to message reply reply to message send
send message navigation start navigation 不自然ではない程度に認識させる文章を長くする。 結局人間が解釈しやすいレベルであればOK
連続音声認識
SpeechRecognizer Android Speech Recognizerは認識スタートと認識完了が短いライフ サイクル イェエエエエエエエ イ!!!!! 認識スタート マイクON 認識完了
マイクOFF 認識中
SpeechRecognizer 認識スタート マイクON 認識完了 マイクOFF 認識中 ユーザーがボタンをタップするなど、なにかしらのイベントによりスタートする
連続音声認識 認識スタート マイクON listening...
連続音声認識 listening...
連続音声認識 やっほー やっほー トイレ行きたいなー トイレ行きたい な― listening...
連続音声認識 10分後... すっきりしたよー! すっきりしたよー listening...
連続音声認識 マイクOFF listening...
連続音声認識が日常に OK, Google Hey Siri Hey Alexa Hey Google
連続音声認識と通常の音声認識 “OK, Google”を拾う 連続音声認識 “OK, Google”を拾う 連続音声認識 通常の音声認識 OK, Google
Play music OK, play music with Spotify
Drivemodeの連続音声認識 “Yo Drivemode”を拾う 連続音声認識 SpeechRecognizer startListening() Yo, Drivemode Navigate to
Gas Station Starting navigation... “Yo Drivemode”を拾う 連続音声認識 認識結果から諸々の処理
Drivemodeの連続音声認識 “Yo Drivemode”を拾う 連続音声認識 “Yo Drivemode”を拾う 連続音声認識 How to implement?
Pocketsphinx
What is Pocketsphinx? オフラインで認識可能 音響モデル・言語モデルは限られている(日本語はない) キーワード定義が可能 実環境で利用可能 http://cmusphinx.sourceforge.net/
What is Pocketsphinx? オフラインで認識可能 音響モデル・言語モデルは限られている(日本語はない) キーワード定義が可能 実環境で利用可能 http://cmusphinx.sourceforge.net/ 連続音声認識とオンライン認識処理は相性が悪い
What is Pocketsphinx? オフラインで認識可能 音響モデル・言語モデルは限られている(日本語はない) キーワード定義が可能 実環境で利用可能 http://cmusphinx.sourceforge.net/ 日本語を使いたい場合は自分でモデルを作成する必要がある 英語でもwordと読み方を定義することは可能
What is Pocketsphinx? オフラインで認識可能 音響モデル・言語モデルは限られている(日本語はない) キーワード定義が可能 実環境で利用可能 http://cmusphinx.sourceforge.net/ OK, Googleのような使い方ができる
造語も使える
What is Pocketsphinx? オフラインで認識可能 音響モデル・言語モデルは限られている(日本語はない) キーワード定義が可能 実環境で利用可能 http://cmusphinx.sourceforge.net/ 環境雑音の抑圧性能が優秀 (Juliusは自前で雑音抑圧しなければならない)
How to use Pocketsphinx? 連続音声認識でインコアプリを作ろう http://qiita.com/KAKKA/items/1cbaa4adaf06b6439f2c
How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-demo PocketSphinxActivity.java
How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-demo PocketSphinxActivity.java
How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo PocketSphinxActivity.java setAcousticModel()では音響モデルを指定 このデモアプリでは英語の音響モデルがデフォルトで入っている
How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo PocketSphinxActivity.java 辞書をセット Cmudict-en-us.dictをみると英語の巨大な辞書ファイルが見られる
要件次第でここを削って必要な分だけ定義し、容量を減らす
How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo PocketSphinxActivity.java 人間の声を検出したらそれをファイルとしてガンガン保存していくようになる。 ほぼデバッグ用?
How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo PocketSphinxActivity.java KeyPhraseSearchモード(後述)における検出閾値をセット 小さいほどよく検出するが、誤検出が多くなる。
1e+60から1e-60くらいまでセット可能
How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo OK Googleのような特定のwordの音声認識モードを追加 setKeywordThresholdが適用される
KEYPHRASEに好きなワードを設定すると、そのワードを検出できるようになる ただし、ワードは一つのみ
How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-de mo menuGrammarで定義された複数ワードの検出を行う しかしmenuGrammarで定義されたワードを必ず一つ検出して返す 例:
menu.gram public <item> = digits | forecast | phones; 「でぃ」といえば digitsが返る
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;
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/
How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-demo 単語辞書ファイルに造語の追記もできる
How to use Pocketsphinx? 公式デモアプリ https://github.com/cmusphinx/pocketsphinx-android-demo 結果はpocketsphinxのRecognitionListerで受け取る
Drivemodeの連続音声認識 “Yo Drivemode”を拾う 連続音声認識 SpeechRecognizer startListening() Yo, Drivemode Navigate to
Gas Station Starting navigation... “Yo Drivemode”を拾う 連続音声認識 認識結果から諸々の処理 Pocketsphinx Googleアプリ
Drivemodeの連続音声認識
問題点
マイクは一人しか使えない Pocketsphinx SpeechRecognizer OK, Google Googleマップの SpeechRecognizer
マイクは一人しか使えない SpeechRecognizer Pocketsphinx OK, Google Googleマップの SpeechRecognizer
マイクは一人しか使えない Pocketsphinx SpeechRecognizer Pocketsphinx stop listening start listening
マイクは一人しか使えない Pocketsphinx SpeechRecognizer stop listeningを 呼ばないといけない OK, Google OK, Google
OK, Google OK, Google 5秒ごとにstartをtry
マイクは一人しか使えない OK Google SpeechRecognizer OK Google OK Google OK Google
Priorityが低いので勝手に stopしてくれる 5秒ごとにstartをtry
自分の声を拾っちゃう Pocketsphinx
自分の声を拾っちゃう Pocketsphinx Yo Drivemodeと言えば、ボイス コマンド認識がスタートします。 TTS
自分の声を拾っちゃう Pocketsphinx Yo Drivemodeと言えば、ボイス コマンド認識がスタートします。 TTS Yo Drivemodeを検出!
プロセスがkillされちゃう Pocketsphinx On Service Service kill!!
プロセスがkillされちゃう Pocketsphinx On Service App process プロセス分けて プロセス間通信で
最後に
We are hiring! Android Engineer Data Scientist
[email protected]