見出し画像

Linux版VOICEVOXをシェルだけで使う ~Linuxの強みGUI不要を生かす~

こんにちはRcatです。
今回は無料の音声読み上げソフトであるVOICEVOXのLinux版をシェルだけで使っていきます。

公式サイトでダウンロードするとLinuxの選択肢があるんですが、ちょっと調べるとみんなguiで使ってるみたいなんですよね。
で、とりあえずダウンロードして自分なりに試したところ、コンソールだけで利用できることが分かりましたので、記事にまとめようと思います。

最初にネタバレすると、以下のようなコマンドを作ります。
シェルで引数指定して読み上げてリダイレクトで保存。もちろんSSHでOK

$ ./voicevox -t ねこにゃんこきゃっと > test.wav


VOICEVOXを利用した作品には以下のようなものがあります。
興味がございましたら是非ご覧ください。



はじめに

利用規約

情報や作品の活用時は事前に利用規約をご確認ください。

https://note.com/rcat999/n/nb6a601a36ef5

コメントについて

利用規約のガイドラインを確認の上コメントしてください


概要

きっかけ

きっかけはテキスト生成AIで情報の分析や要約を全自動で行っているのですが、それを読み上げた音声ファイルとして出力できる機能をつけたら面白いんじゃないかと考えたことです。
そういったシステムは全て、Linuxのサーバーで動いています。

トップで紹介した記事では、WindowsPC上で動かす設定なので、Windows版をダウンロードして起動するだけという前提で動かしていました。
しかし、何らかのシステムに組み込みたいとなると、Linuxで動かなければなりません。

軽く調べたところ、gui環境を使って起動するという内容しか見つからなかったので自力で色々やってみたという感じです。


ダウンロード方法

パッケージをダウンロードする

公式サイトのダウンロードボタンを押してLinuxを選択します。
この時、CPUオンリーのバージョンを選ぶことで、その人のパッケージにtarが増えますのでこちらを使います。

ダウンロードボタンを押すとダウンロードが始まりますが、ダウンロードリンクの取得はできませんでしたので、一旦ダウンロードしてからサーバーに転送することにしました。
(デバッグコンソールからリンクを特定してwgetもありかもしれませんね。)

公式サイト https://voicevox.hiroshiba.jp/

解凍する

以下のような感じでコマンドを入力して解凍します。

$tar -zxvf  voicevox-linux-cpu-0.21.1.tar.gz
$ ls
VOICEVOX      voicevox-linux-cpu-0.21.1.tar.gz

データを確認する

データが展開されていますので、中身を見てみましょう。
パッと見た感じ、拡張子のない一番下のデータが実行ファイルっぽいですね。

ちなみにこれ実行すると以下のようになります。
gui版の説明でXサーバーというgui環境が何とかという説明を見た気がするので、guiで起動できないぞコラ!と言われている感じでしょうか?
ということはWindows版でZIPでダウンロードして起動した時と同じような状態ですね。

$ ./voicevox
Environment: production, appData: voicevox
configMigration014: /home/rcat/.config/voicevox-cpu/config.json not exists, do nothing
[348913:1110/220527.523549:ERROR:ozone_platform_x11.cc(244)] Missing X server or $DISPLAY
[348913:1110/220527.523590:ERROR:env.cc(258)] The platform failed to initialize.  Exiting.
Segmentation fault (コアダンプ)

気を取り直して少しデータを漁ってみます。
次はエンジンというところに入っていきます。
また、一番下に拡張子のないファイルがありますね。しかも名前からしてこれを実行しろと言われていますね。よし実行しましょう。

$ ./run
Warning: cpu_num_threads is set to 0. Setting it to half of the logical cores.
Info: Loading core 0.15.5.
reading /home/rcat/.local/share/voicevox-engine/user.dict_csv-94180179-fdad-4d3b-964f-70dc1a26b9eb.tmp ... 76
emitting double-array: 100% |###########################################|

