Raspberry Pi を使って自作の AI アシスタントを構築する方法

Raspberry Pi を使って自作の AI アシスタントを構築する方法

指示通りに動いてくれて、自分のハードウェアで動作し、聞き間違いでパイナップルを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とベースラインの設定

  1. Raspberry Pi OS をフラッシュします。これは、必要なプリセットを備えた起動可能な microSD を作成する簡単な方法です。[1]

  2. 起動後、ネットワークに接続し、パッケージを更新してください。

sudo apt update && sudo apt upgrade -y
  1. オーディオの基本raspi-configを使用して、デフォルトの出力、レベル、およびデバイスを設定できます。USBおよびHDMIオーディオはすべてのモデルでサポートされています。Bluetooth出力は、Bluetooth搭載モデルで利用可能です。[1]

  2. デバイスを確認する:

レコード -l 再生 -l

次に、録音と再生をテストしてください。音量レベルがおかしい場合は、マイクのせいにする前にミキサーとデフォルト設定を確認してください。.

 

AIラズベリーパイ

建築の概要🗺️

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]


おもちゃから家電へ:サービス、自動起動、健康診断 🧯

人間はスクリプトの実行を忘れる。コンピュータは親切であることを忘れる。ループを管理サービスに変換しましょう。

  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
  1. 有効にする:

sudo cp assistant.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now assistant.service
  1. ログの末尾:

journalctl -u assistant -f

今では起動時に自動的に起動し、クラッシュ時にも再起動するなど、まるで家電製品のように動作します。少し退屈ですが、ずっと良くなりました。.


スキルシステム:自宅で実際に役立てよう🏠✨

音声入力と音声出力が安定したら、アクションを追加します。

  • インテントルーター:一般的なタスクのためのシンプルなキーワードルーティング。

  • スマートホーム:MQTTにイベントをパブリッシュするか、Home AssistantのHTTPエンドポイントを呼び出します。

  • プラグイン set_timerwhat_is_the_timeplay_radiorun_sceneなどの簡単な Python 関数。

クラウドLLMを介在させる場合でも、速度と信頼性を確保するため、明らかなローカルコマンドを優先的にルーティングしてください。.


ローカルのみ vs クラウドアシスト:実感できるトレードオフ🌓

ローカルのみ
メリット: プライベート、オフライン、予測可能なコスト。
デメリット: 重いモデルは小型ボードでは動作が遅くなる場合があります。 Whisper の多言語トレーニングは、デバイス上または近くのサーバーに置いておくと堅牢性が向上します。[3]

クラウドアシストの
利点:強力な推論能力、広いコンテキストウィンドウ。
欠点:データがデバイスから送信される、ネットワークへの依存、変動コスト。

ハイブリッド方式がしばしば勝利する:ウェイクワード + ASRローカル → 推論のためのAPI呼び出し → TTSローカル。[2][3][5]


トラブルシューティング:奇妙なトラブルと簡単な解決策👾

  • ウェイクワードの誤作動: 感度を下げるか、別のマイクを試してください。[2]

  • ASRの遅延:より小さなWhisperモデルを使用するか、リリースフラグ( -j --config Release whisper.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]


参考文献

  1. Raspberry Piソフトウェアと冷却– Raspberry Pi Imager(ダウンロードと使用方法)とPi 5 Active Cooler製品情報

  2. Porcupine Wake Word – SDKとクイックスタートガイド(キーワード、感度、ローカル推論)

  3. Whisper(ASRモデル) – 多言語対応、堅牢なASR(約68万時間かけて学習済み)

    • Radford 他、 「大規模弱教師あり学習による堅牢な音声認識(Whisper)」:詳細はこちら

  4. whisper.cpp – CLIとビルド手順を備えたCPUに優しいWhisper推論

  5. Piper TTS – 複数の音声・言語に対応した高速ローカルニューラルTTS

公式AIアシスタントストアで最新のAIを見つけよう

私たちについて


ブログに戻る