💨

OPENVOICE_V2で多言語ボイスクローンと音声生成

に公開

散々苦労したあげくようやく、OPENVOICEのV2を動かすことができました。この記事を書き始めたのが2025年05月09日。
ちなみにV1は以下のコマンドだけでインストールできます。
V1をいれたときの環境はUBUNTU標準レポジトリからいれたPYTHON3.12をつかってました。

pip install openvoice

ただ肝心のボイスがあまり似てないなと思い、V2をためすことにしました。V2は精度が格段に進化したと聞いたからですが。
結論から言います。体感的ではありますが、別記事で書いたINDEX-TTSにくらべて全然性能が劣ります。(音声にはINDEX-TTSは30秒ほどでほぼ自分や著名人のトーンを再現できましたが、OPENVOICE V2で1分の音声あたえても、全然声のクローンに関してはいまいちでした)。
https://zenn.dev/takeofuture/articles/86468bb2d7d3e8

サンプル実行するとCUDA11やCUDNN8ライブラリがないとエラーははかれ、がんばってインストール試みたが結局うまくいかず、一部コードのCUDA使用をバイパスすることで動かすことには成功しました。商用利用が可能な日本語対応のボイスクローン(とうたっている?)ものだけに大変残念です。😢
英語のいいモデルを自分でしっかりファインチューニング頑張るしかないのかな。

では性能はさておき、環境構築準備方法書いていきます。
基本は、https://huggingface.co/myshell-ai/OpenVoiceV2#linux-install
とほぼ同じですが、私はpyenv でPYTHON3.11.11の環境で構築しました。
以下コマンドは、PYTHONの仮想環境にすでにACTIVATEした状態を想定します。

# cd /opt/openvoice_v2
# git clone git@github.com:myshell-ai/OpenVoice.git
# cd OpenVoice
# pip install -e .

そして、CHECKPOINTをダウンロードしておきます。

# wget https://myshell-public-repo-host.s3.amazonaws.com/openvoice/checkpoints_v2_0417.zip
# unzip checkpoints_v2_0417.zip

すると、checkpoints_v2 というフォルダーに展開されます。

FFMPEGもAPTでいれておきましょう

# apt install ffmpeg

あと、以下のライブラリとダウンロードコマンドも実行します。

# pip install git+https://github.com/myshell-ai/MeloTTS.git
# python -m unidic download

あと英語での生成で必要なタグ付けデータも念のためインストールしておきます。

# python - <<EOF
import nltk
nltk.download('averaged_perceptron_tagger_eng')
EOF

これで準備ができました!。
以下のサンプルコードで生成しました。

  • main.py
import os
import torch
from openvoice import se_extractor
from openvoice.api import ToneColorConverter
ckpt_converter = 'checkpoints_v2/converter'
device = "cuda:0" if torch.cuda.is_available() else "cpu"
output_dir = 'outputs_v2'
tone_color_converter = ToneColorConverter(f'{ckpt_converter}/config.json', device=device)
tone_color_converter.load_ckpt(f'{ckpt_converter}/checkpoint.pth')
os.makedirs(output_dir, exist_ok=True)
reference_speaker = 'resources/example_reference.mp3'
target_se, audio_name = se_extractor.get_se(reference_speaker, tone_color_converter, vad=False)
from melo.api import TTS
texts = {
    'EN':       "Did you ever hear a bear attacking elephant?",
    'ES':       "El resplandor del sol acaricia las olas, pintando el cielo con una paleta deslumbrante.",
    'ZH':       "在这次vacation中,我们计划去Paris欣赏埃菲尔铁塔和卢浮宫的美景。",
    'JP':       "山にいったら森のくまさんが歌っていた。",
}
src_path = f'{output_dir}/tmp.wav'
speed = 1.0
for language, text in texts.items():
    model = TTS(language=language, device=device)
    speaker_ids = model.hps.data.spk2id
    for speaker_key in speaker_ids.keys():
        speaker_id = speaker_ids[speaker_key]
        speaker_key = speaker_key.lower().replace('_', '-')
        source_se = torch.load(
            f'checkpoints_v2/base_speakers/ses/{speaker_key}.pth',
            map_location=device
        )
        save_path = f'{output_dir}/output_v2_{speaker_key}.wav'
        model.tts_to_file(text, speaker_id, src_path, speed=speed)
        save_path = f'{output_dir}/output_v2_{speaker_key}.wav'
        # カラートン変換
        encode_message = "@MyShell"
        tone_color_converter.convert(
            audio_src_path=src_path,
            src_se=source_se,
            tgt_se=target_se,
            output_path=save_path,
        )

そして実行しようとしましたが、エラー発生!
(私はCUDNN8を入れようと相当時間を使いましたがあきらめました)

# python main.py
cuda:0
~/.pyenv/versions/openvoicev2/lib/python3.11/site-packages/torch/nn/utils/weight_norm.py:143: FutureWarning: `torch.nn.utils.weight_norm` is deprecated in favor of `torch.nn.utils.parametrizations.weight_norm`.
  WeightNorm.apply(module, name, dim)
Loaded checkpoint 'checkpoints_v2/converter/checkpoint.pth'
missing/unexpected keys: [] []
OpenVoice version: v2
Discarding ID3 tags because more suitable tags were found.
Could not load library libcudnn_ops_infer.so.8. Error: libcudnn_ops_infer.so.8: cannot open shared object file: No such file or directory
Please make sure libcudnn_ops_infer.so.8 is in your library path!
Aborted (core dumped)

どうも openvoice/se_extractor.py
でwhisperのモデルを読み込もうとしたときにエラーになっているようです。
しかもハードコードしてある!
取り急ぎCPUに変更しFLOAT32で型を渡しました。

#model = WhisperModel(model_size, device="cuda", compute_type="float16")
model = WhisperModel(model_size, device="cpu", compute_type="float32")

そして実行、一応生成は成功で、あらかじめ用意されたサンプルのものを使うと確かに似てはいます

# python main.py
reference_speaker = 'resources/example_reference.mp3'

でもこれを自分の声などにおきかえると似ても似つかない。しかも言語ごとに音声がことなる。
もし機会があれば、どうにか日本語音声の声のトーン精度向上できないかためしてみます。

Discussion