2026/7/30、2年前に書いた本記事を最新版に全面リニューアルしました。
セキュリティ的な判断は自己責任でお願いします。
ローカル環境(パソコン内)に最新の軽量AI言語モデル(Phi-4-mini や Qwen 2.5)をダウンロードし、Windows標準のPowerShellとPythonを使って音声入出力チャットを行ってみます。(Phi-4-miniのみ実機確認しました。 )
こちら↓の続きです。

Ollamaを使えば、テキストベースのチャットはすぐに実行できます。そこに音声入力(Windows標準の音声入力機能)と音声出力(Microsoftの超自然な合成音声 edge-tts)を加えることで、起動後はマイクとスピーカーだけで会話できるハンズフリーなAIチャット環境が完成します。
ローカル環境で動作するため、すべて無料(0円)で利用できます。
最新モデル(Phi-4-mini / Qwen 2.5)での進化と特徴
2024年当時に使用していた Phi-3-mini と比較して、現在のローカルAI環境は飛躍的に進化しています。
- 回答パフォーマンスの大幅向上:
Microsoftの最新モデルPhi-4-mini(3.8B) や、日本語処理能力に定評のある AlibabaのQwen 2.5(3B / 7B) を使用することで、日本語の自然さや論理的思考力が格段にアップしました。 - 日本語ハックの不要化:
旧 Phi-3-mini では日本語出力時に「Instruction」や「指示」といったプロンプトのメタ命令が漏れ出してしまう問題があり、コード側で特殊な文字列削除を行う必要がありましたが、最新モデルでは指示追従性が安定し、自然な対話が可能になりました。 - CPU環境(Nvidia GPUなし)でも高速化:
3B〜4Bクラスのモデルであれば、通常ノートPCなどのCPU(+メインメモリ16GB)だけでも実用的な速度でストリーミング回答が得られます。
留意点:
- 回答テキストが生成され表示された後、順次音声変換して再生するため、リアルタイムでの完全な同時対話というよりは「回答を読み上げる」みたいな形式となります。
- 音声合成機能 (
edge-tts) はMicrosoftの高品質ニューラル音声APIを試用しているため、音声出力時のみインターネット接続が必要です。(ネットを切った状態でもテキストチャット自体は完全オフラインで動作します。)
必要な環境
- OS: Windows 11(64bit)
- PCスペック: CPU動作OK(Nvidia GPUがなくても16GBメモリがあれば十分動作します)
- 事前準備:
- VS Code (Visual Studio Code)などのエディター
- Anaconda などのPython実行環境
- Ollama のインストール
参考記事:







全体の手順
- Ollama と最新モデル(Phi-4-mini や Qwen 2.5)のダウンロード
- 仮想環境の作成 (Create)
(base環境を汚さず、専用の仮想環境を作成して必要なパッケージをpipインストールします) - 要素技術の個別テスト
- ターミナルからのテキスト入力
edge-ttsによるテキストの音声変換playsoundによる音声ファイル再生- Windows標準の音声入力(
Win + H)と Python からの制御
- 統合スクリプトの実行(完成コード)
動画(旧版実演)はこちら: YouTube実演部分(2年前に撮ったもので2026/7/30現在の本記事の内容とは異なりますが、様子は確認できると思います。)
Ollamaのインストールとモデルのダウンロード
Ollamaのインストール方法および基本操作は以下を参照してください。





