🙀

Google Colab + VOICEVOXで音声自動生成を試す

2022/05/18に公開

お久しぶりです!前回は山田孝弘とムロツヨシの顔を学習なしで分類できないか試していましたね。
https://zenn.dev/opamp/articles/73126cf8c0135d

今回はVOICEVOXと呼ばれる音声自動生成ツールで遊んでいきたいと思います!(紆余曲折も併せてご覧ください・・・)

事の経緯

お昼休みにTwitterをしていると、こんなツイートが目に。
https://twitter.com/witch_kazumin/status/1517595023503917056

・・・これは遊ぶしかない!業務ではさせてもらえないだろうし、取りあえず遊ぶしか・・・。
ツイートと記事投稿日に大きな乖離があるのは内緒だぞ

今回の環境

今回はタイトルの通りGoogle Colabで実行しました!

以下のnotebookで実行可能です!とにかく実行だけできれば!という方は以下をどうぞ!

https://colab.research.google.com/drive/1lHUocAhDEFmLCqn4-ALDfX_bJ3gfBOEC?usp=sharing

VOICEVOXが動かない:回想

とりあえず試す

とりあえず
https://github.com/VOICEVOX/voicevox_core
にアクセスし、リポジトリをクローン。

!git clone https://github.com/VOICEVOX/voicevox_core

Githubの説明どおりにインストールを進めていきます。ColabはGPUが使えるので--use_cudaをつけましょう!

%cd voicevox_core/
!python configure.py --use_cuda
!pip install -r requirements.txt
!pip install .

実行時に

Please enter number to select which library to use.
0: /content/voicevox_core/release/libcore_cpu_armhf.so
1: /content/voicevox_core/release/libcore_gpu_x64_nvidia.so
2: /content/voicevox_core/release/libcore_cpu_x64.so

と聞かれましたが、GPU使う予定なのでとりあえず1を選択。よしよし、順調だ。

あとはサンプルコードの通りですね!簡単でした!

%cd example/python
!pip install -r requirements.txt
!python run.py \
    --text "これは本当に実行できているんですか" \
    --speaker_id 1

・・・・

raceback (most recent call last):
  File "run.py", line 50, in <module>
    run(**vars(parser.parse_args()))
  File "run.py", line 19, in run
    core.initialize(use_gpu, cpu_num_threads)
  File "/usr/local/lib/python3.7/dist-packages/core/_core.py", line 58, in initialize
    raise Exception(lib.last_error_message().decode())
Exception: basic_string::_M_construct null not valid

?????????????????????????????????????
おおおおおお、おかしいですね・・・。言われた通り実行しただけなんですが・・・。

とりあえずもう一回・・・。

Exception: basic_string::_M_construct null not valid

うーーん。GG。

原因の調査

とりあえず、エラーが出てるコードを見に行ってみましょう。

!cat /usr/local/lib/python3.7/dist-packages/core/_core.py

~~~~
## ラッパー関数
#def initialize(use_gpu: bool, cpu_num_threads=0, load_all_models=True):
#    success = lib.initialize(use_gpu, cpu_num_threads, load_all_models)
#    if not success:
#        raise Exception(lib.last_error_message().decode())
~~~~

どうやらlib.initalizeを走らせているみたいですね。あと、C言語をPythonでラッパーしていることもわかりました。

引数は前から順にuse_gpu, cpu_num_threads, load_all_modelsですね。

次はcoreフォルダを確認してみます。

libフォルダの中にcore.hという怪しそうなファイルが・・・。確認してみましょう。

/**
 * @fn
 * 初期化する
 * @brief 音声合成するための初期化を行う。他の関数を正しく実行するには先に初期化が必要
 * @param root_dir_path 必要なファイルがあるディレクトリ。相対パス・絶対パスどちらも指定可能。文字コードはUTF-8
 * @param use_gpu trueならGPU用、falseならCPU用の初期化を行う
 * @param cpu_num_threads 推論に用いるスレッド数を設定する。0の場合論理コア数の半分か、物理コア数が設定される
 * @return 成功したらtrue、失敗したらfalse
 * @detail
 * 何度も実行可能。use_gpuを変更して実行しなおすことも可能。
 * 最後に実行したuse_gpuに従って他の関数が実行される。
 */
extern "C" VOICEVOX_CORE_API bool initialize(const char *root_dir_path, bool use_gpu, int cpu_num_threads = 0);

・・・・?あれ、引数が違う・・・?root_dir_pathとは何ぞや・・・?

サンプルがおかしい可能性が。

ということでいろいろ調べた結果、現在Githubに上がっている分は最新で、サンプルはv0.10くらいのものらしいです。

とりあえず今回は変更前だったv0.11で遊んでみました。(この事実に気づくのに1週間程度調査してました。)

VOICEVOXを動かす:本編

インストール

まずはクローンから。ここは同じですね!

!git clone https://github.com/VOICEVOX/voicevox_core

続いてブランチを変更します。

%cd voicevox_core/
!git branch -a

#* main
#  remotes/origin/HEAD -> origin/main
#  remotes/origin/main
#  remotes/origin/release-0.10
#  remotes/origin/release-0.11
#  remotes/origin/release-0.5
#  remotes/origin/release-0.6
#  remotes/origin/release-0.7
#  remotes/origin/release-0.8
#  remotes/origin/release-0.9
#  remotes/origin/rust

今回は0.11で遊ぶので

!git checkout release-0.11

