E.D.E.N.という、わたし専用のAIアシスタントを作っています。従量課金のAPIを増やさず、手元のPCで動かすことを条件にしているプロジェクトです。
今回やりたかったことは3つです。
1. 起動したら、ボタンを押さずにすぐ会話できる
2. テレビの声には反応しない
3. AIが話している途中でも、こちらがかぶせて話せば止まって聞いてくれる
1だけなら簡単です。難しいのは、1を入れた瞬間に2と3の問題が表に出ることでした。
常時聞き取りにすると、テレビが話しかけてくる
E.D.E.N.の聞き取りには、ブラウザ標準の音声認識(Web Speech API)を使っています。無料で、日本語の精度も十分です。ただ、返ってくるのは「聞き取った文字」だけで、誰の声か、どれくらいの距離から聞こえたかは分かりません。
テレビがついている部屋で常時聞き取りにすると、ニュースの読み上げをそのまま質問として受け取ってしまいます。
マイクの音量を、「さっきまでの部屋の音」と比べる
そこで、音声認識とは別にマイクをもう一本開いて、音量だけを測ることにしました。40ミリ秒ごとに音の大きさを測り、次の考え方で判定します。
- 直近15秒の音量を記録しておき、その中で下から6割くらいの大きさを「部屋の音」とみなす
- 話しかけられた声が、その「部屋の音」よりはっきり大きい時間(合計0.24秒ほど)があったときだけ、聞き取った内容を受け付ける
テレビは離れた場所から、ずっと同じくらいの大きさで鳴っています。15秒のうち大半はテレビの音なので、「部屋の音」はテレビの音量に近くなります。一方、PCの前で話すわたしの声は、マイクに近いぶんテレビより大きく入ります。この差で聞き分けます。
最初は、「部屋の音」をいちばん静かな瞬間で決めようとしていました。これはうまくいきません。テレビの声には息継ぎのような短い無音があるので、基準がその無音に引っ張られ、テレビの声がいつも「はっきり大きい声」と判定されてしまいます。静かな瞬間ではなく、ならした大きさを基準にしたのはこのためです。
もう一つ効いたのが、マイクの自動音量調整(オートゲイン)を切ることでした。これが有効だと、遠くのテレビの小さな声まで大きく持ち上げられてしまい、距離の差が消えます。
どれくらいの差で受け付けるかは、設定で「弱め・標準・強め」の3段階から選べるようにしました。テレビが大きい部屋では「強め」にします。それでも反応してしまう場合に備えて、「名前で呼んだときだけ応答する(応答のあと30秒は名前なしで続けられる)」という設定も付けています。
話している途中で割り込むには、AI自身の声を聞き分ける
割り込みの仕組み自体は単純です。AIが話している間も、聞き取りを止めずに続けます。そして話しかけられたら、読み上げを止めて、返事の生成も中断します。
問題は、スピーカーから出ているAI自身の声も、マイクが拾うことでした。そのままでは、AIが自分の声に割り込まれて、話し始めた瞬間に黙ってしまいます。
対策として、AIがいま読み上げている文章を覚えておき、聞き取った文字と照らし合わせることにしました。
- 聞き取った文字の中から、直前に読み上げた文章と4文字以上一致する部分を取り除く
- 取り除いたあとに2文字以上残り、しかも声が「部屋の音」よりはっきり大きいときだけ、割り込みとみなす
「ストップ」「待って」だけのときは、読み上げを止めるだけにして、質問としては送りません。生成の途中で割り込んだ場合は、そこまでの返事を「(割り込みで中断)」と付けて会話の記録に残します。
一つ、作ってから気づいた失敗があります。この「一致する部分を取り除く」処理を、最初はいつでも行っていました。すると、AIの返事に出てきた言葉をそのまま使って次の質問をしたとき(たとえば「エアコンを」で始まる返事のあとに「エアコンを消して」と言ったとき)、わたしの言葉まで削られてしまいます。今は、AIが話している最中と、話し終えてから1.5秒以内だけ取り除くようにしています。
起動したらすぐ会話にするための、ブラウザの制約
ブラウザは、画面を一度もクリックしていない状態では、音を鳴らすこともマイクを使うことも制限します。そこでE.D.E.N.は、専用のアプリ用ウィンドウで開くようにしました。
最初は、マイクの許可を自動で通す起動オプションを使いました。すると画面の上に「サポートされていないコマンドライン フラグを使用しています。安全性とセキュリティが損なわれます」という警告が出ました。今は、この専用ウィンドウの設定にE.D.E.N.のページだけマイクを許可する情報をあらかじめ書き込み、警告の出るオプションは外しています。
実機での確認
テレビをつけた部屋で、テレビの声には反応せず、わたしが話しかけたときだけ応答すること、AIが話している途中で話しかけると止まって聞き直すことを、わたしが確認しました。誤反応が何回に1回あるかといった数字は、まだ測っていません。
わたしが学んだこと
音声認識そのものを賢くしなくても、聞き取った内容を受け付けるかどうかを、音量と「いま自分が何を話していたか」で判定するだけで、生活の中で使える程度には聞き分けられました。
そして、割り込みを入れると「AIが自分の声を聞いてしまう」という、入れる前には見えなかった問題が出てきます。常時聞き取りは、聞き取りを増やす機能であると同時に、聞かなかったことにする判断を増やす機能でもありました。
構成全体や、次に試すことを整理したいとき
今回は常時聞き取りと割り込みの判断を記録しました。E.D.E.N.を何で動かしているか、声による操作をどうつないだかは、次の無料記事にまとめています。
- 開発ログ #1|課金APIを使わず、Ollamaのローカルモデルで個人用AIアシスタントを作り始めた:構成の出発点を確認したいとき。
- 開発ログ #8|声でエアコンが動かなかった原因と修正:聞き取った言葉を家電操作につなぐ際の失敗を読みたいとき。
構成全体や導入時の判断を手元で整理したい方向けに、有料note「自分専用AI E.D.E.N.を作るまで(設計図・判断表・導入チェックリスト)」も用意しています。設計図・判断表・導入チェックリストをまとめた記事です。記事の説明と無料で読める範囲を確認して、ご自身の用途に合うか判断してください。


コメント