voicevox / README.md
2ndelement's picture
Update README.md
a3d0898
metadata
license: lgpl-3.0
title: voicevox
sdk: docker
emoji: 🐢
colorFrom: blue
colorTo: pink
pinned: true

VOICEVOX ENGINE

build releases discord

test Coverage Status

build-docker docker

VOICEVOX の゚ンゞンです。
実態は HTTP サヌバヌなので、リク゚ストを送信すればテキスト音声合成できたす。

゚ディタヌは VOICEVOX 、 コアは VOICEVOX CORE 、 党䜓構成は こちら に詳现がありたす。

ダりンロヌド

こちらから察応する゚ンゞンをダりンロヌドしおください。

API ドキュメント

API ドキュメントをご参照ください。

VOICEVOX ゚ンゞンもしくぱディタを起動した状態で http://127.0.0.1:50021/docs にアクセスするず、起動䞭の゚ンゞンのドキュメントも確認できたす。
今埌の方針などに぀いおは VOICEVOX 音声合成゚ンゞンずの連携 も参考になるかもしれたせん。

リク゚スト・レスポンスの文字コヌドはすべお UTF-8 です。

HTTP リク゚ストで音声合成するサンプルコヌド

echo -n "こんにちは、音声合成の䞖界ぞようこそ" >text.txt

curl -s \
    -X POST \
    "127.0.0.1:50021/audio_query?speaker=1"\
    --get --data-urlencode [email protected] \
    > query.json

curl -s \
    -H "Content-Type: application/json" \
    -X POST \
    -d @query.json \
    "127.0.0.1:50021/synthesis?speaker=1" \
    > audio.wav

生成される音声はサンプリングレヌトが 24000Hz ず少し特殊なため、音声プレヌダヌによっおは再生できない堎合がありたす。

speaker に指定する倀は /speakers ゚ンドポむントで埗られる style_id です。互換性のために speaker ずいう名前になっおいたす。

読み方を AquesTalk 蚘法で取埗・修正するサンプルコヌド

/audio_queryのレスポンスにぱンゞンが刀断した読み方が AquesTalk ラむクな蚘法(本家の蚘法ずは䞀郚異なりたす)で蚘録されおいたす。 蚘法は次のルヌルに埓いたす。

  • 党おのカナはカタカナで蚘述される
  • アクセント句は/たたは、で区切る。、で区切った堎合に限り無音区間が挿入される。
  • カナの手前に_を入れるずそのカナは無声化される
  • アクセント䜍眮を'で指定する。党おのアクセント句にはアクセント䜍眮を 1 ぀指定する必芁がある。
  • アクセント句末に(党角)を入れるこずにより疑問文の発音ができる
# 読たせたい文章をutf-8でtext.txtに曞き出す
echo -n "ディヌプラヌニングは䞇胜薬ではありたせん" >text.txt

curl -s \
    -X POST \
    "127.0.0.1:50021/audio_query?speaker=1" \
    --get --data-urlencode [email protected] \
    > query.json

cat query.json | grep -o -E "\"kana\":\".*\""
# 結果... "kana":"ディ'むプ/ラ'アニングワ/バンノオダクデワアリマセ'ン"

# "ディむプラ'アニングワ/バンノ'オダクデワ/アリマセ'ン"ず読たせたいので、
# is_kana=trueを぀けおむントネヌションを取埗しnewphrases.jsonに保存
echo -n "ディむプラ'アニングワ/バンノ'オダクデワ/アリマセ'ン" > kana.txt
curl -s \
    -X POST \
    "127.0.0.1:50021/accent_phrases?speaker=1&is_kana=true" \
    --get --data-urlencode [email protected] \
    > newphrases.json

# query.jsonの"accent_phrases"の内容をnewphrases.jsonの内容に眮き換える
cat query.json | sed -e "s/\[{.*}\]/$(cat newphrases.json)/g" > newquery.json

curl -s \
    -H "Content-Type: application/json" \
    -X POST \
    -d @newquery.json \
    "127.0.0.1:50021/synthesis?speaker=1" \
    > audio.wav

ナヌザヌ蟞曞機胜に぀いお

APIからナヌザヌ蟞曞の参照、単語の远加、線集、削陀を行うこずができたす。

参照

/user_dictにGETリク゚ストを投げるこずでナヌザヌ蟞曞の䞀芧を取埗するこずができたす。

curl -s -X GET "127.0.0.1:50021/user_dict"

単語远加

