26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonからVOICEVOX Coreを使ってみる

Last updated at Posted at 2023-02-04

[2025/03/29]
v0.14の情報からv0.16の情報に更新しました。
v0.14の情報を確認したい場合は、この記事の編集履歴をご確認ください。


VOICEVOX Core v0.16がリリースされました🎉
このリリースから、コアが色々変わったので、この記事で紹介したいと思います。

この記事はバージョン0.16.0時点の情報です。
バージョンアップに伴い、セットアップ方法や関数等に変更が入る可能性があります。
最新の情報はGithubをご確認ください。

事前準備

ダウンローダのセットアップ

VOICEVOX Coreの実行に必要なファイルをダウンロードしてくれるダウンローダが用意されています。
リリースのページから、OS/アーキテクチャに合ったdownload-*ファイルをダウンロードします。

今回は、download-windows-x64.exeをダウンロードし、作業用フォルダに配置しました。
分かりやすいように、download.exeにリネームしておきます。

ダウンローダの実行

コマンドプロンプト/シェルを開き、ダウンローダを実行します。
macOSやLinuxの場合は、事前に実行権限を付与(chmod +x download)してください。
(macOSやLinuxの方は、download.exe./downloadに読み替えてください。)

# CPU版を利用する場合
download.exe -o . --exclude c-api

# DirectML版を利用する場合
download.exe -o . --exclude c-api --devices directml

# CUDA版を利用する場合
download.exe -o . --exclude c-api --devices cuda

今回はCPU版をダウンロードしました。
dictmodelsonnxruntimeフォルダが作成され、その下に必要なファイルがダウンロードされています。

Pythonライブラリのインストール

(必要に応じて、venvで仮想環境をセットアップしてください)
pip等を使って、Pythonライブラリをインストールします。
whlファイルのURLはreleaseを確認してください。

pip install https://github.com/VOICEVOX/voicevox_core/releases/download/[バージョン]/voicevox_core-[バージョン]+[デバイス]-cp310-abi3-[OS・アーキテクチャ].whl

今回は、voicevox_core-0.16.0-cp310-abi3-win_amd64.whlをインストールしました。


asyncio等、非同期で実行する場合は、実行(非同期版API)まで飛んでください。

実行(ブロッキング版API)

初期化

ダウンロードしたファイルを移動している場合は、それに合わせてvoicevox_onnxruntime_pathopen_jtalk_dict_dirを変更してください。

from voicevox_core.blocking import Onnxruntime, OpenJtalk, Synthesizer, VoiceModelFile

voicevox_onnxruntime_path = "onnxruntime/lib/" + Onnxruntime.LIB_VERSIONED_FILENAME
open_jtalk_dict_dir = "dict/open_jtalk_dic_utf_8-1.11"
synthesizer = Synthesizer(Onnxruntime.load_once(filename=voicevox_onnxruntime_path), OpenJtalk(open_jtalk_dict_dir))

VVMファイルの読み込み

音声モデル(.vvm)ファイルと声(キャラクター・スタイル名)とスタイル ID の対応表を確認し、必要なVVMファイルを読み込みます。
今回は、ずんだもん(ノーマル)(スタイルID: 5)を使用するので、0.vvmを読み込みます。
ダウンロードしたファイルを移動している場合は、それに合わせてVoiceModelFile.openの引数を書き換えてください。

with VoiceModelFile.open("models/vvms/0.vvm") as model:
    synthesizer.load_voice_model(model)

先ほど確認した、スタイルIDを変数として定義しておきます。
(昔のバージョンのspeaker_idと同じものです)

style_id = 5

音声合成

text = "こんにちは、これはテストです。"
wav = synthesizer.tts(text, style_id)

# wavをファイルに書き出す
with open("output.wav", "wb") as f:
    f.write(wav)

AquesTalk風記法での音声合成

記法に関しては、Engineの方のREADMEに詳しく書いてあります。

text = "'ンニチワ、コレワ'/テ'_ストデ_ス"
wav = synthesizer.tts_from_kana(text, style_id)

# wavをファイルに書き出す
with open("output_2.wav", "wb") as f:
    f.write(wav)

