Python がインストール済み
対話応答用の生成AIは、クレジットカード不要で、Googleアカウントのみを使って Google AI Studio(Gemini API) の API キーを取得できる
音声認識は、ローカルで動く Vosk 日本語モデル(GPU不要)を利用
TTS(テキスト→音声変換) は無料ライブラリ gTTS(Google Translate TTS)を使用
ターン交替は、システムの発話が終わったら即座に録音開始(固定秒数)→ VAD 化してユーザ発話の終わりを検出するよう改良しました
エクスプローラを開き、上部のメニューバーから「表示」を選択し、プルダウンメニューの「表示」にある「ファイル名拡張子」にチェックを入れる
Extensionは、VS codeを立ち上げた画面の左端のカラムの上から5番目のExtensionsアイコンをクリックして、現れたExtensionsカラムの最上部の検索窓で「Python」を検索する。検索結果の上位に表示されるMicrosoftのPythonの「Install」ボタンを押してPython Extensionをインストールする。
GitHub CopilotのExtensionも同様に、「GitHub Copilot」と検索して、インストール。これだけでも最小限AIが使えますが、制限があるので、無制限に使えるようにするためには、学生としてGitHub Educationに応募します。
(bashと書いた行の下のpipで始まるコマンドは、Windows PowerShellか、「ターミナル」か、Git Bashか、Visual Studio Codeのターミナル などにコピペして実行します;Macの場合は、「ターミナル」を開いて、コピペして実行します;Macの場合は、まず、次のコマンドで、pipをインストールする必要があります;(Visual Studio Codeのターミナルは、WindowsとMacで共通に使えます)
python -m ensurepip --upgrade
↓最初の見え消ししてある2行は、古いライブラリが混ざっていたので、新しいライブラリに入れ替えたのが下の行なので、下の行をコピペして、Enterキーを押すと実行されます。一度playsoundをインストールしてしまった人は、それを3行目のコマンドでアンインストールしてから、4行目のコマンドでplaysound3(やその他のライブラリ)をインストールして下さい。おそらく、エラーは赤字で、警告は黄色字で表示されるので、赤字が出たら、何とかする必要があります。警告はおそらく当面は対処しなくても大丈夫。)(Windows PowerShellの見つけ方:Wiindowsのスタートボタン→上部の検索窓で「PowerShell」と入力すると見つかる→右クリックして「スタートにピン留め」しておくと今後便利)
bash
pip install vosk sounddevice google-generativeai gTTS playsound
pip install vosk sounddevice google-genai gTTS playsound
pip uninstall playsound
上のアンインストール・コマンドを実行すると
Proceed (Y/n)? と尋ねてくるので Y と答えて下さい。
pip install vosk sounddevice google-genai gTTS playsound3
ここでエラーが出る場合は、それを生成AIにコピペして尋ねると、解決策を提案してくれる。コピペするのは、エラーメッセージだけでなく、入力したコマンド(上記)も含めて出力全体をコピペするとよい。必要ならその前の文脈として必要そうなコマンドとそれへの応答もいっしょにコピペする。PowerShellの場合だと、私の場合は、
「PS C:\Users\okana> ここにコマンドを打つ」ので、この行を含めてコピペする。C:\Users\okanaの部分もカレントディレクトリ(今いるディレクトリ)を示すので、ここも情報を持っているのでコピペする。
以下は各ライブラリの機能の解説:
vosk/sounddevice:STT 録音+認識
google-genai:Gemini API 呼び出し
gTTS/playsound3:TTS 合成+再生
(playsoundライブラリはPython3.13やPython3.12の環境では、インストール時にエラーが出るようです。Python3.11にする手もあるようですが、playsoundの方をより新しいライブラリに変える方針をとり、Python3向けにメンテされているフォーク版であるplaysound3をインストールするよう変更しました。)
numpyのインストールが必要な場合は、以下のコマンドでインストール
bash
pip install numpy
Vosk 日本語モデル v0.22 ( vosk-model-small-ja-0.22 (スマホでも動く) または vosk-model-ja-0.22 (i7とかの高性能PC向け))をダウンロードする。手っ取り早く動作確認するにはsmallがお勧め。大きい方はダウンロードや解凍に時間がかかる。
ダウンロードした圧縮フォルダを右クリックして「すべて展開」を選ぶと、解凍できる。
解凍してできたフォルダ(ディレクトリ)vosk-model-small-ja-0.22(小さいモデルをえらんだ場合)を、対話スクリプト(voice_agent.py)を置くフォルダ(例えばC:の直下にvoice_agentフォルダを作り、そこ)に配置。配置したvosk-model-small-ja-0.22フォルダの直下に、am, conf等のフォルダがあることを確認(解凍の仕方によっては、vosk-model-small-ja-0.22フォルダが2重になっていることがあるが、この2重になったままで配置するとモデルが認識されない)。
voice_agent ← 音声対話エージェント開発用フォルダ
├── voice_agent.py ← メインのスクリプト(下記)
├── vosk-model-.../ ← Vosk日本語モデルのフォルダ
│ ├── am/
│ ├── conf/
│ ├── graph/
│ └── ivector/
上記のフォルダ構成になっていることを確認して下さい。なお、プロジェクトルートのPATHには日本語が含まれないようにして下さい。このようなフォルダ構成を作る手順1.から3.は次の通りです:
たとえばC:の直下に、voice_agentフォルダ(ディレクトリとも呼ぶ)を作る。このフォルダ名は何でもいいのですが、内容が分かる名前にすることと、日本語を含まない名前にすることがトラブルを防ぐ上で重要です。このフォルダの親フォルダをたどっていたときに、すべてのフォルダ名が日本語を含まないようにして下さい。C:の直下であれば、親フォルダ名が日本語を含まないという点で安全なので、C:の直下という例を書きました。C:の直下に新しいフォルダを作る方法(の1つ)は次の通りです。(なお、Windows PowerShell上でもコマンドによりフォルダの作成などできます。)
エクスプローラを開いて「ローカルディスク(C:)」を見つけクリックします。
左上部の「新規作成」をクリックして、プルダウンメニューから「フォルダ」をクリックすると、フォルダの新規作成ができるので、たとえばvoice_agentと名前を付けます。
これで、C:の直下に、voice_agentフォルダができました。
voice_agentフォルダの中に、下記の手順IIでダウンロードするvoice_agent.pyを置く。
同じ場所(voice_agentフォルダの中)に、上記の手順で解凍したvosk日本語モデルのフォルダを置く。その際、vosk日本語モデルのフォルダの直下が、下記の構成になっていることを確認する。よくある間違いは、解凍した際に日本語モデルのフォルダが2重になっていることがあるが、それをそのまま置いてしまうことです。そうすると、下記の構成とは異なるものとなっているので、Pythonスクリプトから日本語モデルにアクセスできません。Pythonスクリプトは、下記の構成を前提として動作するように書いてあるので、それに合わせたディレクトリ構成にしておく必要があるのです。
voice_agent ← 音声対話エージェント開発用フォルダ
├── voice_agent.py ← メインのスクリプト(下記)
├── vosk-model-.../ ← Vosk日本語モデルのフォルダ
│ ├── am/
│ ├── conf/
│ ├── graph/
│ └── ivector/
Google アカウントで https://ai.google.dev/gemini-api/docs?hl=ja にアクセス
「Gemini API キーを取得する」→「API キーを作成」→画面に表示される手順でキー文字列を取得
取得したキーを環境変数にセット(取得したキーをダブルクォーテーションで囲んで下さい)
bash
setx GOOGLE_API_KEY "取得したキー文字列"
↑bashと書いた行の下の setx で始まるコマンドは、Windows PowerShellか、「ターミナル」か、Git Bashなどにコピペして実行します;「取得したキー文字列」をはさむダブルクォーテーションは、そのまま残して、ダブルクォーテーションの間に取得したキーをコピペして下さい。
2025/6/1 更新。最新版をダウンロードしてください。マイクのサンプルレートを自動取得。
2025/5/25 更新。システムインストラクションに対応;対話履歴を考慮した応答に対応;ユーザ発話終了の自動判定に対応
2025/5/16 playsound3への変更
①↑これをクリックして現れる画面の右上部のダウンロードボタン[「Download raw file」ボタン]をクリックし、このスクリプトをダウンロードします。
②ダウンロードしたスクリプトvoice_agent.pyを、ドラッグアンドドロップなどの方法で、手順Iの5.で作った音声対話エージェント開発用のフォルダ(例示した通りに作った人はvoice_agentという名前のフォルダ)に移動します。
③このスクリプトの実行の仕方(の一つ)は、このスクリプト・ファイルをダブルクリックすると、Visual Studio Codeで開くので、実行ボタン(右上部の三角形の再生ボタン)を押す。(制限モードになっていると実行できないので、「信頼する」を押して制限を解除する。)
実行前に、スクリプトの中で修正が必要な個所
24行目のVosk日本語モデルのパスを自分の環境に合わせて書き換える。
46行目のシステムインストラクションを目的に応じて書き換える。
音声対話エージェントに「なんか暗くなったね」とか言うとLED(MESHのLEDブロックを使用)をつけてくれる(voiceLED.py ← 生成AIに依頼)。手順①voiceLED.pyをダウンロードして、voice_agent.pyと同じディレクトリに置く。②LEDブロックのボタンを長押しして電源を入れる。③voiceLED.pyを実行する。
Geminiへのシステムインストラクションで、発話内容に加えて、外部デバイスを操作するコマンドを以下の形式で出力させます
JSON形式で、speechキーと、commandキーを含むオブジェクトを返すように指定
{
"speech": "ここに人に話す文章",
"command": "許可されたコマンド名 または 空文字列"
}
発話内容だけ抽出して音声出力し、コマンドに応じてLEDをつけたりするように、プログラムを書きます
以上により、「LEDをつけて」と明示的に依頼することもできるし、エージェントがLEDをつけたくなる文脈を設定するような話をして(例:「なんか暗くなったね」)つけてもらうこともできます。
生成AI(大規模言語モデル)をうまく使うことで、単なる音声コマンドに限定されない柔軟で気が利く音声インタフェースが構築できたことになります。
音声対話エージェントに気温や湿度を尋ねることもできるはず(MESHの温度・湿度ブロックを使用)。温度や湿度に応じた対話も面白いですね。生成AIなら「暑いから水分補給を忘れないでね」とか言ってくれそう。
その他のブロックも使っていろいろ作ってみて下さい。あなたなら対話エージェントと実世界をどんなふうにつなぎますか?
「みんなの生成AIワークショップ」への参加を勧めてくれる音声対話エージェントを作りました。実行手順:① pdf_voice_agent.pyをダウンロードして、voice_agent.pyと同じディレクトリに置く。② pdf_voice_agent.pyを実行する。
ワークショップHPの内容をPDF化したファイルを作り、そのPDFファイルを読み込んでそれを参照して対話します。PDFファイルはネット上のPDFファイルを読み込むか、または、ローカルのPDFファイルを読み込むことができます。
生成AIに「ネット上のPDFファイルの見つけ方を教えて」と依頼すると、教えてくれるよ。
PDFの内容は何でもよいので、そのPDFファイルの内容に応じた知識を持ったいろいろなチャットボットが作れます。いろいろ試して下さい。システムインストラクション(89行~93行、98行~102行)をPDFファイルの内容と目的に応じて書き換えて下さい。PDFの要約のしかたを指示するテキスト(71行)もPDFの内容と目的に応じて書き換えて下さい。
ユーザ発話の途中でも音声認識結果を表示するよう改良されています。
いろいろ例外処理が追加されて、各種エラーに対して、より頑健になっています。
ChatGPT o4-mini-high (有料版) でコーディングしようとして、エラーが堂々巡りで続いたり、意図通りの仕様にならなかったりで、しばらく苦戦していたのですが、Claudeを使ったら一発(対話履歴)でできました。Claudeはコーディング能力が高いのですが、一時期、無料版では高性能のものが使えませんでした。2025/6/9現在、無料版で、Sonnet 4が使えます。コーディング能力が高く高速で快適です。
PDFファイルを読み込む代わりに、Gemini APIのURL contextを使用する方法もあると思います。
さらに検索機能を追加してRAG(検索拡張生成)にすることもできます。