指示通りに動いてくれて、自分のハードウェアで動作し、聞き間違いでパイナップルを12個も注文してしまうようなこともない、小型の音声アシスタントが欲しいですか? Raspberry Piを使った自作AIアシスタントは、驚くほど簡単に、楽しく、そして柔軟に作ることができます。ウェイクワード、音声認識(ASR=自動音声認識)、自然言語処理(ルールまたはLLM)、そしてテキスト読み上げ(TTS)を配線します。いくつかのスクリプト、1つか2つのサービス、そして慎重な音声調整を追加すれば、あなたのルールに従うポケットサイズのスマートスピーカーが完成します。
いつものように頭を抱えることなく、ゼロからRaspberry Piとの通信までをスムーズに進めましょう。部品、セットアップ、コード、比較、注意点など、すべてを網羅します。🌯
この記事の次に読むとよい記事:
🔗 AIを効果的に学習する方法
学習計画を作成し、課題に取り組み、進捗状況を追跡しましょう。.
🔗 AI企業を立ち上げる方法
問題を検証し、MVP(最小実行可能製品)を構築し、チームを編成し、最初の顧客を確保する。.
🔗 AIを活用して生産性を高める方法
定型業務を自動化し、ワークフローを効率化し、創造的な成果を向上させます。.
🔗 AIをビジネスに取り入れる方法
影響力の大きいプロセスを特定し、パイロットプロジェクトを実施し、投資対効果(ROI)を測定し、規模を拡大する。.
Raspberry Pi を使った優れた DIY AI アシスタントの条件とは ✅
-
デフォルトでは非公開– 可能な限り音声データをデバイス内に保存します。デバイスから外部に送信されるデータはユーザーが決定します。
-
モジュール式– ウェイクワードエンジン、ASR、LLM、TTSなど、レゴのようにコンポーネントを交換可能。
-
手頃な価格帯– ほとんどがオープンソースで、市販のマイク、スピーカー、そしてRaspberry Piを使用。
-
ハッキング可能– ホームオートメーション、ダッシュボード、ルーチン、カスタムスキルが必要ですか?簡単です。
-
信頼性が高い– サービス管理型で、自動的に起動してリスニングを開始します。
-
楽しいですよ。オーディオ、プロセス、イベント駆動型設計についてたくさん学べます。
ちょっとしたコツ:Raspberry Pi 5を使用しており、負荷の高いローカルモデルを実行する予定がある場合は、クリップオン式のクーラーが持続的な負荷時に役立ちます。(迷った場合は、Pi 5用に設計された公式のアクティブクーラーを選択してください。)[1]
必要な部品と工具🧰
-
Raspberry Pi :余裕のある性能を求めるなら、Pi 4またはPi 5を推奨します。
-
microSDカード:32GB以上を推奨。
-
USBマイク:シンプルなUSB会議用マイクが最適です。
-
スピーカー:USBまたは3.5mmスピーカー、もしくはI2SアンプHAT。
-
ネットワーク:イーサネットまたはWi-Fi。
-
オプションの便利な機能:ケース、 アクティブクーラー、プッシュトゥトーク用プッシュボタン、LED リング。[1]
OSとベースラインの設定
-
Raspberry Pi OS をフラッシュします。これは、必要なプリセットを備えた起動可能な microSD を作成する簡単な方法です。[1]
-
起動後、ネットワークに接続し、パッケージを更新してください。
sudo apt update && sudo apt upgrade -y
-
オーディオの基本
raspi-configを使用して、デフォルトの出力、レベル、およびデバイスを設定できます。USBおよびHDMIオーディオはすべてのモデルでサポートされています。Bluetooth出力は、Bluetooth搭載モデルで利用可能です。[1] -
デバイスを確認する:
レコード -l 再生 -l
次に、録音と再生をテストしてください。音量レベルがおかしい場合は、マイクのせいにする前にミキサーとデフォルト設定を確認してください。.