パソコンにOllamaをインストール後、Windows PowerShell(またはコマンドプロンプト)を開き、以下のコマンドでphi4-miniを立ち上げます。
ollama run phi4-mini
※ 日本語性能を最優先したい場合は ollama run qwen2.5:3b または ollama run qwen2.5:7b もおすすめらしいです。(私は未確認)
初回のみモデルファイル(約2GB〜3GB)が自動ダウンロードされ、完了するとターミナル上でローカルAIとのチャットが可能になります。
同時に、ローカルPCバックグラウンドでOllamaサーバー(デフォルト: http://localhost:11434)が常駐稼働します。Pythonから操作する際は、公式ライブラリ ollama-python を使ってこのローカルサーバーと通信します。
チャットが立ち上がるとプロンプト入力待ちの>>>表示になるので一旦
/bye
で抜けます。抜けてもollamaはバックグラウンド実行されてます。
仮想環境を作成
仮想環境の基本についてはこちらにまとめています。uvがおすすめです。


1. 仮想環境を立ち上げたあと。
2. 以下のコマンドを実行して作業フォルダを作成し、VS Codeを起動
mkdir ollamatest
cd ollamatest
code .
3. VS Code のターミナルで ollama ライブラリをインストール
pip install ollama
uvの場合(以降もpipの場合uv pipにする)
uv pip install ollama





各機能の個別検証
完成コードを組む前に、各パーツが正しく動くか個別にテストしていきます。
① ターミナルからの質問文入力 (test2.py)
対話ループの基本形です。input() でテキスト入力を受け取り、終了 と入力されるまで繰り返します。
test2.py
while True:
situmon = input("質問を入力してください(終了するには '終了' と入力してください): ")
if situmon.lower() == '終了':
print("プログラムを終了します。")
break
hentou = f"質問 '{situmon}' に対する回答です。"
print(hentou)
② テキストから音声への変換 (edge-tts)
Microsoft Edgeの超高精度なニューラル音声エンジンをPythonから無料で利用できる edge-tts ライブラリを使用します。
pip install edge-tts
- 公式ドキュメント: edge-tts GitHub Repository
最もシンプルな基本コード (basic_generation.py)
edge-tts は内部処理が非同期 (async/await) で実装されています。Pythonの標準ライブラリ asyncio を使用して以下のように呼び出します。
test3.py
#!/usr/bin/env python3
import asyncio
import edge_tts
TEXT = "こんにちは!ローカルAI音声チャットへようこそ。"
VOICE = "ja-JP-NanamiNeural" # 日本語女性音声
OUTPUT_FILE = "test.mp3"
async def amain() -> None:
"""音声ファイルを生成する非同期メイン関数"""
communicate = edge_tts.Communicate(TEXT, VOICE)
await communicate.save(OUTPUT_FILE)
if __name__ == "__main__":
asyncio.run(amain())
test.mp3というファイルができます。
補足(async / await について):
communicate.save()は非同期関数(async def)として定義されているため、呼び出す際にはawaitが必要です。また、awaitは非同期関数(async def amain())の内部でしか使えないため、エントリーポイントとしてasyncio.run(amain())を実行します。
③ 音声再生 (playsound)
生成された .mp3 音声ファイルをPythonから手軽に再生します。
pip install playsound==1.2.2
補足(2026/7/30現在):pip install playsoundだとエラーが出ます。
× Failed to build playsound==1.3.0
├─▶ The build backend returned an error
╰─▶ Call to setuptools.build_meta:__legacy__.build_wheel failed
playsound の最新版(1.3.0)が抱えている既知の不具合で、setup.py のビルド処理が自分自身のソースコードを読み込もうとして失敗するために起きています(uv 環境だと特に発生しやすいです)。
test4.py
from playsound import playsound
playsound("test.mp3")
実行するとtest3.mpが再生されます。
④ 音声入力(Windows標準機能)
Windows 11には高精度な音声入力機能が標準搭載されています。
- ショートカットキー:
Windowsキー + H - ターミナルにカーソルを置いた状態で
Win + Hを押してマイクに向かって話すと、自動的にテキストが入力されます。
4. 完成コード(統合スクリプト)
上記の要素技術(OllamaでのAI回答生成 + edge-ttsでの音声合成 + playsoundでの再生 + pyautoguiによるWin+H音声入力トグル)をひとつにまとめた最終プログラムです。
キーボードのショートカット操作を自動化するため、以下のライブラリを追加インストールします。
pip install pyautogui
PyAutoGuiの詳細は以下


コードのポイント
- モデルの柔軟な切り替え:
model_name = 'phi4-mini'(qwen2.5:3bやllama3.2などに変更可能)。 - 言語モード切替:
mode = 'jp'(日本語)と'en'(英語)をサポート。 - 一時ファイルの自動管理:
tempfileモジュールを使い、再生が完了した音声ファイル(.mp3)は自動的に削除されるため、ディスクが汚れません。 - リアルタイムストリーミング表示: AIが回答を出力しながらターミナルに順次表示し、完了後に音声読み上げを行います。
使い方
1.voice_ai_chat.pyを実行すると以下が表示され、Windows11の音声入力が立ち上がります。
==================================================
Windows11 ローカルAI音声チャット (Model: phi4-mini)
終了するには '終了' と入力してください。
==================================================
質問を入力してください(音声入力受付中):
2.質問を音声入力したあと「次の行」というと質問文が送信されます。
(Windows 11の音声入力で改行するには、音声で「改行」または「次の行」と発声。私の場合「改行」と発声すると「開業」に変換されてしまうので「次の行」と発声してます。)
3.回答が1文字ずつ表示されます。全部表示し終わったら読み上げが始まります。
4.終了するときは「終了」と発声すると終了します。Windows11の音声入力を手動で停止してください。
完成プログラム (voice_ai_chat.py)
import asyncio
import os
import tempfile
import time
import ollama
import edge_tts
from playsound import playsound
import pyautogui
# ---------------------------------------------------------
# 設定
# ---------------------------------------------------------
# 使用するローカルAIモデル名 ('phi4-mini', 'qwen2.5:3b', 'llama3.2' など)
MODEL_NAME = 'phi4-mini'
# モードの設定 ('jp': 日本語, 'en': 英語)
MODE = 'jp'
def yaritori(situmon: str, mode: str):
"""ローカルAIと対話し、回答を音声合成して再生する関数"""
print("\n[AI思考中...]")
hentou = ''
# システムプロンプトの設定(短く分かりやすい返答を指示)
if mode == 'jp':
system_prompt = (
'あなたは親しみやすい会話パートナーです。'
'気軽に話してください。100文字以内で短く分かりやすく返答してください。'
)
else:
system_prompt = (
'You are a friendly conversation partner. '
'Please keep your responses concise, clear, and within 100 characters.'
)
prompt = [
{'role': 'system', 'content': system_prompt},
{'role': 'user', 'content': situmon}
]
try:
# Ollamaのチャットストリームを開始
stream = ollama.chat(
model=MODEL_NAME,
messages=prompt,
stream=True,
)
# ストリーム出力をターミナルにリアルタイム表示
print("AI: ", end='', flush=True)
for chunk in stream:
content = chunk['message']['content']
hentou += content
print(content, end='', flush=True)
print("\n")
except Exception as e:
print(f"\n[エラー] Ollamaからのレスポンス取得に失敗しました: {e}")
return
if not hentou.strip():
print("[警告] 回答が空でした。")
return
# 音声合成(TTS)の設定
if mode == 'jp':
voice = "ja-JP-NanamiNeural" # 日本語女性音声
else:
voice = "en-GB-SoniaNeural" # 英語女性音声
rate = "-5%"
# 非同期で音声ファイルを生成する内部関数
async def generate_tts(text: str, voice_name: str, output_path: str) -> None:
communicate = edge_tts.Communicate(text, voice_name, rate=rate)
await communicate.save(output_path)
# 一時ファイルを作成して音声を保存
with tempfile.NamedTemporaryFile(delete=False, suffix='.mp3') as temp_audio:
output_file = temp_audio.name
try:
# 音声生成
asyncio.run(generate_tts(hentou, voice, output_file))
time.sleep(0.5)
# 音声再生
if os.path.exists(output_file):
playsound(output_file)
else:
print(f"[エラー] 音声ファイル {output_file} が見つかりませんでした。")
except Exception as e:
print(f"[エラー] 音声の生成または再生中にエラーが発生しました: {e}")
finally:
# 一時ファイルの削除
if os.path.exists(output_file):
try:
os.remove(output_file)
except Exception:
pass
# ---------------------------------------------------------
# メイン処理ループ
# ---------------------------------------------------------
if __name__ == "__main__":
print("==================================================")
print(f" Windows11 ローカルAI音声チャット (Model: {MODEL_NAME})")
print(" 終了するには '終了' と入力してください。")
print("==================================================\n")
while True:
# 音声入力をON(Win + H)
pyautogui.hotkey('win', 'h')
situmon = input("質問を入力してください(音声入力受付中): ")
# 音声入力をOFF(Win + H)
pyautogui.hotkey('win', 'h')
# 不要な改行ワードの除去
situmon = situmon.replace('改行', '').replace('解除', '').strip()
if not situmon:
continue
# 終了判定
if MODE == 'jp':
if situmon.lower() in ['終了', '終了。']:
print("プログラムを終了します。")
break
else:
if 'end' in situmon.lower():
print("Exiting program.")
break
# 質問処理
yaritori(situmon, MODE)
所感
旧バージョンの Phi-3-mini から最新の Phi-4-mini や Qwen 2.5 にアップデートしたことで、日本語の会話精度とレスポンスの安定感が大きく向上しました。
Nvidiaの独立グラフィックボード(GPU)を搭載していないCPU環境のパソコンであっても、3B〜4Bクラスのモデルであればストレスなく実用レベルの速度で動きます。
本記事のスクリプトは、ローカル環境でAI言語モデルと音声UIを組み合わせるための実践的なベースコードです。
イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)
目次へ