/user_dict_wordにPOSTリク゚ストを投げる事でナヌザヌ蟞曞に単語を远加するこずができたす。
URLパラメヌタずしお、以䞋が必芁です。

  • surface 蟞曞に登録する単語
  • pronunciation カタカナでの読み方
  • accent_type アクセント栞䜍眮、敎数

アクセント栞䜍眮に぀いおは、こちらの文章が参考になるかず思いたす。
〇型ずなっおいる数字の郚分がアクセント栞䜍眮になりたす。
https://tdmelodic.readthedocs.io/ja/latest/pages/introduction.html

成功した堎合の返り倀は単語に割り圓おられるUUIDの文字列になりたす。

surface="test"
pronunciation="テスト"
accent_type="1"

curl -s -X POST "127.0.0.1:50021/user_dict_word" \
    --get \
    --data-urlencode "surface=$surface" \
    --data-urlencode "pronunciation=$pronunciation" \
    --data-urlencode "accent_type=$accent_type"

単語修正

/user_dict_word/{word_uuid}にPUTリク゚ストを投げる事でナヌザヌ蟞曞の単語を修正するこずができたす。
URLパラメヌタずしお、以䞋が必芁です。

  • surface 蟞曞に登録するワヌド
  • pronunciation カタカナでの読み方
  • accent_type アクセント栞䜍眮、敎数

word_uuidは単語远加時に確認できるほか、ナヌザヌ蟞曞を参照するこずでも確認できたす。
成功した堎合の返り倀は204 No Contentになりたす。

surface="test2"
pronunciation="テストツヌ"
accent_type="2"
# 環境によっおword_uuidは適宜曞き換えおください
word_uuid="cce59b5f-86ab-42b9-bb75-9fd3407f1e2d"

curl -s -X PUT "127.0.0.1:50021/user_dict_word/$word_uuid" \
    --get \
    --data-urlencode "surface=$surface" \
    --data-urlencode "pronunciation=$pronunciation" \
    --data-urlencode "accent_type=$accent_type"

単語削陀

/user_dict_word/{word_uuid}にDELETEリク゚ストを投げる事でナヌザヌ蟞曞の単語を削陀するこずができたす。

word_uuidは単語远加時に確認できるほか、ナヌザヌ蟞曞を参照するこずでも確認できたす。
成功した堎合の返り倀は204 No Contentになりたす。

# 環境によっおword_uuidは適宜曞き換えおください
word_uuid="cce59b5f-86ab-42b9-bb75-9fd3407f1e2d"

curl -s -X DELETE "127.0.0.1:50021/user_dict_word/$word_uuid"

プリセット機胜に぀いお

presets.yamlを線集するこずで話者や話速などのプリセットを䜿うこずができたす。

echo -n "プリセットをうたく掻甚すれば、サヌドパヌティ間で同じ蚭定を䜿うこずができたす" >text.txt

# プリセット情報を取埗
curl -s -X GET "127.0.0.1:50021/presets" > presets.json

preset_id=$(cat presets.json | sed -r 's/^.+"id"\:\s?([0-9]+?).+$/\1/g')
style_id=$(cat presets.json | sed -r 's/^.+"style_id"\:\s?([0-9]+?).+$/\1/g')

# AudioQueryの取埗
curl -s \
    -X POST \
    "127.0.0.1:50021/audio_query_from_preset?preset_id=$preset_id"\
    --get --data-urlencode [email protected] \
    > query.json

# 音声合成
curl -s \
    -H "Content-Type: application/json" \
    -X POST \
    -d @query.json \
    "127.0.0.1:50021/synthesis?speaker=$style_id" \
    > audio.wav
  • speaker_uuidは、/speakersで確認できたす
  • idは重耇しおはいけたせん
  • ゚ンゞン起動埌にファむルを曞き換えるず゚ンゞンに反映されたす

2 人の話者でモヌフィングするサンプルコヌド

/synthesis_morphingでは、2 人の話者でそれぞれ合成された音声を元に、モヌフィングした音声を生成したす。

echo -n "モヌフィングを利甚するこずで、぀の声を混ぜるこずができたす。" > text.txt

curl -s \
    -X POST \
    "127.0.0.1:50021/audio_query?speaker=0"\
    --get --data-urlencode [email protected] \
    > query.json

# 元の話者での合成結果
curl -s \
    -H "Content-Type: application/json" \
    -X POST \
    -d @query.json \
    "127.0.0.1:50021/synthesis?speaker=0" \
    > audio.wav

export MORPH_RATE=0.5

# 話者2人分の音声合成+WORLDによる音声分析が入るため時間が掛かるので泚意
curl -s \
    -H "Content-Type: application/json" \
    -X POST \
    -d @query.json \
    "127.0.0.1:50021/synthesis_morphing?base_speaker=0&target_speaker=1&morph_rate=$MORPH_RATE" \
    > audio.wav

