メインコンテンツまでスキップ

reSpeaker Flex で SO-ARM10x に音声インタラクションを追加する

概要

pir

LeRobot SO-ARM Voice Controller を使うと、AI を活用した自然な音声コマンドで SO-ARM100 ロボットアームを制御できます。このシステムは、ウェイクワード検出、Groq Whisper 音声認識(STT)、LLaMA 3 による言語理解、Orpheus 音声合成(TTS)を組み合わせ、完全なハンズフリーのインタラクティブなロボティクス体験を実現します。LeRobot framework の上に構築されており、Ubuntu x86 システムおよび NVIDIA Jetson デバイス上で動作し、音声入力には ReSpeaker USB マイクアレイを使用します。ユーザーはカスタムのアームポーズ、ジェスチャー、会話トリガーを作成して、研究、教育、ロボット開発向けのインテリジェントなロボットインタラクションを構築できます。

必要なハードウェア

SO-ARM101reSpeaker Flex XVF3800 CircularreComputer Super J4012

動作の仕組み

You speak → Wake word detected → Audio recorded → Whisper STT → LLaMA LLM → Orpheus TTS speaks back → SO-ARM100 moves

必要なサービス

サービス用途コスト
GroqWhisper STT、LLaMA LLM、Orpheus TTS無料枠で十分

パート 1 — LeRobot をインストールする

Miniforge をインストール

Jetson(ARM64)の場合:

wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh
chmod +x Miniforge3-Linux-aarch64.sh
./Miniforge3-Linux-aarch64.sh
source ~/.bashrc

x86 Ubuntu 22.04 の場合:

wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3-$(uname)-$(uname -m).sh
source ~/.bashrc
conda init --all

Conda 環境を作成する

conda create -y -n lerobot python=3.10
conda activate lerobot

LeRobot をクローンしてインストール

git clone https://github.com/KasunThushara/lerobot
conda install ffmpeg -c conda-forge
cd lerobot
pip install -e ".[feetech]"

パート 2 — アームをセットアップする

モーター ID を設定する

各サーボには、組み立て前に一意の ID を割り当てる必要があります。公式ガイドに従ってください: Configure the Motors

アームを組み立てる

SO-ARM100 の組み立てチュートリアルに従ってください: Assembly Guide

USB ポートを確認する

各アームを接続し、次のユーティリティを実行して、どのポートがどのアームに対応しているかを特定します:

lerobot-find-port

各アームごとに 1 回ずつ実行します(1 本ずつ接続してください)。ポートパスをメモしておきます — 通常は /dev/ttyACM0/dev/ttyACM1 です。

両方のアームをキャリブレーションする

キャリブレーションでは、生のモーター値を正規化された位置にマッピングします。リーダーアームとフォロワーアームの両方について、次のガイドに従ってください: Calibration Guide

キャリブレーションファイルは自動的に次の場所に保存されます:

~/.cache/huggingface/lerobot/calibration/robots/so_follower/<your_arm_id>.json


パート 3 — ボイスコントローラーをセットアップする

cd ~/lerobot/examples/voice_arm

依存関係をインストール

# System dependency required for PyAudio
sudo apt-get install -y portaudio19-dev

pip install -r requirements.txt

ウェイクワードモデルをダウンロード

事前学習済みの "Hey Jarvis" モデルを openwakeword から ~/.openwakeword/ にダウンロードします:

python download_model.py

マイクのインデックスを確認する

ReSpeaker Flex を接続し、次を実行します:

python list_mics.py

出力例:

Available audio INPUT devices:

[0] bcm2835 Headphones (rate=44100Hz)
[1] ReSpeaker 4 Mic Array (rate=16000Hz)
[2] USB PnP Sound Device (rate=16000Hz)

ReSpeaker の横に表示されるインデックス番号をメモします — これが MIC_INDEX です。

プロジェクトを設定する

cp config.env.example config.env
nano config.env

最低限、次の 2 つの値を更新します:

# Your Groq API key (required) — get one free at console.groq.com
GROQ_API_KEY=gsk_xxxxxxxxxxxxxxxxxxxxxxxx

# The number from list_mics.py
MIC_INDEX=1

パート 4 — アームアクションを定義する

ステップ 1 — 現在の関節位置を読み取る

保存したいポーズになるようにアームを手で動かし、次を実行します:

python read_positions.py

スクリプトは、アームを動かしている間、正規化された関節値をリアルタイムで出力します。ポーズが決まったら Ctrl+C を押すと、最終位置が表示されるので、それをコピーします。

ステップ 2 — robot_arm.py にポーズを追加する

robot_arm.py を開き、ACTION_MAP 辞書を探します。そこにポーズを追加します:

pir

"my_custom_pose": _pose(**{
"shoulder_pan.pos": 20.0,
"shoulder_lift.pos": 40.0,
"elbow_flex.pos": 60.0,
"wrist_flex.pos": -30.0,
"gripper.pos": 80.0,
}),

ウェーブのようなアニメーションジェスチャーには、ポーズのリストを使用します — 各ステップはその間に ARM_GESTURE_DELAY を挟んで実行されます:

