- 商用利用もできるAI音声読み上げツール
- いわゆるゆっくりボイスだったりVOICEROIDだったりと似たようなもの
- 実際は自分で設定する必要があるが...
- エディタ+エンジン+コアからなる
- 実際にはエディタはElectron + Vue 、エンジン部分は Python + FastAPI 、コアはC++で作られている (コアに関しては多分)
- 今回は手元でエンジンを動かしてそこに対してgoからリクエストを行ってみる
- python3.9.0以上の導入
- 依存ライブラリの導入 cmake,libtorch,onnxruntime,play
- すべて brew install hogehoge で導入可能
- coreの準備
- github上のreleasesから最新版をDLして解答して適当なディレクトリに配置
- https://github.com/VOICEVOX/voicevox_core/releases
- engineの準備
- github上のソースをclone もしくは、zipでDLして適当なディレクトリに配置
- engineの依存ライブラリを導入
python -m pip install -r requirements.txt
- engineの起動
DYLD_LIBRARY_PATH="../core" python run.py --voicevox_dir="../core" --cpu_num_threads=1
- 以下のディレクトリ構成にしてある。
voicebox ─┬ core
└ engine
-
これでhttp://127.0.0.1:50021 で起動される
curl -s -XPOST -G "http://localhost:50021/audio_query?speaker="1 --data-urlencode text=てすと | curl -s -XPOST "http://localhost:50021/synthesis?speaker="1 -H 'accept: audio/wav' -H 'Content-Type: application/json' -d @- | play -`
- 音声合成用のクエリを作成する
- /audio_query
- spkaerとtextを指定して、音声合成用のクエリを作成する
- 音声合成
- /syntesis
- 他パラメータは/audio_queryで取得できるもの
- responseでaudio/wavが返却される
- 基本的にHttpClientを作れば良い
- そして、モダンなアプリケーションなのでoapi形式で書かれている
- swagger.jsonをDLしてきてoapi-codegenで構造体とclientを作る
oapi-codegen -generate "types" -package oapi swagger.json > oapi/type.go
oapi-codegen -generate "client" -package oapi swagger.json > oapi/client.go
今回は、audio_queryとsyntesis(合成)だけ実行すれば良い
- github.com/faiface/beep を利用する
- 合成された音声はwav形式なので、wavパッケージを利用する
- wav.Decodeは以下のような関数
func Decode(r io.Reader) (s beep.StreamSeekCloser, format beep.Format, err error)
- API実行の
resp.Body
は io.ReadCloserなのでそのまま利用できる
- spaker.Initで初期設定をして、Playすれば良い
- 実際には 、channelを使って実行まで待たないとプログラムが終了して何もならない状態になる
- こちらが生成された音声
- voicevoxを利用して合成音声の出力に成功した。
- beepパッケージ面白いよ。
- あとはmacでループバック再生ができるようになれば一言も喋らずに一週間過ごすことができる。