建築の概要🗺️
Raspberry Pi を使用した、実用的なフローは次のようになります。
ウェイクワード → ライブ音声キャプチャ → ASR文字起こし → インテント処理またはLLM → 応答テキスト → TTS → 音声再生 → MQTTまたはHTTPによるオプションアクション。.
-
ウェイクワード:Porcupineは小型で高精度であり、ローカルで動作し、キーワードごとの感度制御が可能です。[2]
-
ASR : Whisperは、約68万時間かけて学習された多言語対応の汎用ASRモデルです。アクセントや背景ノイズに強く、デバイス上での使用には
whisper.cppが軽量なC/C++推論パスを提供します。[3][4] -
脳:処理能力に応じて、API経由のクラウドLLM、ルールエンジン、またはローカル推論のいずれかを選択できます。
-
TTS :Piperはローカルで自然な音声を生成し、控えめなハードウェアでも素早い応答が可能なほど高速です。[5]
クイック比較表🔎
| 道具 | 最適な用途 | 価格相応 | なぜそれが機能するのか |
|---|---|---|---|
| ヤマアラシのウェイクワード | 常時監視トリガー | 無料プラン+ | CPU負荷が低く、正確で、バインディングも簡単です[2] |
| Whisper.cpp | Pi 上でのローカル ASR | オープンソース | 精度が高く、CPUに優しい[4] |
| より速いささやき | CPU/GPU上でのASRの高速化 | オープンソース | CTranslate2の最適化 |
| パイパーTTS | ローカル音声出力 | オープンソース | 早口、多言語 [5] |
| クラウドLLM API | 豊かな論理 | 使用量ベース | 重い計算処理をオフロードします |
| Node-RED | 行動の調整 | オープンソース | 視覚的なフロー、MQTT対応 |
ステップバイステップで構築:初めてのボイスループ🧩
ウェイクワードにはPorcupine、文字起こしにはWhisper、応答には軽量な「脳」機能(お好みのLLMに置き換えてください)、音声認識にはPiperを使用します。最小限の構成で始め、改善を重ねていきましょう。.
1) 依存関係をインストールする
sudo apt install -y python3-pip portaudio19-dev sox ffmpeg pip3 install sounddevice numpy
-
Porcupine: 言語用のSDK/バインディングを入手し、クイックスタート(アクセスキー + キーワードリスト + オーディオフレーム →
.process)に従ってください。[2] -
Whisper (CPUフレンドリー): whisper.cpp:
git clone https://github.com/ggml-org/whisper.cpp cd whisper.cpp && cmake -B build && cmake --build build -j ./models/download-ggml-model.sh base.en ./build/bin/whisper-cli -m ./models/ggml-base.en.bin -f your.wav -otxt
上記はプロジェクトの迅速なスタートを反映している。[4]
Pythonがお好みですか?
faster-whisper(CTranslate2) は、性能の低いCPUでは、通常のPythonよりも高速に動作することがよくあります。
2) Piper TTSを設定する
git clone https://github.com/rhasspy/piper cd piper make # お好みの音声モデルをダウンロードします(例:en_US-amy) echo "こんにちは。" | ./piper --model voices/en/en_US-amy-medium.onnx --output_file hello.wav aplay hello.wav
Piperは、複数の音声/言語オプションを備えたデバイス内TTS向けに設計されています。[5]
3) Pythonにおける最小限のアシスタントループ
意図的にコンパクトに設計されています。ウェイクフレーズ(スタブ)を待ち、録音し、 whisper.cpp行い、応答(プレースホルダー)を生成し、Piper経由で音声を出力します。プレースホルダーは、お好みのLLMまたはルールロジックに置き換えてください。
import os, subprocess, wave import sounddevice as sd WAKE_WORD = "hey computer" # 本番環境では Porcupine と交換 [2] RECORD_SECONDS = 6 SAMPLE_RATE = 16000 CHANNELS = 1 WORKDIR = "/home/pi/assistant" ASR_BIN = "/home/pi/whisper.cpp/build/bin/whisper-cli" # [4] ASR_MODEL = "/home/pi/whisper.cpp/models/ggml-base.en.bin" PIPER_BIN = "/home/pi/piper/build/piper" # [5] PIPER_VOICE = "/home/pi/piper/voices/en/en_US-amy-medium.onnx" os.makedirs(WORKDIR, exist_ok=True) def record_wav(path, seconds=RECORD_SECONDS): audio = sd.rec(int(seconds * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=CHANNELS, dtype='int16') sd.wait() with wave.open(path, 'wb') as w: w.setnchannels(CHANNELS); w.setsampwidth(2); w.setframerate(SAMPLE_RATE) w.writeframes(audio.tobytes()) def transcribe(path): cmd = [ASR_BIN, "-m", ASR_MODEL, "-f", path, "-otxt"] subprocess.run(cmd, check=True, cwd=WORKDIR) with open(path.replace(".wav", ".txt"), "r", encoding="utf-8") as f: return f.read().strip() def generate_reply(prompt): if "weather" in prompt.lower(): return "雲は見えませんが、大丈夫かもしれません。念のためジャケットをお持ちください。" return "You said: " + prompt def speak(text): proc = subprocess.Popen([PIPER_BIN, "--model", PIPER_VOICE, "--output_file", f"{WORKDIR}/reply.wav"], stdin=subprocess.PIPE) proc.stdin.write(text.encode("utf-8")); proc.stdin.close(); proc.wait() subprocess.run(["aplay", f"{WORKDIR}/reply.wav"], check=True) print("Assistant ready. Type the wake phrase to test.") while True: typed = input("> ").strip().lower() if typed == WAKE_WORD: wav_path = f"{WORKDIR}/input.wav" record_wav(wav_path) text = transcribe(wav_path) reply = generate_reply(text) print("User:", text); print("アシスタント:", reply) speak(reply) else: print("ループをテストするには、ウェイクフレーズを入力してください。")
真のウェイクワード検出には、Porcupineのストリーミング検出器(CPU負荷が低く、キーワードごとの感度が高い)を統合してください。[2]
本当に効果のあるオーディオチューニング🎚️
ちょっとした修正で、アシスタントが10倍賢く感じられるようになります。
-
マイクとの距離:30~60cmは、多くのUSBマイクにとって最適な距離です。
-
レベル:入力時のクリッピングを回避し、再生を正常に保ちます。コードの不具合を追いかける前にルーティングを修正してください。Raspberry Pi OS では、システムツールまたは
raspi-config。[1] -
室内の音響特性:硬い壁は反響音の原因となるため、マイクの下に柔らかいマットを敷くと効果的です。
-
ウェイクワードのしきい値:感度が高すぎるとゴーストが起動し、厳しすぎるとプラスチックに向かって叫ぶことになります。Porcupineでは、キーワードごとに感度を調整できます。[2]
-
熱対策:Pi 5 での長時間の転写作業は、持続的なパフォーマンスのために公式のアクティブクーラーを使用することで効果が得られます。[1]
おもちゃから家電へ:サービス、自動起動、健康診断 🧯
人間はスクリプトの実行を忘れる。コンピュータは親切であることを忘れる。ループを管理サービスに変換しましょう。
-
systemdユニットを作成します。
[Unit] Description=DIY Voice Assistant After=network.target sound.target [Service] User=pi WorkingDirectory=/home/pi/assistant ExecStart=/usr/bin/python3 /home/pi/assistant/assistant.py Restart=always RestartSec=3 [Install] WantedBy=multi-user.target
-
有効にする:
sudo cp assistant.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now assistant.service
-
ログの末尾:
journalctl -u assistant -f
今では起動時に自動的に起動し、クラッシュ時にも再起動するなど、まるで家電製品のように動作します。少し退屈ですが、ずっと良くなりました。.
スキルシステム:自宅で実際に役立てよう🏠✨
音声入力と音声出力が安定したら、アクションを追加します。
-
インテントルーター:一般的なタスクのためのシンプルなキーワードルーティング。
-
スマートホーム:MQTTにイベントをパブリッシュするか、Home AssistantのHTTPエンドポイントを呼び出します。
-
プラグイン
set_timer、what_is_the_time、play_radio、run_sceneなどの簡単な Python 関数。
クラウドLLMを介在させる場合でも、速度と信頼性を確保するため、明らかなローカルコマンドを優先的にルーティングしてください。.
ローカルのみ vs クラウドアシスト:実感できるトレードオフ🌓
ローカルのみ
メリット: プライベート、オフライン、予測可能なコスト。
デメリット: 重いモデルは小型ボードでは動作が遅くなる場合があります。 Whisper の多言語トレーニングは、デバイス上または近くのサーバーに置いておくと堅牢性が向上します。[3]
クラウドアシストの
利点:強力な推論能力、広いコンテキストウィンドウ。
欠点:データがデバイスから送信される、ネットワークへの依存、変動コスト。
ハイブリッド方式がしばしば勝利する:ウェイクワード + ASRローカル → 推論のためのAPI呼び出し → TTSローカル。[2][3][5]
トラブルシューティング:奇妙なトラブルと簡単な解決策👾
-
ウェイクワードの誤作動: 感度を下げるか、別のマイクを試してください。[2]
-
ASRの遅延:より小さなWhisperモデルを使用するか、リリースフラグ(
-j --config Releasewhisper.cppを。[4] -
合成が途切れ途切れになる場合:よく使うフレーズを事前に生成し、オーディオデバイスとサンプルレートを確認してください。
-
マイクが検出されません。arecord
-lとミキサーを確認してください。 -
熱による性能低下:持続的なパフォーマンスを得るには、Pi 5 に公式のアクティブクーラーを使用してください。[1]
セキュリティとプライバシーに関する注意事項(必ずお読みください)🔒
-
APTを使ってRaspberry Piを常に最新の状態に保ってください。.
-
クラウドAPIを使用する場合は、送信するデータをログに記録し、個人情報は事前にローカルで編集することを検討してください。.
-
サービスは最小限の権限で実行してください。必要な場合を除き、ExecStart で
sudo を -
ゲスト用または静粛時間帯向けに、ローカル専用モードを提供する
ビルドバリエーション:サンドイッチのように自由に組み合わせよう🥪
-
超ローカル:Porcupine + whisper.cpp + Piper + シンプルなルール。プライベートで頑丈。[2][4][5]
-
高速クラウドアシスト:Porcupine + (より小規模なローカルWhisperまたはクラウドASR) + ローカルTTS + クラウドLLM。
-
ホームオートメーションの中心:ルーチン、シーン、センサー用のNode-REDまたはHome Assistantフローを追加します。
スキル例:MQTT経由でライトを点灯💡
import paho.mqtt.client as mqtt MQTT_HOST = "192.168.1.10" TOPIC = "home/livingroom/light/set" def set_light(state: str): client = mqtt.Client() client.connect(MQTT_HOST, 1883, 60) payload = "ON" if state.lower().startswith("on") else "OFF" client.publish(TOPIC, payload, qos=1, retain=False) client.disconnect() # if "turn on the lights" in text: set_light("on")
「リビングのランプをつけて」といった音声セリフを追加すれば、まるで魔法使いになったような気分を味わえます。.
このスタックが実際に機能する理由🧪
-
Porcupineは小型ボード上でのウェイクワード検出において効率的かつ正確であるため、常時リスニングが可能となる。[2]
-
Whisperは多言語に対応した大規模なトレーニングを受けているため、さまざまな環境やアクセントにも柔軟に対応できます。[3]
-
whisper.cpp は、Raspberry Pi のような CPU のみのデバイスでもそのパワーを利用できるようにしています。[4] -
PiperはクラウドTTSに音声を送信することなく、応答を素早く行います。[5]
長すぎて読まなかった
Raspberry Pi を使用して、ウェイクワードに Porcupine、ASR に Whisper ( whisper.cppモジュール式のプライベート DIY AI アシスタントを構築できます。systemd サービスとしてラップし、オーディオを調整し、MQTT または HTTP アクションを組み込みます。想像以上に安価で、不思議と使い心地が良いでしょう。[1][2][3][4][5]
参考文献
-
Raspberry Piソフトウェアと冷却– Raspberry Pi Imager(ダウンロードと使用方法)とPi 5 Active Cooler製品情報
-
Porcupine Wake Word – SDKとクイックスタートガイド(キーワード、感度、ローカル推論)
-
Whisper(ASRモデル) – 多言語対応、堅牢なASR(約68万時間かけて学習済み)
-
Radford 他、 「大規模弱教師あり学習による堅牢な音声認識(Whisper)」:詳細はこちら
-
-
whisper.cpp – CLIとビルド手順を備えたCPUに優しいWhisper推論
-
Piper TTS – 複数の音声・言語に対応した高速ローカルニューラルTTS