やりたいこと
音による通知や警告は音素材があればいくらでもできるけど、Raspberry Pi4B のマシンパワーなら任意の文章を喋らせることももしかして可能?
と思って調べたら可能っぽかったので、じゃぁ、通知や警告を音でなく声でやってみようかな、と。
手順の概要:実は超簡単になってる
1.Python の仮想環境を構築
2.VOICEVOX CORE のインストール
3.実行&再生
※ ONNX や OpenJTalk の手動でのインストールは不要。VOICEVOX CORE に含まれてるから。
必要なもの
今回は単純に Raspberry Pi4B だけあれば OK。
必要に応じて USB スピーカーとかヘッドホンとかかな。
たぶん、普通は HDMI で接続されたモニタから音が出せるから、モニタがあればそれでもいいね。
ソフトウェア的には Python が必要。
Python の仮想環境も合わせて使用できるようにしておくと良い。(詳細は省く)
インストール
alsa-utils のインストール
音声ファイルは wav 形式で生成されるけど、それを再生するには aplay を使う。
が、うちではまだインストールされてなかったので、インストールした。
$ sudo apt install alsa-utils
Python の仮想環境を作成してアクティブにする
$ python3 -m venv voiceVox
$ cd voiceVox
$ source ./bin/activate
(voiceVox) ~/voiceVox $
プロンプトの先頭が(voiceVox)になっていればOK。
※もちろん、仮想環境用のディレクトリは voiceVox じゃなくても OK で、わかりやすい名前にしてね。
尚、仮想環境から抜けるには以下のコマンド。
$ deactivate
VOICEVOX CORE のインストール
以下の URL から最新のバージョンを確認する。
Python wheel という項目を参照し、Raspberry Pi なら aarch64.whl となっているものを探す。
この記事を書いている時点では 0.15.5 が最新なので、実行する各コマンドはそれをベースにしている。
で、pip を使用してインストールする。
(voicevox) ~/voiceVox $ pip install https://github.com/VOICEVOX/voicevox_core/releases/download/0.15.5/voicevox_core-0.15.5+cpu-cp38-abi3-linux_aarch64.whl
(0.15.5となっているところが2か所あるけど、そこを適宜適切なバージョン番号に置き換えて実行する)
そして、wheel パッケージは Ver 0.15.5 で 1.2GB ほどあるので、しばらく待ちます。
wheel パッケージのインストールが終わったら、ダウンローダーというものがあるので、それを入手して環境を構築していく。
(voicevox) ~/voiceVox $ binary=download-linux-arm64
(voicevox) ~/voiceVox $ curl -sSfL https://github.com/VOICEVOX/voicevox_core/releases/latest/download/${binary} -o download
(voicevox) ~/voiceVox $ chmod +x download
(voicevox) ~/voiceVox $ ./download
download 実行後もしばらく時間がかかるので待つ。
この辺りの作業は、以下URLの内容ほぼほぼそのまま。
実行&再生
1.しゃべらせたい文章を入力して、音声ファイルを作る
2.出来上がった音声ファイルを再生する
という手順になるわけだけど、スクリプトが純正の run.py ではダメだった。
下記の方の voicevox.py で問題なく動いたので、こちらを拝借させて頂き、ちょっと加筆して使ってる。
尚、このスクリプトは voicevox_core 内にとりあえず配置した。
なぜ voicevox_core 内かと言うと、ONNX の DLL も OpenJTalk の DLL もそこにあるから。
(voicevox) ~/voiceVox $ cd voicevox_core
(voicevox) ~/voiceVox/voicevox_core $ python3 ./voiceCreate.py "石の上に三年 も待ってられない!"
(voicevox) ~/voiceVox/voicevox_core $ aplay voice.wav
これでテキストを適当に流し込んで再生、ってやればいろいろ喋ってもらえる。
調べれば調べるほどわからなくなる!?
色々検索して調べてみると、過去記事の為か、なかなかうまくいかないといった記述や、ONNX、OpenJTalkのインストールを手動で行っている記事なども多く見かける。
けど、やっぱり公式なのよ。見るべきは。
上記URLが「サンプル実行」のページになるけど、やってることはほぼほぼこれ。
そして、それほど煩雑な手順は踏まない。少なくとも 0.15.5 では。
これを書いている 2024/11/09 時点では run.py が上手く動かないけど、「最新版は上手く動かないかも」みたいな記載が現時点ではあったので、まぁ、そんなもんでしょう、と。
しかし、run.pyを実行しても動かなくて、出たエラーを調べてみれば、解決策はすぐ見つかるわけで。
おまけ
さて、うちのラズパイ、何をやっても HDMI 接続のモニタから音が出ない。
モニタが壊れているわけではないのに。
…とはいえ、そもそも運用時にモニタを繋げる予定がないので早々に切り捨てた。(SSHだけでいい)
やりたいのは、USBスピーカー繋げて定期的にニュースのタイトル読み上げて貰ったり、とある機器からのトリガを受けてその内容をしゃべってもらう、とか。
で、「あれ?USBスピーカーから音出すのってどうやればいいんだっけ?」となった。
これまで、ラズパイから音を出したことなかったんだよねぇ…
てことで、実際にはうちの環境だと、
$ aplay voice.wav
ではUSBスピーカーからは音が出なかった。(HDMIに繋がったモニタからも出ない…)
ではどうしたか?
まずは、USBスピーカーがちゃんとつながってるか、認識されているか確認。
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: b1 [bcm2835 HDMI 1], device 0: bcm2835 HDMI 1 [bcm2835 HDMI 1]
Subdevices: 4/4
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
card 0: b1 [bcm2835 HDMI 1], device 1: bcm2835 HDMI 1 [bcm2835 HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones]
Subdevices: 4/4
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
card 3: Audio [USB Audio], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 3 が「USB Audio」とあって、まんまでわかりやすい。
card 0 の b1 が HDMI なんだけど、こっちは何やっても音が出ない…
(切り替え機経由だからEDIDのやり取りが上手く行ってないのかな…?)
card 1 の Headphones はラズパイの HDMI 端子横にあるヘッドホン端子で、こっちは音がちゃんと出る。
とまぁ、USBスピーカーはちゃんと認識されていて、このデバイスで音が出せればいいので…
$ aplay -D hw:3,0 voice.wav
で行けるかと思ったらだめだった。
正確にはこうする。
$ aplay -D plughw:3,0 voice.wav
どうも、モノラル音源は hw ではなく plughw 出ないとダメみたいね。
で、card 番号や Device 番号は aplay -l でわかるけど、より正確なパラメータは
$ aplay -L
(前略)
hw:CARD=Audio,DEV=0
USB Audio, USB Audio
Direct hardware device without any conversions
plughw:CARD=Audio,DEV=0
USB Audio, USB Audio
Hardware device with all software conversions
(後略)
とすることでも確認できる。
とても分かりにくいのだけれど、aplya の引数が「l」(小文字のエル)から「L」(大文字のエル)になってる。
また、上記結果からみると、
$ aplay -D plughw:CARD=Audio,DEV=0 voice.wav
とも書ける。
これで無事、文字を音声に起こして、USBスピーカーから喋らせることが出来ましたとさ。
今は、ニュースサイトを巡回してニュースのタイトルをだらだらと読み上げてもらってるけど、便利だわ…
各ニュースサイトをブラウザを立ち上げて巡回するという能動的な人間が取るアクションて結構面倒。
逆に、勝手に音として流していると、聞いていないようでも聞いていて、興味あるフレーズが流れてくると意識がそっちに少し傾く。
で、そのフレーズが聞こえたところでニュースサイトで詳細を見る。
そんな感じで情報の入手が簡単に、しかも受動的に行えて、思っていた以上に便利かも。
この記事にコメントしてみる