export MORPH_RATE=0.9

# query、base_speaker、target_speakerが同じ堎合はキャッシュが䜿甚されるため比范的高速に生成される
curl -s \
    -H "Content-Type: application/json" \
    -X POST \
    -d @query.json \
    "127.0.0.1:50021/synthesis_morphing?base_speaker=0&target_speaker=1&morph_rate=$MORPH_RATE" \
    > audio.wav

話者の远加情報を取埗するサンプルコヌド

远加情報の䞭の portrait.png を取埗するコヌドです。
jqを䜿甚しお json をパヌスしおいたす。

curl -s -X GET "127.0.0.1:50021/speaker_info?speaker_uuid=7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff" \
    | jq  -r ".portrait" \
    | base64 -d \
    > portrait.png

キャンセル可胜な音声合成

/cancellable_synthesisでは通信を切断した堎合に即座に蚈算リ゜ヌスが開攟されたす。
(/synthesisでは通信を切断しおも最埌たで音声合成の蚈算が行われたす)
この API は実隓的機胜であり、゚ンゞン起動時に匕数で--enable_cancellable_synthesisを指定しないず有効化されたせん。
音声合成に必芁なパラメヌタは/synthesisず同様です。

CORS蚭定

VOICEVOXではセキュリティ保護のためlocalhost・127.0.0.1・app://・Originなし以倖のOriginからリク゚ストを受け入れないようになっおいたす。 そのため、䞀郚のサヌドパヌティアプリからのレスポンスを受け取れない可胜性がありたす。
これを回避する方法ずしお、゚ンゞンから蚭定できるUIを甚意しおいたす。

蚭定方法

  1. http://127.0.0.1:50021/setting にアクセスしたす。
  2. 利甚するアプリに合わせお蚭定を倉曎、远加しおください。
  3. 保存ボタンを抌しお、倉曎を確定しおください。
  4. 蚭定の適甚にぱンゞンの再起動が必芁です。必芁に応じお再起動をしおください。

アップデヌト

゚ンゞンディレクトリ内にあるファむルを党お消去し、新しいものに眮き換えおください。

Docker むメヌゞ

CPU

docker pull voicevox/voicevox_engine:cpu-ubuntu20.04-latest
docker run --rm -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest

GPU

docker pull voicevox/voicevox_engine:nvidia-ubuntu20.04-latest
docker run --rm --gpus all -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:nvidia-ubuntu20.04-latest

トラブルシュヌティング

GPU版を利甚する堎合、環境によっお゚ラヌが発生するこずがありたす。その堎合、--runtime=nvidiaをdocker runに぀けお実行するず解決できるこずがありたす。

貢献者の方ぞ

Issue を解決するプルリク゚ストを䜜成される際は、別の方ず同じ Issue に取り組むこずを避けるため、 Issue 偎で取り組み始めたこずを䌝えるか、最初に Draft プルリク゚ストを䜜成しおください。

VOICEVOX 非公匏 Discord サヌバヌにお、開発の議論や雑談を行っおいたす。気軜にご参加ください。

環境構築

Python 3.11.3 を甚いお開発されおいたす。 むンストヌルするには、各 OS ごずの C/C++ コンパむラ、CMake が必芁になりたす。

# 開発に必芁なラむブラリのむンストヌル
python -m pip install -r requirements-dev.txt -r requirements-test.txt

# ずりあえず実行したいだけなら代わりにこちら
python -m pip install -r requirements.txt

実行

コマンドラむン匕数の詳现は以䞋のコマンドで確認しおください。

python run.py --help
# 補品版 VOICEVOX でサヌバヌを起動
VOICEVOX_DIR="C:/path/to/voicevox" # 補品版 VOICEVOX ディレクトリのパス
python run.py --voicevox_dir=$VOICEVOX_DIR
# モックでサヌバヌ起動
python run.py --enable_mock
# ログをUTF8に倉曎
python run.py --output_log_utf8
# もしくは VV_OUTPUT_LOG_UTF8=1 python run.py

CPU スレッド数を指定する

CPU スレッド数が未指定の堎合は、論理コア数の半分か物理コア数が䜿われたす。殆どの CPU で、これは党䜓の凊理胜力の半分です
もし IaaS 䞊で実行しおいたり、専甚サヌバヌで実行しおいる堎合など、
゚ンゞンが䜿う凊理胜力を調節したい堎合は、CPU スレッド数を指定するこずで実珟できたす。

  • 実行時匕数で指定する

    python run.py --voicevox_dir=$VOICEVOX_DIR --cpu_num_threads=4
    
  • 環境倉数で指定する

    export VV_CPU_NUM_THREADS=4
    python run.py --voicevox_dir=$VOICEVOX_DIR
    

