VoiceCAP
- 2018-05-21 初版 Raspberry Pi Zero用音声操作リモコン登場
- 2018-05-23 第2版 NOOBS 2.8.1対応
- 2018-06-14 第3版 故障かなと思ったら
- 2018-07-08 第4版 赤外線解析の機能追加
- 2019-03-28 第5版 kernel 4.18.x対応、Julius 4.5対応
- 2019-03-28 第6版 英語版
- 2021-11-22 第7版 bullseye対応
- 2023-10-24 第8版 bookworm対応
- 2024-03-07 第9版 Raspberry Pi 5対応
- 2024-05-01 第10版 bookworm対応(6.6.28)
はじめに
- VoiceCAPはラズベリー・パイZero用音声操作リモコンの拡張ボードです。
- ラズベリー・パイZero(Raspberry Pi)にVoiceCAPをセットします。
- ラズパイマガジン2018年6月号の付録基板として誕生しました。
- 使い方はラズパイマガジン2018年6月号をご覧ください。
- 電子書籍はこちらです。
- 紙の本はこちらです。
- ここではすべての解説を行いません。
- 補足のみを行います。
- 完成品と部品セットがあります。
- 完成品をお勧めします。
- 上級者向けの組み立てキットです。表面実装部品があります。誰もが組み立てられるわけではありません。
VoiceCAPの特徴
- マイクから音声を取り込み、赤外線リモコンを送信します。
- 認識する音声を事前に登録しておきます。もちろん自分好みに変更可能です。
- 送信すべき赤外線リモコン情報を受信しておきます。
- ※起動ワードを自分好みに変更すると面白いでしょう。初期設定は「ぽち」です。
- ネットに接続することなく、単独で使用できます。つまりポータブルです。
- Zeroと同じサイズのため、小型軽量です。
- 別途ステレオマイクロホンが必要です。
- ※音はでません。
英語版とディレクトリ構成の変更
- 英語による音声認識です。英語の発音勉強になるかもしれません。
- Juliusは英語の発音も認識します。
- VoiceCAP(English)詳細はこちら
- この対応のためにディレクトリを整理しました。
- Driver --- PCM1808用ドライバ
- Remocon --- 音声認識後のコマンド用ディレクトリ
- Tools --- テスト用ディレクトリ
- install.sh --- 英語版インストール・スクリプト
- setup.sh --- 日本語版インストール・スクリプト
- en --- 英語版の設定ディレクトリ
- ja --- 日本語版の設定ディレクトリ
- 日本語版か英語版のどちらかをインストールします。同時に利用はできません。
著作権と免責事項
- 個人利用に限定され、著作権者の許可なく商用利用できません。
- 直接間接に関わらず、使用によって生じたいかなる損害も筆者は責任を負いません。
- VoiceCAP (C)2018 All rights reserved by Y.Onodera.
情報のまとめ
動作確認情報
- 2024-03-04現在
- Raspberry Pi 2B/3B/3B+/4B/5B/Zero/ZeroW/Zero2W
- NOOBS 3.0(kernel 4.14.x、4.18.x、4.19.x)
- NOOBS 3.2(kernel 4.19.x)
- bullseye (kernel 5.10.x)
- bullseye (kernel 6.1.x)
- bookworm (kernel 6.1.x)
- bookworm (kernel 6.6.x)
- Julius 4.6
- ※Raspberry Pi 3A+は未確認です。
- ※Lite版は未確認です。一部パッケージがインストールされていないことがあります。
- Raspberry Pi 4 の注意事項はこちらです。
- Raspberry Pi 5 の注意事項はこちらです。
bookworm対応(6.6.28)
- 6.6.28からカーネルドライバーの扱いが大幅に書き換えられています。
- この影響でi2sドライバが動かなくなりました。
- 従来はi2sのmasterとslaveをドライバ側で記述していました。
- これをデバイスツリーでも明確にしました。
- i2s_clk_producerとi2s_clk_consumerで識別します。
- masterはclkを生成し(供給)、slaveはclkを消費します(需要)。
- ラズパイ側のi2sがmasterかslaveで動作します。
- kernelを6.6.20から6.6.28に変更したとき動かなくなりました。
- はじめは何が起こっているのかわかりませんでした。
- この変更はkernelのソースを見ないとわかりません。
- たまにカーネルの大幅な書き換えが行われます。
- これにぶつかったときカーネルドライバーが動かなくなります。
RPI5:Raspberry Pi 5対応
- RPI5は多くの変更をしました。
- そのためRPI5対応しました。
- 多くのGPIO用Cライブラリ、PythonライブラリがRPI5に対応していません。
- WiringPiは廃止しました。
- GPIOのsysfs方式は廃止の予定です。libgpiod方式へ切り替えました。
- libgpiod方式はLinuxの標準機能として組み込まれています。
- 今後の主流になるでしょう。RPI5にも対応済みです。
- このため使用するライブラリをlibgpiodに変更しました。
- しばらく安心して使い続けられるでしょう。
- RPI5対応したgpiozeroライブラリも使います。
- gpioの代替コマンドraspi-gpioは廃止されました。pinctrlに切り替えました。
kernelのソースコード解析
- さらっとkernel 4.18.x対応と書いていますが、簡単ではありませんでした。
- 最新のkernelで問題が発生することから、ネットを検索しても答えは見つかりません。
- kernelのソースコードを解析し、原因を究明しました。
- 高度な論理的思考が必要であり、kernelのソースコードを読み解かなければなりません。
入手先情報
ご注意
スマホ専用のマイクを使えません。
- スマホ用のマイクは端子が異なるため使用できません。
- 一般的なステレオマイクを利用してください。
- スマホ専用マイクは4極端子です。
- ステレオマイクは3極端子です。
- スマホ専用マイクは本来イヤホン出力とマイク入力を兼用しており、イヤホン出力を省略しているだけです。
VoiceCAPインストール時エラー(NOOBS 3.0 で sudo rpi-update を実行後発生)
- 対象:NOOBS 3.0 + sudo rpi-update
- 原因:参照するカーネルのソースをダウンロード後、展開できない。ソースが壊れている。
- 現象:Makefile:595: include/config/auto.conf: そのようなファイルやディレクトリはありません
- 回避策:sudo rpi-update を実行しない。実行後のカーネル 4.19.x で発生する。実行前のカーネル 4.14.x では発生しない。
- 備考:最新バージョンが必ずしも良いとは限らない例です。
VoiceCAPインストール時エラー(NOOBS 2.8.1では発生しません)
- 対象:NOOBS 2.6.0/2.7.0/2.8.0
- 原因:参照するカーネルのソースをダウンロードし展開するが、ソースが壊れているために途中で止まる。
- 現象:Expose hardware/virtual IRQ mapping via debugfs (IRQ_DOMAIN_DEBUG) [N/y/?] ここで止まる。
- 回避策:sudo rpi-update 後リブート
- ご注意:VoiceCAPを正常にインストール完了後、再度回避策を実行すると動かなくなります。先に実行してもよいですが、後で実行してはいけません。
カーネルを更新してはいけない理由
- 例を示します。
- ドライバを生成したときのカーネルバージョン= 4.9.80
- カーネルを更新したときのカーネルバージョン= 4.14.34
- Linuxはドライバのバージョンを監視しています。
- バージョンが異なると異物とみなし、ドライバを起動しません。
- そのため、arecord -lで確認すると見つかりません。
- ※ドライバとはPCM1808用のドライバです。VoiceCAPをインストール時に生成します。
NOOBS 2.8.1の動作問題(一時的な対策です、最新のダウンロードでは不要です)
- 対象:NOOBS 2.8.1
- 原因:snd-pcm-oss モジュールがOS(カーネル)から削除された
- 現象:failed to begin input stream
- 回避策:sudo apt-get -y install osspd-alsa
参考(NOOBS 2.8.1 の uname -a)
- $ uname -a
- Linux raspberrypi 4.14.34+ #1110 Mon Apr 16 14:51:42 BST 2018 armv6l GNU/Linux
- sudo rpi-updateを実行していません。
- NOOBS 2.8.0から 2.8.1 でカーネルのバージョンが大幅にジャンプしています。
特殊仕様の赤外線リモコンには対応していません。
- 例えば一度に異なるデータを続けて送信するリモコンがあります。(リピートではありません。)
- 送信 A
- 送信 B
- 個別に問い合わせをいただいても、対応できません。
補足説明
CPU負荷軽減
- ZeroではGUIの負担が大きいため、CLIに切り替えることをお勧めします。
- 具体的にはラズベリーパイ設定のブートをCLIに設定します。
- 起動時間が短くなります。
- なお、音声認識起動時のCPU負荷は約35%程度です。
OSの停止方法
- ボタンスイッチを5秒以上長押しするとシャットダウンします。
- アクセスLEDが消えたら、USB電源を切れる状態です。
赤外線送受信コマンド
- sudo をつけて実行してください。
- $ sudo ./getIR2
- $ sudo ./setIR2 AEHA 48 2 32 176 0 61 141
動作検証済みNOOBS
- NOOBS 2.6.0/2.7.0/2.8.0/2.8.1/3.0
古いNOOBSのダウロード先
マイクの自作
- コンデンサマイクの自作取り付け方法です。
- VoiceCAPのマイク端子に直付けすることもできます。
- 部品としてコンデンサマイク(XCM-6035あるいはC9767)を2つ用意します。
- 2端子(プラスとマイナス)を持ち、極性があります。
- マイナス端子をGND側に接続します。
Linuxのサウンド構造
- Linuxではサウンドもいくつかの選択肢があります。
- OSS:Open Sound System
- ALSA:Advanced Linux Sound Architecture
- JuliusはOSSをデフォルトにしてます。
- /etc/modulesでsnd-pcm-ossを読み込むように設定しています。
- Linuxは徐々にOSSからALSAに切り替わりつつあります。
故障かなと思ったら
- 個別の問い合わせに対応できません。
- ※個別に状況が異なるため、対応のしようがありません。
- サポート料金をいただかなければなりません。労働は無料ではありません。
- その代わりに原因を切り分ける方法を下記に示します。
その前に
- まず指示に従ってください。
- 自分勝手な解釈をしないでください。
- 指示に従わず、自分勝手な解釈をすれば動かないのは当然です。
- 専用のマイクロSDカードを用意し、フォーマットしましたか。使いまわしはいけません。
- NOOBSをダウンロードし、OSをインストールしましたか。
- 動かないのでどこかを修正すれば、直るだろうと考えないでください。泥沼にハマります。時間を無駄にします。
- はじめからまっさらな状態でインストールしてください。数時間で解決します。結果的に早く解決します。
- ※なぜこんな初歩的な話をするかといえば、はじめから指示に従っていなかった原因があまりにも多いからです。
赤外線受信の確認
- 以下のコマンドで何度か確認してください。一度ではダメです。データがばらつくようでしたら、特殊な赤外線コードの可能性があります。
- $ sudo ./getIR2
- このとき赤外線リモコンのボタンを長押ししないでください。リピートコードなどが送信されるためです。
- 赤外線コードがばらつく例としては一度に2つの異なるデータを送信している時です。
- 送信 A
- 送信 B
- あるときは A を受信し、ある時は B を受信します。
- さらに、一度に複数回繰り返し送信する機種があります。例えば、SONY方式は3度繰り返します。
- 古いリモコンは特殊な方式の可能性があります。
- 電子機器の型番と赤外線でリモコン方式をネット上で検索してください。NEC方式、家電製品協会方式なら動作する可能性があります。
- ※特殊な赤外線仕様には対応できません。
赤外線送信の確認
- デジカメやスマホのカメラ機能を利用し、赤外線LEDを観察してください。
- 目には見えませんが、デジカメなら確認できます。
- 以下のコマンドで送信すると一瞬光ります。
- $ sudo ./setIR2 AEHA 48 2 32 176 0 61 141
- 光らないようなら、ハードに問題があります。
- LEDの向きを間違えたり、ハンダ不良の可能性があります。
- 解析したデータを送信しても電子機器が反応しない場合、繰り返し送信が必要かもしれません。
- ネット上で電子機器の赤外線方式を調べてください。
- ※特殊な赤外線仕様には対応できません。
PCM1808用ドライバの動作確認
- PCM1808ドライバが正しくインストールされていないと、音声入力できません。
- 一旦Juliusを停止します。
- $ cd ~/VoiceCAP/Remocon
- $ ./stop.sh
- 入力デバイスのリストを確認します。これは正常な例です。
- $ arecord -l
- **** List of CAPTURE Hardware Devices ****
- card 0: sndrpipcm1808ad [snd_rpi_pcm1808_adc], device 0: PCM1808 ADC HiFi pcm1808-dai-0 []
- Subdevices: 0/1
- Subdevice #0: subdevice #0
- 入力デバイスが認識されていないと何も表示しません。
- VoiceCAPのインストールに失敗しているか、あとでカーネルを更新してしまい、ドライバを動かなくした可能性があります。
- ドライバを再構築するか、フォーマットしてOSからインストールしなおしてください。
マイク録音の確認
- マイクから正しく音声録音できるか確認します。
- 一旦Juliusを停止します。
- $ cd ~/VoiceCAP/Remocon
- $ ./stop.sh
- 10秒間録音します。
- $ arecord -vD hw:0,0 -c 2 -d 10 -r 48000 -f S16_LE test.wav
- 生成したtest.wavを再生して音声が記録されているか確認してください。
- Zero上では再生できないのでPCで再生してください。
- 無録音だったり、ノイズだらけならマイク端子の接触不良です。
- マイク端子を布できれいにしてください。
- 間延びしているときは、AD変換レートの設定間違いです。
- ハンダジャンパーの設定が48kHzになっているか確認してください。
- SJ1=オープン、SJ2=オープン、SJ3=ショート
- ※それでもマイクから音声録音できないなら、キットを組み立てた場合、どこかにハンダ不良があります。
音声認識の動作確認
- 音声認識ソフトのJuliusを単独テストします。
- Juliusが正しくインストールされ、音声入力できれば音声認識します。
- 一旦Juliusを停止します。
- $ cd ~/VoiceCAP/Remocon
- $ ./stop.sh
- Juliusを単独テストします。
- $ cd ~/VoiceCAP
- $ ./test.sh
- 正常なら「ぶどう」「みかん」という言葉を認識します。
- 終了はCTRL+Cです。
- 起動しなかったり、エラーなら、その原因を調査してください。
赤外線リモコンの研究
特殊なリモコンの例(NationalのエアコンA75C2590)
- 古いNationalエアコン(Panasonicではありません)の例です。
- ネットでリモコン方式を調べると、家電製品協会方式で連続で2つのデータを送信することがわかりました。
- このような送信を行わなければなりません(このデータで反応するとは限りません)。
- $ sudo ./setIR2 AEHA 64 2 32 224 4 0 0 0 6
- $ sudo ./setIR2 AEHA 152 2 32 224 4 0 57 56 128 175 173 0 14 224 64 0 129 0 57 59
- 一つだけ送信しても反応しません。
特殊なリモコンの例(IODATAのテレビ)
- IODATAのテレビの例です。
- ネットでリモコン方式を調べると、NEC方式で連続で2つのデータを送信することがわかりました。
- このような送信を行わなければなりません(このデータで反応するとは限りません)。
- $ sudo ./setIR2 NEC 32 128 232 36 219
- $ sudo ./setIR2 NEC 32 128 232 208 47
- 一つだけ送信しても反応しません。
連続データの解析方法
- ※最新のソフトをダウンロードください。古いソフトでは機能しません。
- 機能を追加し、便利にしました。
- 連続でデータ解析します。高速に連続解析します。
- 最大10回です。たまにノイズを拾うことがあるため、10回以下のこともあります。
- $ cd ~/VoiceCAP/Remocon
- $ sudo ./getIR2 -n
- 長押しするとリピートコードを受信します。
- NEC 32 56 199 132 123
- NEC 0
- NEC 0
- 認識した方式の次の数値はビット数を意味します。
- ビット数がゼロの場合、リピートコードです。
リピートコードの送信方法
- ※最新のソフトをダウンロードください。古いソフトでは機能しません。
- リピートコード送信を追加しました。
- $ cd ~/VoiceCAP/Remocon
- NEC方式のリピートコードを送信します。
- $ sudo ./setIR2 NEC 0
- 家電製品協会方式のリピートコードを送信します。
- $ sudo ./setIR2 AEHA 0
SONY方式について
- ※最新のソフトをダウンロードください。古いソフトでは機能しません。
- こちらに動作確認する機器がないため、動作保証できません。
- SONY方式で動作確認できた方がおりましたら、掲示板にレポートをお願いします。
- $ cd ~/VoiceCAP/Remocon
- SONY方式の受信例です。
- $ sudo ./getIR2
- SONY 12 128 0
- SONY方式の送信例です。SONY方式は一度に3度送信を繰り返します。
- $ sudo ./setIR2 SONY 12 128 0
ダウンロード・ファイル
- 更新することがあり、最新版をダウンロードください。
正誤表
- 現在のところありません。
- ディレクトリ構成が変更されています。表4のようになりません。
改善情報
- kernel 5.8.xでカーネルの関数が変更されたため、対応しました。
- kernel 5.3.xでカーネルの関数が変更されたため、対応しました。
- kernel 4.18.xでカーネルの関数が変更されたため、対応しました。
- Julius 4.5で文字コードが変更されたため、対応しました。
- NOOBS 2.8.1で snd-pcm-oss モジュールがOSから削除されたため、対応しました。
- 具体的にはJuliusの音声入力をOSSからALSA経由に変更しました。
- 再度ダウンロードください。
©2018-2024 All rights reserved by Y.Onodera.