としました。
続いてconfigure.pyの実行です。configure.pyの引数には--voicevox_versionと呼ばれるものがあり、各バージョンは
https://github.com/VOICEVOX/voicevox_core/releases
のサイトに記載されています。今回は0.11の中で最も新しい0.11.4を利用しました。

%cd /content/voicevox_core
!python configure.py --use_gpu --voicevox_version 0.11.4

#Please enter number to select which library to use.
#0: /content/voicevox_core/release/libcore_cpu_arm64.so
#1: /content/voicevox_core/release/libcore_cpu_armhf.so
#2: /content/voicevox_core/release/libcore_gpu_x64_nvidia.so
#3: /content/voicevox_core/release/libcore_cpu_x64.so
#Your choice: 2
#Successfully configured!

その他もろもろをインストール。

!pip install -r requirements.txt
!pip install .

これでVOICEVOXのインストールは完了です。続いてサンプルを動かしてみましょう!

サンプルを動かす

まずはサンプルを動かすのに必要なものをインストール。

%cd /content/voicevox_core/example/python
!pip install -r requirements.txt

続いてサンプルコードを実行!

!python run.py \
    --text "あいうえお" \
    --speaker_id 0\
    --f0_speaker_id 0\
    --f0_correct 0\
    --root_dir_path="../../release"\
    --use_gpu


おおおお!ようやく・・・、音声が生成されました。これを行うのに1週間程度かかったのは秘密です

各引数について説明します。

--speaker_id

--speaker_idは話す人を選択することができます。(ボカロでいう初音ミクや巡音ルカとかですね)

VOICEVOXで利用できる話者のIDはmeta.jsonから確認することができます。

/voicevox_core/release/metas.json
[
  {
    "name": "四国めたん",
    "styles": [
      { "name": "ノーマル", "id": 2 },
      { "name": "あまあま", "id": 0 },
      { "name": "ツンツン", "id": 6 },
      { "name": "セクシー", "id": 4 }
    ],
    "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff",
    "version": "0.11.4"
  },
  {
    "name": "ずんだもん",
    "styles": [
      { "name": "ノーマル", "id": 3 },
      { "name": "あまあま", "id": 1 },
      { "name": "ツンツン", "id": 7 },
      { "name": "セクシー", "id": 5 }
    ],
    "speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9",
    "version": "0.11.4"
  },
  {
    "name": "春日部つむぎ",
    "styles": [{ "name": "ノーマル", "id": 8 }],
    "speaker_uuid": "35b2c544-660e-401e-b503-0e14c635303a",
    "version": "0.11.4"
  },
  {
    "name": "雨晴はう",
    "styles": [{ "name": "ノーマル", "id": 10 }],
    "speaker_uuid": "3474ee95-c274-47f9-aa1a-8322163d96f1",
    "version": "0.11.4"
  },
  {
    "name": "波音リツ",
    "styles": [{ "name": "ノーマル", "id": 9 }],
    "speaker_uuid": "b1a81618-b27b-40d2-b0ea-27a9ad408c4b",
    "version": "0.11.4"
  },
  {
    "name": "玄野武宏",
    "styles": [{ "name": "ノーマル", "id": 11 }],
    "speaker_uuid": "c30dc15a-0992-4f8d-8bb8-ad3b314e6a6f",
    "version": "0.11.4"
  },
  {
    "name": "白上虎太郎",
    "styles": [{ "name": "ノーマル", "id": 12 }],
    "speaker_uuid": "e5020595-5c5d-4e87-b849-270a518d0dcf",
    "version": "0.11.4"
  },
  {
    "name": "青山龍星",
    "styles": [{ "name": "ノーマル", "id": 13 }],
    "speaker_uuid": "4f51116a-d9ee-4516-925d-21f183e2afad",
    "version": "0.11.4"
  },
  {
    "name": "冥鳴ひまり",
    "styles": [{ "name": "ノーマル", "id": 14 }],
    "speaker_uuid": "8eaad775-3119-417e-8cf4-2a10bfd592c8",
    "version": "0.11.4"
  },
  {
    "name": "九州そら",
    "styles": [
      { "name": "ノーマル", "id": 16 },
      { "name": "あまあま", "id": 15 },
      { "name": "ツンツン", "id": 18 },
      { "name": "セクシー", "id": 17 },
      { "name": "ささやき", "id": 19 }
    ],
    "speaker_uuid": "481fb609-6446-4870-9f46-90c4dd623403",
    "version": "0.11.4"
  }
]

こうやって確認すると、結構な人数がいますね。ささやくなんてのもありますからASMRも作れそうです。

--f0_speaker_id

--f0_speaker_idは、--speaker_idで設定した話者を、--f0_speaker_idの話し方の速さで話すようにすることができます。

例として、四国めたんのノーマルを九州そらのささやきの速さで話させる場合は

--speaker_id 2 --f0-speaker_id 19

となります。早くしたり遅くしたりしたい場合はここを変化させましょう!

--f0_correct

--f0_correctは、声の高さを調整することができます。Readmeにある通り、±0.3程度で設定するのが良いです。(大きな数字にすると何も発さなくなったり、突然ささやき声になったりしました)

まとめ

今回はVOICEVOXをColab上で実行しました。当初はGithubからクローンして実行するだけ・・・。と考えていたのですが、中々実行できませんでした。バージョン、大事ですね。

というわけで、今回はこの辺りで!

Discussion