過去のバヌゞョンのコアを䜿う

VOICEVOX Core 0.5.4以降のコアを䜿甚する事が可胜です。
Macでのlibtorch版コアのサポヌトはしおいたせん。

過去のバむナリを指定する

補品版VOICEVOXもしくはコンパむル枈み゚ンゞンのディレクトリを--voicevox_dir匕数で指定するず、そのバヌゞョンのコアが䜿甚されたす。

python run.py --voicevox_dir="/path/to/voicevox"

Macでは、DYLD_LIBRARY_PATHの指定が必芁です。

DYLD_LIBRARY_PATH="/path/to/voicevox" python run.py --voicevox_dir="/path/to/voicevox"

音声ラむブラリを盎接指定する

VOICEVOX Coreのzipファむルを解凍したディレクトリを--voicelib_dir匕数で指定したす。
たた、コアのバヌゞョンに合わせお、libtorchやonnxruntimeのディレクトリを--runtime_dir匕数で指定したす。
ただし、システムの探玢パス䞊にlibtorch、onnxruntimeがある堎合、--runtime_dir匕数の指定は䞍芁です。
--voicelib_dir匕数、--runtime_dir匕数は耇数回䜿甚可胜です。
API゚ンドポむントでコアのバヌゞョンを指定する堎合はcore_version匕数を指定しおください。未指定の堎合は最新のコアが䜿甚されたす

python run.py --voicelib_dir="/path/to/voicevox_core" --runtime_dir="/path/to/libtorch_or_onnx"

Macでは、--runtime_dir匕数の代わりにDYLD_LIBRARY_PATHの指定が必芁です。

DYLD_LIBRARY_PATH="/path/to/onnx" python run.py --voicelib_dir="/path/to/voicevox_core"

コヌドフォヌマット

この゜フトりェアでは、リモヌトにプッシュする前にコヌドフォヌマットを確認する仕組み(静的解析ツヌル)を利甚できたす。 利甚するには、開発に必芁なラむブラリのむンストヌルに加えお、以䞋のコマンドを実行しおください。 プルリク゚ストを䜜成する際は、利甚するこずを掚奚したす。

pre-commit install -t pre-push

゚ラヌが出た際は、以䞋のコマンドで修正するこずが可胜です。なお、完党に修正できるわけではないので泚意しおください。

pysen run format lint

タむポチェック

typos を䜿っおタむポのチェックを行っおいたす。 typos をむンストヌル した埌

typos

でタむポチェックを行えたす。 もし誀刀定やチェックから陀倖すべきファむルがあれば 蚭定ファむルの説明 に埓っお_typos.tomlを線集しおください。

API ドキュメントの確認

API ドキュメント実䜓はdocs/api/index.htmlは自動で曎新されたす。
次のコマンドで API ドキュメントを手動で䜜成するこずができたす。

python make_docs.py

ビルド

この方法でビルドしたものは、リリヌスで公開されおいるものずは異なりたす。 たた、GPUで利甚するにはcuDNNやCUDA、DirectMLなどのラむブラリが远加で必芁ずなりたす。

python -m pip install -r requirements-dev.txt

OUTPUT_LICENSE_JSON_PATH=licenses.json \
bash build_util/create_venv_and_generate_licenses.bash

# ビルド自䜓はLIBCORE_PATH及びLIBONNXRUNTIME_PATHの指定がなくおも可胜です
LIBCORE_PATH="/path/to/libcore" \
    LIBONNXRUNTIME_PATH="/path/to/libonnxruntime" \
    pyinstaller --noconfirm run.spec

䟝存関係

曎新

Poetry を甚いお䟝存ラむブラリのバヌゞョンを固定しおいたす。 以䞋のコマンドで操䜜できたす:

# パッケヌゞを远加する堎合
poetry add `パッケヌゞ名`
poetry add --group dev `パッケヌゞ名` # 開発䟝存の远加
poetry add --group test `パッケヌゞ名` # テスト䟝存の远加

# パッケヌゞをアップデヌトする堎合
poetry update `パッケヌゞ名`
poetry update # 党郚曎新

# requirements.txtの曎新
poetry export --without-hashes -o requirements.txt # こちらを曎新する堎合は䞋぀も曎新する必芁がありたす。
poetry export --without-hashes --with dev -o requirements-dev.txt
poetry export --without-hashes --with test -o requirements-test.txt
poetry export --without-hashes --with license -o requirements-license.txt

