Skip to content

Latest commit

 

History

History
177 lines (121 loc) · 8.78 KB

usage.md

File metadata and controls

177 lines (121 loc) · 8.78 KB

VOICEVOX コア ユーザーガイド

VOICEVOX コアとは

VOICEVOX の音声合成のコア部分で、VOICEVOX 音声合成が可能です。

コアを利用する方法は2つあります。動的ライブラリを使う方法と、各言語向けのライブラリを使う方法です。初心者の方は後者がおすすめです。

ここではまず環境構築の方法を紹介し、Python ライブラリのインストール方法を紹介します。その後、実際に音声合成を行う方法を少し細かく紹介します。

環境構築

実行に必要なファイルのダウンロード

コアを動作させるには依存ライブラリである ONNX Runtime や、音声合成のための音声モデル(VVM ファイル)が必要です。これらはコア用の Downloader を用いてダウンロードすることができます。

Note

音声モデル(VVM ファイル)には利用規約が存在します。詳しくはダウンロードしたファイル内の README に記載されています。

最新のリリースから、お使いの環境にあった Downloader (例えば Windows の x64 環境の場合はdownload-windows-x64.exe)をダウンロードし、ファイル名をdownloadに変更します。macOS や Linux の場合は実行権限を付与します。

# 実行権限の付与
chmod +x download

以下のコマンドで Downloader を実行して依存ライブラリとモデルをダウンロードします。DirectML 版や CUDA 版を利用する場合は引数を追加します。

# CPU版を利用する場合
./download

# DirectML版を利用する場合
./download --devices directml

# CUDA版を利用する場合
./download --devices cuda

voicevox_coreディレクトリにファイル一式がダウンロードされています。以降の説明ではこのディレクトリで作業を行います。

詳細な Downloader の使い方は こちら で紹介しています。

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

Note

Downloader を実行すればコアの動的ライブラリもダウンロードされているので、Python ライブラリを用いない場合はこの章はスキップできます。

pip installで Python ライブラリをインストールします。使いたい OS・アーキテクチャ・デバイス・バージョンによって URL が変わるので、最新のリリースPython wheelに合わせます。

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

テキスト音声合成

VOICEVOX コアではSynthesizerに音声モデルを読み込むことでテキスト音声合成できます。まずサンプルコードを紹介し、その後で処理1つ1つを説明します。

サンプルコード

これは Python で書かれたサンプルコードですが、大枠の流れはどの言語でも同じです。

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

# 1. Synthesizerの初期化
open_jtalk_dict_dir = "open_jtalk_dic_utf_8-1.11"
synthesizer = Synthesizer(Onnxruntime.load_once(), OpenJtalk(open_jtalk_dict_dir))

# 2. 音声モデルの読み込み
with VoiceModelFile.open("model/0.vvm") as model:
    synthesizer.load_voice_model(model)

# 3. テキスト音声合成
text = "サンプル音声です"
style_id = 0
wav = synthesizer.tts(text, style_id)
with open("output.wav", "wb") as f:
    f.write(wav)

1. Synthesizer の初期化

AIエンジンのOnnxruntimeのインスタンスと、辞書などを取り扱うOpenJtalkのインスタンスを引数に渡してSynthesizerを初期化します。Synthesizerは音声合成だけでなく、音声モデルを複数読み込んだり、イントネーションのみを生成することもできます。

2. 音声モデルの読み込み

VVM ファイルからVoiceModelFileインスタンスを作成し、Synthesizerに読み込ませます。その VVM ファイルにどの声が含まれているかはVoiceModelFile.metas音声モデルと声の対応表で確認できます。

with VoiceModelFile.open("model/0.vvm") as model:
    pprint(model.metas)
[SpeakerMeta(name='四国めたん',
             styles=[StyleMeta(name='ノーマル', id=2),
                     StyleMeta(name='あまあま', id=0),
                     StyleMeta(name='ツンツン', id=6),
                     StyleMeta(name='セクシー', id=4)],
             speaker_uuid='7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff',
             version='0.14.4'),
 SpeakerMeta(name='ずんだもん',
             ...

3. テキスト音声合成

読み込んだ音声モデル内の声でテキスト音声合成を行います。Synthesizer.ttsにテキストとスタイル ID を渡すと、音声波形のバイナリデータが返ります。

イントネーションの調整

Synthesizerはイントネーションの生成と音声合成の処理を分けることもできます。

AudioQuery の生成

まずテキストからAudioQueryを生成します。AudioQueryには各音の高さや長さが含まれています。

text = "サンプル音声です"
style_id = 0
audio_query = synthesizer.audio_query(text, style_id)
pprint(audio_query)
AudioQuery(accent_phrases=[AccentPhrase(moras=[Mora(text='サ',
                                                    vowel='a',
                                                    vowel_length=0.13019563,
                                                    pitch=5.6954613,
                                                    consonant='s',
                                                    consonant_length=0.10374545),
                                               Mora(text='ン',
                                                    vowel='N',
                                                    vowel_length=0.07740324,
                                                    pitch=5.828728,
                                                    consonant=None,
                                                    consonant_length=None),
                                               Mora(text='プ',
                                                    ...

AudioQuery の調整

少し声を高くしてみます。AudioQuery.pitch_scaleで声の高さを調整できます。

audio_query.pitch_scale += 0.1

音声合成

調整したAudioQuerySynthesizer.synthesisに渡すと、調整した音声波形のバイナリデータが返ります。

wav = synthesizer.synthesis(audio_query, style_id)
with open("output.wav", "wb") as f:
    f.write(wav)

AudioQueryで調整できるパラメータは他にも速さ.speed_scaleや音量.volume_scale、音ごとの高さ.accent_phrases[].moras[].pitchなどがあります。詳細はAPI ドキュメントで紹介しています。

ユーザー辞書

TODO。OpenJtalk.use_user_dict辺りを使います。

動的ライブラリを使う場合

TODO。.so/.dll/.dylib ファイルがあるので直接呼び出します。C++ Exampleで流れを紹介しています。API ドキュメントも参考になります。

非同期処理

TODO。同じ音声モデルのインスタンスで同時に音声合成はできません(Mutex になっています)。仕様が変更されている可能性もあります。

内部で利用する ONNX Runtime が最適化処理を行っているため、パフォーマンス目的で非同期処理するのは効果がないことが多いです。 Synthesizercpu_num_threadsを減らした状態であれば、長い音声を合成しているものにロックされずバランシングできるかもしれません。