ラズパイ5で動く!OllamaとWhisperで構築する完全オフラインの自作AIアシスタント
出典: ThisIsEngineering / Pexels
こんにちは、Ryotaです!スマートスピーカーに話しかけるとき、「音声データがクラウドに送信され、どこかで分析されているのではないか」とプライバシーを気に病んだことはありませんか?あるいは、インターネット接続が切れた途端に何も返答しなくなる不便さを感じたことはないでしょうか。
今回は、シングルボードコンピュータの Raspberry Pi 5 とオープンソースのAIツール群だけを使って、**完全にオフラインで動作する「自作スマートスピーカー(AI音声アシスタント)」**を構築する方法を紹介します。
エッジAI技術の進歩と、パラメータサイズが20億〜30億(2B〜3B)クラスの超軽量LLMの登場により、ラズパイのCPUパワーだけでも十分に実用的な速度で自然な対話ができる環境が整いました。
システム構成と仕組み
今回のシステムは、以下の3つのコンポーネントをPythonスクリプトで橋渡しすることで実現します。
graph LR
Mic[マイク入力] --> STT(1. Whisper<br>音声認識)
STT --> LLM(2. Ollama / Llama 3.2 1B / 3B<br>思考・応答生成)
LLM --> TTS(3. Piper<br>音声合成)
TTS --> Spk[スピーカー出力]
- 音声認識(Speech-to-Text): Whisper(Whisper.cppなど軽量化したもの)を用いて、マイクから入力された音声をテキストに変換します。
- 推論と応答生成(LLM): Ollama 上で動作する Llama 3.2 (1B または 3B) を用いて、テキストに対する回答を生成します。
- 音声合成(Text-to-Speech): 超軽量で高速なオープンソースのニューラル音声合成エンジン Piper を使用し、回答テキストを音声ファイル(WAV)に変換して再生します。
事前準備と必要な機材
- Raspberry Pi 5(メモリ8GBモデルを推奨。4GBでも動作可能)
- USBマイク(またはマイク内蔵USBウェブカメラ)
- スピーカー(3.5mmジャック、USBスピーカー、またはBluetooth接続)
- OS: Raspberry Pi OS (64-bit)
構築手順
1. Ollamaのインストールとモデルの起動
ラズパイのターミナルを起動し、Ollamaをインストールします。
curl -fsSL https://ollama.com/install.sh | sh
インストール完了後、エッジ環境に最適な超軽量モデルである llama3.2:1b (約13億パラメータ) または llama3.2 (3Bモデル) をダウンロードします。ラズパイ5で応答速度を最優先する場合は 1Bモデルが推奨です。
ollama run llama3.2:1b
無事起動し、ターミナルで対話ができることを確認したら、Ctrl+D で一旦終了します(バックグラウンドでデーモンが動き続けます)。
2. Piper(音声合成)のセットアップ
PiperはC++で書かれた非常に高速な音声合成エンジンで、GPU非搭載のラズパイでも実時間(Real-time)以下で音声を生成できます。日本語の美しいフォント音声モデル(ja_JP)も有志によって複数提供されています。
# Piperバイナリのダウンロードと展開
wget https://github.com/rhasspy/piper/releases/download/v1.2.0/piper_arm64.tar.gz
tar -xf piper_arm64.tar.gz
# 日本語音声モデル(onnx)と設定ファイルのダウンロード
wget https://github.com/rhasspy/piper/releases/download/v1.0.0-models/ja_JP-ljspeech-medium.onnx
wget https://github.com/rhasspy/piper/releases/download/v1.0.0-models/ja_JP-ljspeech-medium.onnx.json
以下のコマンドでテキストを喋らせてみて、接続されたスピーカーから音が出るかテストします。
echo "こんにちは。ラズパイ音声アシスタントです。" | ./piper/piper --model ja_JP-ljspeech-medium.onnx --output_file welcome.wav
aplay welcome.wav
3. Whisper(音声認識)とメインプログラムの統合
Pythonからこれらのコンポーネントをコントロールするため、openai-whisper およびマイク入力・再生用のライブラリをインストールします。ここでは処理を簡略化するため、OllamaのAPIとローカルのWhisper、Piperコマンドを呼び出すシンプルな対話ループスクリプト(assistant.py)を作成します。
import subprocess
import requests
import json
import sounddevice as sd
from scipy.io import wavfile
import numpy as np
# 設定
OLLAMA_URL = "http://localhost:11434/api/generate"
MODEL_NAME = "llama3.2:1b"
SAMPLE_RATE = 16000
DURATION = 5 # 録音時間(秒)
def record_audio(filename="input.wav"):
print("🎤 話しかけてください...")
audio = sd.rec(int(DURATION * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=1, dtype='int16')
sd.wait()
wavfile.write(filename, SAMPLE_RATE, audio)
print("録音終了。処理中...")
def transcribe_audio(filename="input.wav"):
# whisperコマンドを用いてテキストに変換 (実務ではより高速な whisper.cpp を推奨)
result = subprocess.run(["whisper", filename, "--language", "Japanese", "--model", "tiny", "--output_format", "txt"], capture_output=True, text=True)
with open("input.txt", "r") as f:
text = f.read().strip()
return text
def get_llm_response(prompt):
# システムプロンプトで応答を短く制限する
system_prompt = "あなたは親切なAIアシスタントです。回答は日本語で、最大2文以内で簡潔に答えてください。"
data = {
"model": MODEL_NAME,
"prompt": f"{system_prompt}\n\nユーザー: {prompt}\nアシスタント:",
"stream": False
}
response = requests.post(OLLAMA_URL, json=data)
return response.json()["response"]
def speak_text(text, output_file="output.wav"):
# Piperを実行して音声を生成
piper_cmd = f"echo '{text}' | ./piper/piper --model ja_JP-ljspeech-medium.onnx --output_file {output_file}"
subprocess.run(piper_cmd, shell=True)
subprocess.run(["aplay", output_file])
def main():
while True:
input("Enterキーを押して会話を開始...")
record_audio()
user_text = transcribe_audio()
print(f"あなた: {user_text}")
if not user_text:
continue
response_text = get_llm_response(user_text)
print(f"アシスタント: {response_text}")
speak_text(response_text)
if __name__ == "__main__":
main()
動かしてみた所感
実際に Raspberry Pi 5 上で動かしてみると、Llama 3.2 1B モデルのレスポンスは想像以上に軽快です。マイクに向かって「今日の天気は?」などと話しかけてから、約1〜2秒ほどで音声の返答が始まり、スマートスピーカーとして十分実用的な速度です。
何より、すべての演算が手のひらサイズのラズパイの内部だけで完結しているという安心感は、クラウド製品にはない魅力です。
ここからさらに、センサー類を接続して部屋の温度を答えさせたり、家電を操作するスマートホーム機能(スマートスイッチとの連携)を追加する電子工作へと発展させることができます。ぜひ自分だけの秘密のアシスタントを作ってみてください!
お役立ち情報
- 📄 Ollama 公式サイト (英語)
- macOS、Linux、Windows上で、多様なオープンソースLLMをローカル環境で簡単かつ効率的に動かすための標準ツールのトップページ。
- 📄 GitHub - rhasspy/piper (英語)
- Raspberry Piなどの低リソースなシングルボードコンピュータでも軽快に動作する、高速・軽量なニューラルテキスト読み上げエンジンのリポジトリ。
- 📄 Raspberry Pi 公式サイト (英語)
- シングルボードコンピュータ「Raspberry Pi」のハードウェアスペック、公式周辺機器、ドキュメントが提供されている公式ポータル。