done!
INFO:     Started server process [352241]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://localhost:50021 (Press CTRL+C to quit)

おっと! 起動しましたね。狙い通りです。これで利用可能です。

いや、どうやって使うの?っていう話ですが、以下の記事でVOICEVOXのAPIを使った音声生成をしています。
プログラミング的な話になるので難しいかもしれませんが、この方法を使ってコンソールから読み上げを行います。

本当に動いているのかどうかを確認したい場合は、以下のようにするのが手っ取り早いです。
先ほどコンソールの一番下にURLが書いてありましたよね?これはAPIのアドレスとなります。
そこに対してキャラクター一覧をくださいと言ってみましょう。URLを一番後ろに"speakers"をくっつけるだけです。

$ curl http://localhost:50021/speakers
[{"name":"四国めたん","speaker_uuid":"7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff","styles":[{"name":"ノーマル","id":2,"type":"talk"},{"name":"あまあま","id":0,"type":"talk"},{"name":"ツンツン","id":6,"type":"talk"},{"name":"セクシー","id":4,"type":"talk"},{"name":"ささやき","id":36,"type":"talk"},{"name":"ヒソヒソ","id":37,"type":"talk"}],"version":"0.15.5","supported_features":{"permitted_synthesis_morphing":"SELF_ONLY"}},{"name":"ずんだもん","speaker_uuid":"388f246b-8c41-4ac1-8e2d-5d79f3ff56d9","styles":[{"name":"ノーマル","id":3,"type":"talk"},{"name":"あまあま","id":1,"type":"talk"},{"name":"ツンツン","id":7,"type":"talk"},{"name":"セクシー","id":5,"type":"talk"},{"name":"ささやき","id":22,"type":"talk"},{"name":"ヒソヒソ","id":38,"type":"talk"},{"name":"ヘロヘロ","id":75,"type":"talk"},{"name":"なみだめ","id":76,"type":"talk"}],"version":"0.15.5","supported_features":{"permitted_synthesis_morphing":"SELF_ONLY"}},{"name":"春日部つむぎ","speaker_uuid":"35b2c544-660e-401e-b503-0e14c635303a","styles":[{"name":"ノーマル","id":8,"type":"talk"}],"version":"0.15.5","supported_features":{"permitted_synthesis_morphing":"ALL"}},...以下略

こんな感じでキャラクター一覧が返ってくれば無事起動しているという証明になります。
試しに音声合成をしない理由は2ステップが必要で、コンソールに手打ちしてやっていられるレベルではないからです。

ちなみにアクセスした瞬間、以下のようにアクセスログが増えてました。


シェルで手軽に読み上げする

さて、ここまででLinux版のVOICEVOXコンソール上で起動することができました。
後はバックグラウンドにするなり、systremdに入れるなりすればシェルは閉じても大丈夫です。

それで本題の音声読み上げですね。
まずは実際にやってから説明に移りましょう。

以下の記事で作成したプログラムを流用してテスト音声を生成してみます。

読み上げができるかのテスト

上記で配布しているデータのうち、"voicevox.py"だけをコピーして持ってきました。
このモジュールをインポートすることで、Pythonから読み上げを行うことができます。

サンプルコードは以下の通りです。

$ python3
Python 3.10.12 (main, Sep 11 2024, 15:47:36) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import voicevox
>>> v = voicevox.VOICEVOX()
>>> v.CreateWave("ねこはとってもかわいいです","test.wav")
{'path': 'test.wav', 'length': 1.6106666666666667, 'text': 'ねこはとってもかわいいです', 'diff': -1}
>>>
$ ls
VOICEVOX  __pycache__  test.wav  voicevox-linux-cpu-0.21.1.tar.gz  voicevox.py

3秒程度で読み上げが完了しました。(CPUはN100)
読み上げしたサンプルは以下の通りです。

音声: VOICEVOX「春日部つむぎ」
ちなみに私が一番よく使うのが春日部つむぎなので、キャラクターを省略すると春日部つむぎで読み上げされます。

ちなみにこの時のログは以下の通りです。
2つのAPIにアクセスしていることがわかります。

INFO:     127.0.0.1:55092 - "GET / HTTP/1.1" 200 OK
INFO:     127.0.0.1:37030 - "POST /audio_query?text=%E3%81%AD%E3%81%93%E3%81%AF%E3%81%A8%E3%81%A3%E3%81%A6%E3%82%82%E3%81%8B%E3%82%8F%E3%81%84%E3%81%84%E3%81%A7%E3%81%99&speaker=8 HTTP/1.1" 200 OK
INFO:     127.0.0.1:37038 - "POST /synthesis?speaker=8 HTTP/1.1" 200 OK

読み上げコマンド

さて、シェルから読み上げができることがわかったところで、手軽に使える方法を考えていきましょう。
まずはいきなり完成形を紹介します。

$ ./voicevox -t ねこにゃんこきゃっと > test.wav
$ ls
VOICEVOX     test.wav                          voicevox.py  voicevoxtalk.log
__pycache__  voicevox-linux-cpu-0.21.1.tar.gz  voicevox  voicevoxtalk.py

この中に作成されている"test.wav"を再生すると読み上げされていることが分かります。

読み上げコマンドの解説

コマンド化するにあたり、新しく2つのデータを作成しました。

  • voicevoxtalk.py
    先ほどのテストで行った読み上げを単発で行うスクリプト。
    コマンド入力に最適化されている。

  • voicevox
    voicevoxtalk.pyを呼び出すためのシェルスクリプト。
    これを噛ませることで自分で"python3"コマンドを入力しなくても良くなり、オリジナルコマンドっぽくなる。

コマンドとして呼び出すのは"voicevox"になります。
これに対して読み上げたいテキスト、キャラクター、スピードを指定することで読み上げを行います。

-hを指定することでヘルプを確認できます。
私の書き方のヘッダーとライブラリの利用説明が混ざってるので、ちょっと変な感じ。

$ ./voicevox -h
usage:
#==============================================================================#
#       VOICEVOX Linuxシェル読み上げ用コマンド                                   #
#==============================================================================#
(C) 2024 Rcat999
note: https://note.com/rcat999/
Twtter : @Rcat999
YouTube: Rcat999

+--------------概要--------------+
シェルからVOICEVOXを使うためのコマンド

+--------------利用規約--------------+
下記グローバルルールに則ります
https://note.com/rcat999/n/nb6a601a36ef5

+--------------履歴--------------+
Ver 1.0.0 2024/11/10 初版

options:
  -h, --help            show this help message and exit
  -t TEXT, --text TEXT  読み上げるテキストを指定
  -c CHARACTER, --character CHARACTER
                        読み上げるキャラクターIDを指定
  -s SPEED, --speed SPEED
                        読み上げ速度を指定

このスクリプトは生成した音声を標準出力で返してきます。そのため、リダイレクトして保存するか、パイプで別のコマンドに渡してください。

ちなみにずんだもんで0.5倍速の場合は以下になります。

$ ./voicevox -c 3 -s 0.5 -t ねこにゃんこきゃっと > zunda.wav

コマンドの中身

voicevoxの中身はシェルスクリプトでPythonを呼び出しています。

voicevox の中

Pythonの方の中身は以下のようになっています。
先ほどコンソールで入力したものを、コマンドとして使いやすくしたものになります。


次回

次回は自作のシステムから簡単に使えるVOICEVOX中間APIサーバー作成しました。
公式のAPIは複雑ですが、中間サーバーをかませることでGETのパラメータに文字列を入れるだけで簡単に音声を読み上げでき、様々な用途で活用ができます。


配布情報

配布URL

以下のURLより配布しています。
利用規約に同意の上ご利用ください。

https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=VOICEVOX_Linuxシェルコマンド


いいなと思ったら応援しよう!

Rcat999 情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。