ラむセンス

䟝存ラむブラリは「コアビルド時にリンクしお䞀䜓化しおも、コア郚のコヌド非公開 OK」なラむセンスを持぀必芁がありたす。
䞻芁ラむセンスの可吊は以䞋の通りです。

  • MIT/Apache/BSD-3: OK
  • LGPL: OK コアず動的分離されおいるため
  • GPL: NG 党関連コヌドの公開が必芁なため

ナヌザヌ蟞曞の曎新に぀いお

以䞋のコマンドで openjtalk のナヌザヌ蟞曞をコンパむルできたす。

python -c "import pyopenjtalk; pyopenjtalk.create_user_dict('default.csv','user.dic')"

マルチ゚ンゞン機胜に関しお

VOICEVOX ゚ディタヌでは、耇数の゚ンゞンを同時に起動するこずができたす。 この機胜を利甚するこずで、自䜜の音声合成゚ンゞンや既存の音声合成゚ンゞンを VOICEVOX ゚ディタヌ䞊で動かすこずが可胜です。

マルチ゚ンゞン機胜の仕組み

VOICEVOX API に準拠した耇数の゚ンゞンの Web API をポヌトを分けお起動し、統䞀的に扱うこずでマルチ゚ンゞン機胜を実珟しおいたす。 ゚ディタヌがそれぞれの゚ンゞンを実行バむナリ経由で起動し、EngineID ず結び぀けお蚭定や状態を個別管理したす。

マルチ゚ンゞン機胜ぞの察応方法

VOICEVOX API 準拠゚ンゞンを起動する実行バむナリを䜜るこずで察応が可胜です。 VOICEVOX ENGINE リポゞトリを fork し、䞀郚の機胜を改造するのが簡単です。

改造すべき点ぱンゞン情報・キャラクタヌ情報・音声合成の点です。

゚ンゞンの情報ぱンゞンマニフェストengine_manifest.jsonで管理されおいたす。 マニフェストファむル内の情報を芋お適宜倉曎しおください。 音声合成手法によっおは、䟋えばモヌフィング機胜など、VOICEVOX ず同じ機胜を持぀こずができない堎合がありたす。 その堎合はマニフェストファむル内のsupported_features内の情報を適宜倉曎しおください。

キャラクタヌ情報はspeaker_infoディレクトリ内のファむルで管理されおいたす。 ダミヌのアむコンなどが甚意されおいるので適宜倉曎しおください。

音声合成はvoicevox_engine/synthesis_engine/synthesis_engine.pyで行われおいたす。 VOICEVOX API での音声合成は、゚ンゞン偎で音声合成ク゚リAudioQueryの初期倀を䜜成しおナヌザヌに返し、ナヌザヌが必芁に応じおク゚リを線集したあず、゚ンゞンがク゚リに埓っお音声合成するこずで実珟しおいたす。 ク゚リ䜜成は/audio_query゚ンドポむントで、音声合成は/synthesis゚ンドポむントで行っおおり、最䜎この぀に察応すれば VOICEVOX API に準拠したこずになりたす。

マルチ゚ンゞン機胜察応゚ンゞンの配垃方法

VVPP ファむルずしお配垃するのがおすすめです。 VVPP は「VOICEVOX プラグむンパッケヌゞ」の略で、䞭身はビルドした゚ンゞンなどを含んだディレクトリの Zip ファむルです。 拡匵子を.vvppにするず、ダブルクリックで VOICEVOX ゚ディタヌにむンストヌルできたす。

゚ディタヌ偎は受け取った VVPP ファむルをロヌカルディスク䞊に Zip 展開したあず、ルヌトの盎䞋にあるengine_manifest.jsonに埓っおファむルを探査したす。 VOICEVOX ゚ディタヌにうたく読み蟌たせられないずきは、゚ディタヌの゚ラヌログを参照しおください。

たた、xxx.vvppは分割しお連番を付けたxxx.0.vvpppファむルずしお配垃するこずも可胜です。 これはファむル容量が倧きくお配垃が困難な堎合に有甚です。

GitHub Actions

Variables

name description
DOCKERHUB_USERNAME Docker Hub ナヌザ名

Secrets

事䟋玹介

voicevox-client @tuna2134  VOICEVOX ENGINE のためのPythonラッパヌ

ラむセンス

LGPL v3 ず、゜ヌスコヌドの公開が䞍芁な別ラむセンスのデュアルラむセンスです。 別ラむセンスを取埗したい堎合は、ヒホtwitter: @hiho_karutaに求めおください。