23
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonからVOICEVOX Coreを使ってみる

Posted at

VOICEVOX 0.14がリリースされました🎉
このリリースから、コアがRust言語に移行しています。
これに伴って、コアの便利なバインディングがPython向けに提供されるようになったので、この記事で紹介したいと思います。

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

事前準備

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

リリースのページから、OS/アーキテクチャ/GPUの有無に合ったwhlファイルをダウンロードします。

今回は、voicevox_core-0.14.1+cpu-cp38-abi3-win_amd64.whlをダウンロードしました。
ダウンロードしたディレクトリに移動後、以下のコマンドでインストールできます。
pip installの後ろのファイル名は、ダウンロードしたファイル名に合わせてください)

pip install voicevox_core-0.14.1+cpu-cp38-abi3-win_amd64.whl

ONNX Runtimeのダウンロード

リリースのページから、OS/アーキテクチャ/GPUの有無に合ったファイルをダウンロードします。
(VOICEVOX Core v0.14の場合はONNX Runtime v1.13.1が必要です)

展開した先のlibフォルダ内にdllが入っているので、カレントディレクトリの直下にコピーしておきます。
(OSによって拡張子は異なります)
今回は、onnxruntime.dll 及び onnxruntime_providers_shared.dll をコピーしました。

dllの場所について
カレントディレクトリの直下に置いておけば、コアライブラリの読み込み時に自動で読み込んでくれます。
もし別の場所に置きたい場合は、import voicevox_coreの前に以下のコードを実行する必要があります。

from ctypes import CDLL
from pathlib import Path

CDLL(str(Path("DLLの場所").resolve(strict=True)))

辞書ファイルのダウンロード

文章をアクセント情報付きの読みに変換するための辞書ファイルをダウンロードし、展開しておきます。

open_jtalk_dic_utf_8-1.11フォルダごと任意の場所にコピーしておきます。
open_jtalk_dic_utf_8-1.11フォルダの中に .bin.def.dicファイルが入っているような状態にしてください)
今回は、カレントディレクトリ直下に配置します。

実行

importとcoreインスタンス生成

open_jtalk_dict_dirは、先ほどダウンロードした辞書フォルダの場所を指定してください。

from pathlib import Path
from voicevox_core import VoicevoxCore, METAS

core = VoicevoxCore(open_jtalk_dict_dir=Path("open_jtalk_dic_utf_8-1.11"))

metas情報を閲覧

見やすいようにpprintを使用しています。

from pprint import pprint
pprint(METAS)
[Meta(name='四国めたん',
      styles=[Style(name='ノーマル', id=2),
              Style(name='あまあま', id=0),
              Style(name='ツンツン', id=6),
              Style(name='セクシー', id=4),
              Style(name='ささやき', id=36),
              Style(name='ヒソヒソ', id=37)],
      speaker_uuid='7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff',
      version='0.14.1'),
 Meta(name='ずんだもん',
      styles=[Style(name='ノーマル', id=3),
              Style(name='あまあま', id=1),
              Style(name='ツンツン', id=7),
              Style(name='セクシー', id=5),
              Style(name='ささやき', id=22),
              Style(name='ヒソヒソ', id=38)],
      speaker_uuid='388f246b-8c41-4ac1-8e2d-5d79f3ff56d9',
      version='0.14.1'),
...
 Meta(name='ナースロボ_タイプT',
      styles=[Style(name='ノーマル', id=47),
              Style(name='楽々', id=48),
              Style(name='恐怖', id=49),
              Style(name='内緒話', id=50)],
      speaker_uuid='882a636f-3bac-431a-966d-c5e6bba9f949',
      version='0.14.1')]

ここでのidを後で使用します。
今回は、四国めたんのノーマルスタイルを使用するので、idは2になります。
分かりやすいように変数で定義しておきます。

speaker_id = 2

TTS実行&ファイル保存

text = "こんにちは、これはテストです。"
if not core.is_model_loaded(speaker_id):  # モデルが読み込まれていない場合
    core.load_model(speaker_id)  # 指定したidのモデルを読み込む
wave_bytes = core.tts(text, speaker_id)  # 音声合成を行う
with open("output.wav", "wb") as f:
    f.write(wave_bytes)  # ファイルに書き出す

成功したらカレントディレクトリ直下に、output.wavが生成されているはずです。

AquesTalkライク記法でのTTS

バージョン0.14.0では、kanaオプションは動作していません。
0.14.1以降を使用してください。
(自分の報告に対して検証してくださった sevenc-nanashiさん、qryxipさん、迅速に修正PRを出してくださったSuitCaseさん、ありがとうございます。)

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

text = "'ンニチワ、コレワ'/テ'_ストデ_ス"
if not core.is_model_loaded(speaker_id):
    core.load_model(speaker_id)
wave_bytes = core.tts(text, speaker_id, kana=True)
with open("output.wav", "wb") as f:
    f.write(wave_bytes)

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

23
15
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
23
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?