デフォルトの音声合成結果と違い、こんにちは、の「こ」の位置にアクセントが来ていることが分かるかと思います。

実行(非同期版API)

asyncio等を用いて実行する場合は、こちらのAPIを使うといいです。

初期化

ダウンロードしたファイルを移動している場合は、それに合わせてvoicevox_onnxruntime_pathopen_jtalk_dict_dirを変更してください。

import asyncio
from voicevox_core.asyncio import Onnxruntime, OpenJtalk, Synthesizer, VoiceModelFile

async def create_synthesizer():
    voicevox_onnxruntime_path = "onnxruntime/lib/" + Onnxruntime.LIB_VERSIONED_FILENAME
    open_jtalk_dict_dir = "dict/open_jtalk_dic_utf_8-1.11"

    ort = await Onnxruntime.load_once(filename=voicevox_onnxruntime_path)
    ojt = await OpenJtalk.new(open_jtalk_dict_dir)

    return Synthesizer(ort, ojt)

synthesizer = asyncio.run(create_synthesizer())

VVMファイルの読み込み

音声モデル(.vvm)ファイルと声(キャラクター・スタイル名)とスタイル ID の対応表を確認し、必要なVVMファイルを読み込みます。
今回は、ずんだもん(ノーマル)(スタイルID: 5)を使用するので、0.vvmを読み込みます。
ダウンロードしたファイルを移動している場合は、それに合わせてload_modelの引数を書き換えてください。

async def load_model(synthesizer, model_path):
    async with await VoiceModelFile.open(model_path) as model:
        await synthesizer.load_voice_model(model)

asyncio.run(load_model(synthesizer, "models/vvms/0.vvm"))

先ほど確認した、スタイルIDを変数として定義しておきます。
(昔のバージョンのspeaker_idと同じものです)

style_id = 5

音声合成

text = "こんにちは、これはテストです。"
wav = asyncio.run(synthesizer.tts(text, style_id))

# wavをファイルに書き出す
with open("output.wav", "wb") as f:
    f.write(wav)

AquesTalk風記法での音声合成

記法に関しては、Engineの方のREADMEに詳しく書いてあります。

text = "'ンニチワ、コレワ'/テ'_ストデ_ス"
wav = asyncio.run(synthesizer.tts_from_kana(text, style_id))

# wavをファイルに書き出す
with open("output_2.wav", "wb") as f:
    f.write(wav)

おまけ(大量の文章の読み上げサンプル)

非同期版APIでの実装例です。
ファイルの書き込み用に、aiofilesを使用しています。
pip install aiofilesでインストールできます)

texts(strのリスト)で定義した文章を、音声合成してoutput_{index}.wavに保存します。
ファイルに保存しつつ音声合成できるので、直列で実行するより速くなるはず(多分)。

import asyncio
import aiofiles
from voicevox_core.asyncio import Onnxruntime, OpenJtalk, Synthesizer, VoiceModelFile

texts = [
    ...  # 文章一覧をここに
]

async def tts(synthesizer, text, style_id, index):
    # 音声合成してファイルに保存するコルーチン
    wav = await synthesizer.tts(text, style_id)
    async with aiofiles.open(f"output_{index}.wav", mode="wb") as f:
        await f.write(wav)

async def main(texts):
    # synthesizerの作成
    voicevox_onnxruntime_path = "onnxruntime/lib/" + Onnxruntime.LIB_VERSIONED_FILENAME
    open_jtalk_dict_dir = "dict/open_jtalk_dic_utf_8-1.11"
    ort = await Onnxruntime.load_once(filename=voicevox_onnxruntime_path)
    ojt = await OpenJtalk.new(open_jtalk_dict_dir)
    synthesizer = Synthesizer(ort, ojt)
    # VVMファイルの読み込み
    async with await VoiceModelFile.open("models/vvms/0.vvm") as model:
        await synthesizer.load_voice_model(model)
    # 音声合成の一括実行
    # ttsのコルーチンのリストを作成し、asyncio.gatherで実行する
    style_id = 5  # ずんだもんノーマル(スタイルID: 5)
    await asyncio.gather(*[
        tts(synthesizer, t, style_id, i)
        for i, t in enumerate(texts)
    ])

asyncio.run(main(texts))
26
20
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?