Windows 10 IoT Coreで音声制御ロボットを構築 - Raspberry Pi 2編
ストーリー
初期のコンピューティングはパンチカード、トラックボール、キーボードなど、直接的な物理接触を必要としました。技術進化によりワイヤレスとタッチインターフェースがユーザー操作を効率化。今日では視覚と音声入力が、デバイス制御のさらなる直感的な手段となっています。
このガイドでは、Windows 10 IoT Coreに組み込まれた音声認識を活用し、Raspberry Pi 2上で構築したロボットを音声コマンドで操作する方法を示します。最後には、話しかけるだけで移動、旋回、障害物検知のオン/オフができるロボットが完成します。
Windows 10 IoT Coreが初めての方は、概要から始めてください。
2016年3月30日更新
音声認識とは?
音声認識は話し言葉をテキストに変換する技術。一般に信号処理と音声デコーダの2コアコンポーネントで構成されます。Microsoft Speech SDKはこれらの複雑さを抽象化し、開発者がアプリケーションロジックに集中できるようにします。
ステップ1
音声認識の導入
基本ワークフロー:
- 音声認識文法(SRGS)を作成
SpeechRecognizerをインスタンス化し文法を読み込み- 認識イベントを購読しハンドラーを実装
音声認識文法の作成
カスタム文法を定義することで、ロボットが受け付ける特定コマンドを理解可能に。本プロジェクトの語彙:
- 前進
- 後退
- 右旋回
- 左旋回
- 停止
- 障害物検知開始
- 障害物検知停止
文法はSRGS XMLで表現。主要構造ルール:
- ルート要素は
<grammar> version、xml:lang、SRGS名前空間を含む- 少なくとも1つの
<rule>要素が必要 - 各ルールは一意の
id属性を持つ
詳細なSRGSガイダンスはMSDNとW3Cドキュメントを参照。
音声認識エンジンの初期化と文法読み込み
SpeechRecognizerはWindows.Media.SpeechRecognition名前空間に存在。インポート後、SRGS XMLファイルを読み込み。コンパイル失敗時はマイクが接続されIoT Coreで認識されているか確認。
音声認識イベントの登録とハンドラー作成
認識エンジン稼働後、正常に音声解析するとResultGeneratedイベントが発火。このイベントでargs.Result.Textを取得し、ロボットアクションにマッピング。StateChangedイベントでリスニング開始/停止を把握。
Visual StudioならTabキーでハンドラーメソッドを自動生成可能。またはSpeechRecognizerインスタンス作成直後にハンドラー登録。
ステップ2
解析済み音声に基づく走行制御
ResultGeneratedハンドラー内でargs.Result.Textを検査し、条件分岐でロボットモーターを制御。MotorDriverクラス(サンプルに含む)がGPIO操作を抽象化。完全なソースは記事末尾に掲載。
ステップ3
デバイス機能の更新
Raspberry Pi 2へのデプロイ前に、アプリのパッケージマニフェストにmicrophone機能を追加。これによりアプリが音声入力へアクセス可能になります。
ソフトウェア準備完了後、以下のハードウェア配線を行います。
ステップ4
アプリのデプロイとスタートアップ登録
起動直後にコマンド待受けできるよう、アプリをスタートアップアプリケーションとして登録。まずデプロイし、その後PowerShellまたはIoT Core Web管理ポータルで設定。
デプロイ前にパッケージファミリ名を変更し、競合を回避するのが賢明です。
デプロイ後、Web管理ポータルでスタートアップサービスとして登録。
登録問題が発生した場合はトラブルシューティングガイドを参照。
正常登録後、Raspberry Pi 2を再起動し、アプリが自動起動することを確認。
回路図
ロボットハードウェアは、DCモーター搭載シャーシ、Windows 10 IoT Core搭載Raspberry Pi 2、9-12Vモーター用バッテリー、距離センサー、電源で構成。モーターバッテリーがHブリッジドライバーに、Raspberry Pi 2には専用5V電源(USB PowerBankまたは7805レギュレーター)が必要。
超音波距離センサーに抵抗が必要な理由
超音波センサーのEchoピンは5V出力だが、Raspberry Pi 2のロジックレベルは3.3V。分圧抵抗(R1=1kΩ、R2=2kΩ)で3.3Vに降圧:
Vout = 5 × (2kΩ / (1kΩ + 2kΩ)) = 3.3V
警告:Echoピンを直接Pi GPIOに接続するとボード破損。必ずレベルシフターまたは分圧器を使用。
最終組み立て
既知の問題
音声認識が動作しない(ビルド10586)
Windows IoT Coreビルド10586では音声認識が失敗します。
解決策: Microsoftが修正アップデートをリリースするまでビルド10240に戻してください。
マイク問題
低品質マイクでは認識精度が低下、特に1-2m以上の距離で顕著。
解決策: 高品質またはワイヤレスマイクを使用。必要なら信号増幅やノイズキャンセリングヘッドセットを検討。
認識処理遅延
音声認識には600-2000msのレイテンシが発生。高速移動ロボットではコマンドとアクションのズレを招く。
解決策: 現行SDKでは遅延短縮不可。将来のリリースで最適化の可能性。
発音違い
アクセントや地域差が認識に影響。SRGSファイルで言語と地域を指定(例:xml:lang="en-GB"で英国英語)。
環境ノイズ
背景雑音が精度低下の原因。完全除去は困難だが、ノイズキャンセリングマイクで緩和可能。
USBマイク/USBサウンドカードが認識されない
ビルド10531以降、Windows IoT Coreは汎用USBオーディオデバイスをサポート。独自ドライバー使用デバイスは動作しない場合あり。
汎用ドライバー採用の別USBマイク/サウンドカードを試してください。
今後の拡張
視覚フィードバック追加例:成功コマンドで緑LED点灯、エラーで赤LED点灯。「リスニング」「スリープ」状態を設けて誤作動防止。
気づきましたか?
アニメーションタイトルには本文未記載の機能が隠されています。アニメーションをよく観察し、隠れた機能の実装に挑戦してみてください。
頑張って!
出典: 音声制御ロボット
製造プロセス
- Windows 10 IoT Core on Raspberry Piで心拍パルスを読み取る - ステップバイステップガイド
- Windows IoTとRaspberry Piで作るセキュアな顔認証ドアロック
- Raspberry Pi、PIRセンサー、MQTTで作るモーション制御AWS IoTボタン
- Raspberry Pi 2からAzure Event HubsへAdafruit 10DOF IMUデータを送信(Windows 10 IoT Core)
- Windows 10 IoT CoreとSHT15センサーで高精度な温湿度モニタリング
- Raspberry Pi 3 Model B+へのWindows 10 IoT Coreインストール:ステップバイステップガイド
- Bluetooth 制御 Raspberry Pi ロボットに音声フィードバックを追加して構築
- Raspberry Pi でジェスチャー制御ロボットを構築 – 加速度センサーと RF 通信でハンドフリー操作
- Raspberry Pi & Android スマホで Wi-Fi 制御ロボットを構築
- GoPiGo v2をWindows 10 IoT Coreで拡張 - Raspberry Pi 3対応
- Pythonで作るWi-Fi制御Raspberry Piロボット - ステップバイステップガイド