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.9k
20170310
2017/3/10 DroidKaigi 2017
「Androidで音声認識を使いこなす」
セッションの発表資料です。
KAKKA
March 09, 2017
Tweet
Share
More Decks by KAKKA
See All by KAKKA
MIXIが挑む 自律的組織と自律型 AI エージェントの土台となる透明性
kakka
4
14k
技育祭2025春 MIXI 世界ユーザー2500万⼈突破!みてねを⽀ えるエンジニアリング組織とカルチャー
kakka
1
260
MIXIが内製した「3日間16時間のアジャイル研修」こだわりの中身と背景
kakka
3
1.8k
みてねエンジニアリング組織の 変革と現在地、そして今後〜3本柱編〜
kakka
1
170
RSGT2021_シリコンバレースタートアップから日系大企業までの組織別DX
kakka
0
6.2k
20190208 DroidKaigi2019
kakka
3
1.8k
20180209 DroidKaigi2018 ActivityRecognition simulation
kakka
4
2.3k
Other Decks in Technology
See All in Technology
SREじゃなかった僕らがenablingを通じて「SRE実践者」になるまでのリアル / SRE Kaigi 2026
aeonpeople
6
1.6k
レガシー共有バッチ基盤への挑戦 - SREドリブンなリアーキテクチャリングの取り組み
tatsukoni
0
170
SREが向き合う大規模リアーキテクチャ 〜信頼性とアジリティの両立〜
zepprix
0
350
分析画面のクリック操作をそのままコード化 ! エンジニアとビジネスユーザーが共存するAI-ReadyなBI基盤
ikumi
0
130
仕様書駆動AI開発の実践: Issue→Skill→PRテンプレで 再現性を作る
knishioka
2
140
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
1
250
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
10
73k
AI時代、1年目エンジニアの悩み
jin4
1
150
オープンウェイトのLLMリランカーを契約書で評価する / searchtechjp
sansan_randd
3
570
Embedded SREの終わりを設計する 「なんとなく」から計画的な自立支援へ
sansantech
PRO
2
1.6k
小さく始めるBCP ― 多プロダクト環境で始める最初の一歩
kekke_n
0
270
Mosaic AI Gatewayでコーディングエージェントを配るための運用Tips / JEDAI 2026 新春 Meetup! AIコーディング特集
genda
0
140
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Code Reviewing Like a Champion
maltzj
527
40k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
3.9k
Exploring anti-patterns in Rails
aemeredith
2
240
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
320
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
170
Ruling the World: When Life Gets Gamed
codingconduct
0
130
Rails Girls Zürich Keynote
gr2m
96
14k
Bash Introduction
62gerente
615
210k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
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]