Module-LLMでずんだもんが喋ったらいいのになぁ。あ、Linux版あるじゃん!ということでModule LLMに音声合成ソフトVOICEVOXをインストールしてみました。

Linux版について調べてみるとRaspberry PIでのインストール記事がたくさん出てきますが、COREをインストールしてONNX Runtimeをインストールして…と結構面倒そうでした。調べてみるともっとサクッっと動かせそうだったので、簡単な方法で試してみました。

インストール

VOICEVOXのインストール

VOICEVOXの公式サイトからプログラムをダウンロードしてきます。Linux、CPU (arm64)、tar.gz を選択して、ダウンロードボタンのリンクのURLをコピーして、Module LLMのコンソールにペーストしてwgetでダウンロードします。

ダウンロードが終了したら展開します。

wget https://github.com/VOICEVOX/voicevox/releases/download/0.24.1/voicevox-linux-cpu-arm64-0.24.1.tar.gz
tar xfz voicevox-linux-cpu-arm64-0.24.1.tar.gz

するとVOICEVOXというディレクトリが作成されます。

jqのインストール

JSONファイルを整形したり編集できるツールをインストールします。

apt update
apt install jq

テキストファイルの作成

喋らせたいメッセージをテキストファイルで作成しておきます。

ぼくはLLMモジュールずんだもんなのだ

音声合成スクリプトの準備

VOICEVOXのREST APIに接続して音声合成して再生まで一括で行うシェルスクリプトを用意します。こちらからでもダウンロードできます。当初はサクッと作るつもりでしたが、今思うとPythonで作った方が良かった気がしました。シェルだと簡単なものならVimで書く方が楽なんですよねぇ。

#!/bin/bash
in_file=$1

## 設定
speaker=1    # ずんだもん
#speaker=2    # 四国めたん
volume=0.1

if [ ! -e "${in_file}" ] ; then
  echo "input file not found"
  exit 1
fi

echo -n "Generate audio query..."
curl -sGX POST \
  "http://127.0.0.1:50021/audio_query" \
  --data-urlencode "text@${in_file}" \
  --data "speaker=${speaker}" \
  --data "enable_katakana_english=true" \
  -H "Accept: application/json" \
  --output /tmp/vv_query.json
echo done
ls -l /tmp/vv_query.json

jq ".outputSamplingRate=16000 | .outputStereo=true | .volumeScale=${volume}" \
  /tmp/vv_query.json > /tmp/vv_query.json.tmp \
  && mv /tmp/vv_query.json.tmp /tmp/vv_query.json

echo -n "Synthesis..."
curl -sX POST \
  "http://127.0.0.1:50021/synthesis?speaker=${speaker}&enable_interrogative_upspeak=true" \
  -H "Accept: audio/wav" \
  -H "Content-Type: application/json" \
  --data @/tmp/vv_query.json \
  --output /tmp/vv_voice.wav
echo done
ls -l /tmp/vv_voice.wav

echo -n "Play..."
#aplay -D plughw:0,1 /tmp/vv_voice.wav
tinyplay -D0 -d1 /tmp/vv_voice.wav
echo done

rm -f /tmp/vv_query.json /tmp/vv_voice.wav
chmod 755 llm_voicevox.sh

ファイルを保存したらパーミッションも変更します。

音声合成

VOICEVOXの起動

VOICEVOXを起動します。最後のtailはログを見る方法なので、起動するだけなら不要です。別ウィンドウでターミナルを開いてtailしていると、動作状況が見えてデバッグに役立ちます。

cd VOICEVOX/vv-engine
nohup ./run --cpu_num_threads=2 &
tail -f nohup.out

音声合成の実行

喋らせたいメッセージを保存したファイルを指定してスクリプトを実行します。

./llm_voicevox.sh zundamon.txt

50秒ほど待つと、Module-LLMで再生されました!

そんなに待てないよって人は素直にPCのGPUで回しましょう。

ちょっと解説

CPUマルチスレッド化

Module-LLMで使用されているAX630CにはデュアルコアのCortex-A53が搭載されています。引数を付けずに実行するとシングルコアでの実行になりますが、runオプションで –cpu_num_threads=2 と付けると、複数のコアを使用してくれます。試したところ、これで80秒から50秒に短縮しました。

WAVファイルの調整

Module-LLMにはtinyplayというサウンドファイルを再生するコマンドがデフォルトでインストールされているのですが、VOICEVOXでデフォルトで作成されるサンプリングレート24KHzのファイルは再生できません。32KHzのファイル(Module-LLMの起動音)は再生できるので、試しに16KHzにしてみたところ、tinyplayコマンドでも再生することができました。なお、Module-LLMではモノラル形式のデータは再生できませんでした。片方しかスピーカーに繋がってないのかも。

VOICEVOXでaudio_queryを実行して生成されたJSONデータに、outputSamplingRateという設定があり、これをjqコマンドで16000に書き換えています。他にもステレオ/モノラルの設定(outputStereo)や、音量(volumeScale)も変更しています。この編集後のJSONデータをsynthesisに投げて音声合成をします。APIの仕様はこちらに説明があります。

音量が爆音すぎる

最初、いきなり爆音で再生されてびっくりしました。デフォルトだと音が大きすぎます。alsa-mixierとかを使えばシステムの音量を変更できるみたいですが、今回は音量の設定を volumeScale=1 から 0.1 に変更しました。これで静かな室内でちょうどいいくらいの音量です。

NPUで動かしたい!

本命はNPU!せっかくModule-LLMには3 TOPSのNPUが乗ってるので、ソフトウェア側を対応すれば高速で音声合成ができると思うんですよね。私には何をどうすればいいのかさっぱりわかりませんが。

Claude CodeにModule-LLMのroot権限とWSLのUbuntuのroot権限を渡して、「VOICEVOXをModule-LLMで動くようにして。環境は自由に使っていいから。動くまで諦めないで。」と指示したら作ってくれませんかね??

LINEで送る
Pocket