💨

【gpt-oss】Pythonで作る -ローカル音声対話エージェント-

に公開

Pythonで作る最小限のローカル音声対話エージェント

今回は LM Studio を活用して、シンプルな音声認識 × LLM応答 × 音声読み上げの仕組みを作ってみました。Pythonだけで完結するので、環境さえ整えればすぐに試せます。

1. 必要なライブラリ

以下のライブラリを使います。

pip install SpeechRecognition keyboard pyttsx3 lmstudio

LM Studioのgpt-oss-20bを開発者モードで起動します。


2. コード全体

import speech_recognition as sr
import keyboard
import lmstudio as lms
import pyttsx3

# LM Studioの応答テキストからメッセージ部分を抽出
def extract_message_content(response_text: str) -> str:
    if not response_text:
        return ""
    if "<|channel|>final<|message|>" in response_text:
        return response_text.split("<|channel|>final<|message|>")[-1].strip()
    if "<|message|>" in response_text:
        return response_text.split("<|message|>")[-1].strip()
    return response_text.strip()

# 音声認識
r = sr.Recognizer()
# モデルの準備
model = lms.llm("openai/gpt-oss-20b")

# 音声合成エンジン
engine = pyttsx3.init()
engine.setProperty('rate', 150)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)  # 0:男性、1:女性

with sr.Microphone() as source:
    print("Tキーを押して話してください...")

    while True:
        if keyboard.is_pressed("t"):
            print("録音中...")
            audio = r.listen(source)
            try:
                text = r.recognize_google(audio, language="ja-JP")
                print("あなた:", text)
                
                res = model.respond(text)
                reply = extract_message_content(str(res))
                
                print("AI:", reply)
                engine.say(reply)
                engine.runAndWait()

            except sr.UnknownValueError:
                print("音声を認識できませんでした")
            except sr.RequestError:
                print("Google API に接続できませんでした")

            print("録音終了。Tキーを押して再開できます。")

Tキーを押している間だけ録音 → LLMに送信 → 結果を読み上げる、という流れです。とてもシンプルに動作します。


3. テキストベースで試す場合

まずは音声なしで、最小限のコードでモデルに問い合わせることも可能です。

import lmstudio as lms

# モデルをロード
model = lms.llm("openai/gpt-oss-20b")

# モデルに問い合わせ
res = model.respond("こんにちは。")
print(res)

4. 音声を認識する仕組み

音声入力には SpeechRecognition を利用しています。マイクからの音声を録音し、Googleの音声認識APIを使って日本語テキストに変換します。

audio = r.listen(source)
text = r.recognize_google(audio, language="ja-JP")
  • r.listen(source) でマイク入力をキャプチャ
  • recognize_google() でテキスト化

これにより、「話した言葉 → 文字列」に変換できます。


5. 音声を出力する仕組み

応答をテキストで表示するだけでなく、pyttsx3 を使って音声で読み上げます。

engine = pyttsx3.init()
engine.setProperty('rate', 150)
engine.say(reply)
engine.runAndWait()
  • say() にテキストを渡すと読み上げキューに追加
  • runAndWait() で実際に音声を再生

声の種類 (voices[0].id など) や速度 (rate) を調整することで、自然な対話が可能になります。


6. API利用上の注意

今回の例で利用している recognize_google() は、Googleの無料Web APIを呼び出しています。これはAPIキーが必要なく簡単に利用できますが、おそらく利用回数やリクエスト頻度に制限があります。そのため、長時間や安定稼働を前提とする場合は以下の選択肢が推奨されます。

  1. Google Cloud Speech-to-Text API(有料版):公式にサポートされ、利用制限が明確

  2. OpenAI Whisper API:高精度かつ制限管理がしやすい

  3. ローカルでのWhisper推論:制限なし、GPU環境があれば高速処理可能

サンプルコードは手軽に試すには便利ですが、本格運用では上記の代替手段を検討してください。

まとめ

  • 音声認識:SpeechRecognition
  • 応答生成:LM Studio (LLM)
  • 音声合成:pyttsx3

わずか数十行で、音声でやりとりできるエージェントを構築できます。実験用や個人アシスタントの試作にぴったりです。

Discussion