"wave_hi": [
_pose(**{"shoulder_lift.pos": -70.0, "wrist_flex.pos": 60.0, ...}),
_pose(**{"shoulder_lift.pos": -70.0, "wrist_flex.pos": -60.0, ...}),
_HOME, # return to neutral
],

ステップ 3 — llm.py の LLM システムプロンプトを更新する

新しいアクションを有効なアクションリストとトリガールールに追加し、LLM がそれを認識できるようにします:

pir

Valid actions:
my_custom_pose = describe what it does

Trigger rules:
- "your trigger phrase" → my_custom_pose

ボイスコントローラーを実行する

conda 環境がアクティブになっていることを確認し、次を実行します:

conda activate lerobot
python pipeline.py

次のような表示が出ます:

======================================================
SO100 Arm Voice Controller — Ready
Wake word : hey jarvis
LLM model : llama-3.1-8b-instant
STT model : whisper-large-v3-turbo
TTS voice : autumn
Arm port : /dev/ttyACM0 id='my_awesome_follower_arm'
======================================================
[WakeWord] Listening for 'hey jarvis' ...

ここで "Hey Jarvis" と話しかけて、コマンドを出してみましょう!

音声コマンドの例

あなたの発話動作内容
"Hey Jarvis, open the gripper"グリッパーが全開になる
"Hey Jarvis, grab it"グリッパーが閉じる
"Hey Jarvis, go to pick up mode"アームが把持用のポーズに移動する
"Hey Jarvis, can you turn around"ベースが横方向に回転する
"Hey Jarvis, wave at the camera"アームが手を振り、ニュートラルポジションに戻る
"Hey Jarvis, go home"すべての関節がニュートラルポジションに戻る

プロジェクトファイル概要

examples/voice_arm/
├── pipeline.py # Main entry point — orchestrates the full flow
├── robot_arm.py # SO100 arm controller — add your poses here
├── llm.py # LLM prompt — add your voice triggers here
├── wakeword.py # Listens for "Hey Jarvis" in a background thread
├── audio_recorder.py # Records audio after wake word fires
├── stt.py # Sends audio to Groq Whisper → returns text
├── tts.py # Sends reply to Groq Orpheus → plays audio
├── config.py # Loads all settings from config.env
├── config.env.example # Template — copy to config.env and fill in
├── read_positions.py # Helper: read live joint positions for tuning poses
├── list_mics.py # Helper: find your MIC_INDEX
└── download_model.py # Downloads the openwakeword model files

設定リファレンス

変数デフォルト説明
GROQ_API_KEY(required)Groq の API キー
WAKEWORD_MODELhey jarvisウェイクワードのフレーズ
MIC_INDEX1PyAudio デバイスインデックス
WAKEWORD_THRESHOLD0.5検出感度(0.0–1.0)
WAKEWORD_COOLDOWN2再トリガーまでの秒数
RECORDING_SECONDS3ウェイクワード検出後に録音する時間(秒)
LLM_MODELllama-3.1-8b-instantGroq の LLM モデル
STT_MODELwhisper-large-v3-turboGroq Whisper モデル
TTS_VOICEautumn音声出力に使用するボイス
ARM_PORT/dev/ttyACM0フォロワーアームの USB ポート
ARM_IDmy_awesome_follower_armアーム ID(キャリブレーションファイル名と一致)
ARM_MOVE_DELAY1.5ポーズ移動後に待機する秒数
ARM_GESTURE_DELAY0.4ジェスチャーシーケンス各ステップ間の秒数

トラブルシューティング

PyAudio のインストールに失敗する まず PortAudio システムライブラリをインストールします:

sudo apt-get install -y portaudio19-dev

ウェイクワードが反応しない list_mics.py をもう一度実行し、MIC_INDEX が ReSpeaker と一致していることを確認します。WAKEWORD_THRESHOLD0.3 に下げてみてください。マイクから約 1 メートル以内で、はっきりと話してください。

コマンド後にアームが動かない ARM_PORT が正しいことを確認します(lerobot-find-port)。キャリブレーションファイルが ~/.cache/huggingface/lerobot/calibration/robots/so_follower/<ARM_ID>.json に存在することを確認します。

アームが誤った位置に動く ACTION_MAP のデフォルトポーズ値は初期推定値です。read_positions.py を実行し、アームを目的のポーズに物理的に動かしてから、表示された値を robot_arm.py にコピーします。

TTS / STT のエラー config.env 内の GROQ_API_KEY を再確認します。Groq の無料枠にはレート制限があります — エラーが発生した場合は、コマンドの間を数秒あけてください。

音声は再生されるが歪んで聞こえる Raspberry Pi では、raspi-config → System Options → Audio から、オーディオ出力を正しいデバイスに設定します。


クレジット

以下を利用して構築されています:

  • LeRobot — Hugging Face によるオープンソースのロボティクスフレームワーク
  • SO-ARM100 — Seeed Studio による低コストのオープンソースロボットアーム
  • openwakeword — ローカルのウェイクワード検出
  • Groq — 超高速な Whisper STT、LLaMA LLM、Orpheus TTS
  • ReSpeaker Flex — USB マイクアレイ
Loading Comments...