Coder Social home page Coder Social logo

voicevox / voicevox_engine Goto Github PK

View Code? Open in Web Editor NEW
1.3K 29.0 194.0 8.31 MB

無料で使える中品質なテキスト読み上げソフトウェア、VOICEVOXの音声合成エンジン

Home Page: https://voicevox.hiroshiba.jp/

License: Other

Python 94.99% Dockerfile 1.64% Shell 1.06% HTML 2.31%

voicevox_engine's Introduction

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 音声合成エンジンとの連携 も参考になるかもしれません。

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=nvidiadocker runにつけて実行すると解決できることがあります。

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 という名前になっています。

音声を調整するサンプルコード

/audio_query で得られる音声合成用のクエリのパラメータを編集することで、音声を調整できます。

例えば、話速を 1.5 倍速にしてみます。

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

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

# sed を使用して speedScale の値を 1.5 に変更
sed -i -r 's/"speedScale":[0-9.]+/"speedScale":1.5/' query.json

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

読み方を AquesTalk 風記法で取得・修正

AquesTalk 風記法

AquesTalk 風記法」はカタカナと記号だけで読み方を指定する記法です。AquesTalk 本家の記法とは一部が異なります。
AquesTalk 風記法は次のルールに従います:

  • 全てのカナはカタカナで記述される
  • アクセント句は / または で区切る。 で区切った場合に限り無音区間が挿入される。
  • カナの手前に _ を入れるとそのカナは無声化される
  • アクセント位置を ' で指定する。全てのアクセント句にはアクセント位置を 1 つ指定する必要がある。
  • アクセント句末に (全角)を入れることにより疑問文の発音ができる

AquesTalk 風記法のサンプルコード

/audio_queryのレスポンスにはエンジンが判断した読み方がAquesTalk 風記法で記述されます。
これを修正することで音声の読み仮名やアクセントを制御できます。

# 読ませたい文章を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"

辞書のインポート&エクスポート

エンジンの設定ページ内の「ユーザー辞書のエクスポート&インポート」節で、ユーザー辞書のインポート&エクスポートが可能です。

他にも API でユーザー辞書のインポート&エクスポートが可能です。
インポートには POST /import_user_dict、エクスポートには GET /user_dict を利用します。
引数等の詳細は API ドキュメントをご覧ください。

プリセット機能について

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')

# 音声合成用のクエリを取得
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 "モーフィングを利用することで、2種類の声を混ぜることができます。" > text.txt

curl -s \
    -X POST \
    "127.0.0.1:50021/audio_query?speaker=8"\
    --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=8" \
    > 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=8&target_speaker=10&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=8&target_speaker=10&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と同様です。

HTTP リクエストで歌声合成するサンプルコード

echo -n '{
  "notes": [
    { "key": null, "frame_length": 15, "lyric": "" },
    { "key": 60, "frame_length": 45, "lyric": "ド" },
    { "key": 62, "frame_length": 45, "lyric": "レ" },
    { "key": 64, "frame_length": 45, "lyric": "ミ" },
    { "key": null, "frame_length": 15, "lyric": "" }
  ]
}' > score.json

curl -s \
    -H "Content-Type: application/json" \
    -X POST \
    -d @score.json \
    "127.0.0.1:50021/sing_frame_audio_query?speaker=6000" \
    > query.json

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

スコアのkeyは MIDI 番号です。
lyricは歌詞で、任意の文字列を指定できますが、エンジンによってはひらがな・カタカナ1モーラ以外の文字列はエラーになることがあります。
フレームレートはデフォルトが 93.75Hz で、エンジンマニフェストのframe_rateで取得できます。
1つ目のノートは無音である必要があります。

/sing_frame_audio_queryで指定できるspeakerは、/singersで取得できるスタイルの内、種類がsingsinging_teacherなスタイルのstyle_idです。
/frame_synthesisで指定できるspeakerは、/singersで取得できるスタイルの内、種類がframe_decodestyle_idです。
引数が speaker という名前になっているのは、他の API と一貫性をもたせるためです。

/sing_frame_audio_query/frame_synthesisに異なるスタイルを指定することも可能です。

CORS 設定

VOICEVOX ではセキュリティ保護のためlocalhost127.0.0.1app://・Origin なし以外の Origin からリクエストを受け入れないようになっています。 そのため、一部のサードパーティアプリからのレスポンスを受け取れない可能性があります。
これを回避する方法として、エンジンから設定できる UI を用意しています。

設定方法

  1. http://127.0.0.1:50021/setting にアクセスします。
  2. 利用するアプリに合わせて設定を変更、追加してください。
  3. 保存ボタンを押して、変更を確定してください。
  4. 設定の適用にはエンジンの再起動が必要です。必要に応じて再起動をしてください。

データを変更する API を無効化する

実行時引数--disable_mutable_apiか環境変数VV_DISABLE_MUTABLE_API=1を指定することで、エンジンの設定や辞書などを変更する API を無効にできます。

文字コード

リクエスト・レスポンスの文字コードはすべて UTF-8 です。

その他の引数

エンジン起動時に引数を指定できます。詳しいことは-h引数でヘルプを確認してください。

$ python run.py -h

usage: run.py [-h] [--host HOST] [--port PORT] [--use_gpu] [--voicevox_dir VOICEVOX_DIR] [--voicelib_dir VOICELIB_DIR] [--runtime_dir RUNTIME_DIR] [--enable_mock] [--enable_cancellable_synthesis]
              [--init_processes INIT_PROCESSES] [--load_all_models] [--cpu_num_threads CPU_NUM_THREADS] [--output_log_utf8] [--cors_policy_mode {CorsPolicyMode.all,CorsPolicyMode.localapps}]
              [--allow_origin [ALLOW_ORIGIN ...]] [--setting_file SETTING_FILE] [--preset_file PRESET_FILE] [--disable_mutable_api]

VOICEVOX のエンジンです。

options:
  -h, --help            show this help message and exit
  --host HOST           接続を受け付けるホストアドレスです。
  --port PORT           接続を受け付けるポート番号です。
  --use_gpu             GPUを使って音声合成するようになります。
  --voicevox_dir VOICEVOX_DIR
                        VOICEVOXのディレクトリパスです。
  --voicelib_dir VOICELIB_DIR
                        VOICEVOX COREのディレクトリパスです。
  --runtime_dir RUNTIME_DIR
                        VOICEVOX COREで使用するライブラリのディレクトリパスです。
  --enable_mock         VOICEVOX COREを使わずモックで音声合成を行います。
  --enable_cancellable_synthesis
                        音声合成を途中でキャンセルできるようになります。
  --init_processes INIT_PROCESSES
                        cancellable_synthesis機能の初期化時に生成するプロセス数です。
  --load_all_models     起動時に全ての音声合成モデルを読み込みます。
  --cpu_num_threads CPU_NUM_THREADS
                        音声合成を行うスレッド数です。指定しない場合、代わりに環境変数 VV_CPU_NUM_THREADS の値が使われます。VV_CPU_NUM_THREADS が空文字列でなく数値でもない場合はエラー終了します。
  --output_log_utf8     ログ出力をUTF-8でおこないます。指定しない場合、代わりに環境変数 VV_OUTPUT_LOG_UTF8 の値が使われます。VV_OUTPUT_LOG_UTF8 の値が1の場合はUTF-8で、0または空文字、値がない場合は環境によって自動的に決定されます。
  --cors_policy_mode {CorsPolicyMode.all,CorsPolicyMode.localapps}
                        CORSの許可モード。allまたはlocalappsが指定できます。allはすべてを許可します。localappsはオリジン間リソース共有ポリシーを、app://.とlocalhost関連に限定します。その他のオリジンはallow_originオプションで追加できます。デフォルトはlocalapps。このオプションは--
                        setting_fileで指定される設定ファイルよりも優先されます。
  --allow_origin [ALLOW_ORIGIN ...]
                        許可するオリジンを指定します。スペースで区切ることで複数指定できます。このオプションは--setting_fileで指定される設定ファイルよりも優先されます。
  --setting_file SETTING_FILE
                        設定ファイルを指定できます。
  --preset_file PRESET_FILE
                        プリセットファイルを指定できます。指定がない場合、環境変数 VV_PRESET_FILE、実行ファイルのディレクトリのpresets.yamlを順に探します。
  --disable_mutable_api
                        辞書登録や設定変更など、エンジンの静的なデータを変更するAPIを無効化します。指定しない場合、代わりに環境変数 VV_DISABLE_MUTABLE_API の値が使われます。VV_DISABLE_MUTABLE_API の値が1の場合は無効化で、0または空文字、値がない場合は無視されます。

アップデート

エンジンディレクトリ内にあるファイルを全て消去し、新しいものに置き換えてください。

貢献者ガイド

VOICEVOX ENGINE は皆さんのコントリビューションをお待ちしています!
詳細は CONTRIBUTING.md をご覧ください。
また VOICEVOX 非公式 Discord サーバーにて、開発の議論や雑談を行っています。気軽にご参加ください。

なお、Issue を解決するプルリクエストを作成される際は、別の方と同じ Issue に取り組むことを避けるため、Issue 側で取り組み始めたことを伝えるか、最初に Draft プルリクエストを作成することを推奨しています。

開発者ガイド

環境構築

Python 3.11.3 を用いて開発されています。 インストールするには、各 OS ごとの C/C++ コンパイラ、CMake が必要になります。

# 実行環境のインストール
python -m pip install -r requirements.txt

# 開発環境・テスト環境・ビルド環境のインストール
python -m pip install -r requirements-dev.txt -r requirements-build.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引数で指定します。
また、コアのバージョンに合わせて、libtorchonnxruntime (共有ライブラリ) のディレクトリを--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"
ユーザーディレクトリに配置する

以下のディレクトリにある音声ライブラリは自動で読み込まれます。

  • ビルド版: <user_data_dir>/voicevox-engine/core_libraries/
  • Python 版: <user_data_dir>/voicevox-engine-dev/core_libraries/

<user_data_dir>は OS によって異なります。

  • Windows: C:\Users\<username>\AppData\Local\
  • macOS: /Users/<username>/Library/Application\ Support/
  • Linux: /home/<username>/.local/share/

ビルド

pyinstaller を用いたパッケージ化と Dockerfile を用いたコンテナ化によりローカルでビルドが可能です。
手順の詳細は 貢献者ガイド#ビルド を御覧ください。

GitHub を用いる場合、fork したリポジトリで GitHub Actions によるビルドが可能です。
Actions を ON にし、workflow_dispatch でbuild-engine-package.ymlを起動すればビルドできます。 成果物は Release にアップロードされます。 ビルドに必要な GitHub Actions の設定は 貢献者ガイド#GitHub Actions を御覧ください。

テスト・静的解析

pytest を用いたテストと各種リンターを用いた静的解析が可能です。
手順の詳細は 貢献者ガイド#テスト, 貢献者ガイド#静的解析 を御覧ください。

依存関係

依存関係は poetry で管理されています。また、導入可能な依存ライブラリにはライセンス上の制約があります。
詳細は 貢献者ガイド#パッケージ を御覧ください。

マルチエンジン機能に関して

VOICEVOX エディターでは、複数のエンジンを同時に起動することができます。 この機能を利用することで、自作の音声合成エンジンや既存の音声合成エンジンを VOICEVOX エディター上で動かすことが可能です。

マルチエンジン機能の仕組み

VOICEVOX API に準拠した複数のエンジンの Web API をポートを分けて起動し、統一的に扱うことでマルチエンジン機能を実現しています。 エディターがそれぞれのエンジンを実行バイナリ経由で起動し、EngineID と結びつけて設定や状態を個別管理します。

マルチエンジン機能への対応方法

VOICEVOX API 準拠エンジンを起動する実行バイナリを作ることで対応が可能です。 VOICEVOX ENGINE リポジトリを fork し、一部の機能を改造するのが簡単です。

改造すべき点はエンジン情報・キャラクター情報・音声合成の3点です。

エンジンの情報はルート直下のマニフェストファイル(engine_manifest.json)で管理されています。 この形式のマニフェストファイルは VOICEVOX API 準拠エンジンに必須です。 マニフェストファイル内の情報を見て適宜変更してください。 音声合成手法によっては、例えばモーフィング機能など、VOICEVOX と同じ機能を持つことができない場合があります。 その場合はマニフェストファイル内のsupported_features内の情報を適宜変更してください。

キャラクター情報はresources/character_infoディレクトリ内のファイルで管理されています。 ダミーのアイコンなどが用意されているので適宜変更してください。

音声合成はvoicevox_engine/tts_pipeline/tts_engine.pyで行われています。 VOICEVOX API での音声合成は、エンジン側で音声合成用のクエリ AudioQuery の初期値を作成してユーザーに返し、ユーザーが必要に応じてクエリを編集したあと、エンジンがクエリに従って音声合成することで実現しています。 クエリ作成は/audio_queryエンドポイントで、音声合成は/synthesisエンドポイントで行っており、最低この2つに対応すれば VOICEVOX API に準拠したことになります。

マルチエンジン機能対応エンジンの配布方法

VVPP ファイルとして配布するのがおすすめです。 VVPP は「VOICEVOX プラグインパッケージ」の略で、中身はビルドしたエンジンなどを含んだディレクトリの Zip ファイルです。 拡張子を.vvppにすると、ダブルクリックで VOICEVOX エディターにインストールできます。

エディター側は受け取った VVPP ファイルをローカルディスク上に Zip 展開したあと、ルートの直下にあるengine_manifest.jsonに従ってファイルを探査します。 VOICEVOX エディターにうまく読み込ませられないときは、エディターのエラーログを参照してください。

また、xxx.vvppは分割して連番を付けたxxx.0.vvpppファイルとして配布することも可能です。 これはファイル容量が大きくて配布が困難な場合に有用です。

事例紹介

voicevox-client @voicevox-client ・・・ VOICEVOX ENGINE の各言語向け API ラッパー

ライセンス

LGPL v3 と、ソースコードの公開が不要な別ライセンスのデュアルライセンスです。 別ライセンスを取得したい場合は、ヒホに求めてください。
X アカウント: @hiho_karuta

voicevox_engine's People

Contributors

aoirint avatar buckw6eat avatar eggplants avatar hiroshiba avatar hyodakazuaki avatar isnot avatar issei0804-ie avatar k-shir0 avatar my-mc avatar nix6839 avatar patchethium avatar pickledchair avatar qwerty2501 avatar raa0121 avatar sabonerune avatar sarisia avatar segu-g avatar sevenc-nanashi avatar siketyan avatar stmtk1 avatar takana-v avatar tarepan avatar tomoish avatar ts-klassen avatar tuna2134 avatar weweweok avatar whiteball avatar y-chan avatar yamachu avatar yosshi999 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

voicevox_engine's Issues

音素とそのテキスト表記が一対一対応していない

不具合の内容

related to https://github.com/Hiroshiba/voicevox/issues/157#issuecomment-912598077

異なる音素が同じテキストに変換されることがある
以下の例はすべてspeaker=1で/audio_queryにPOSTした結果の一部

shi vs si

シ:

{
          "text": "シ",
          "consonant": "sh",
          "vowel": "i"
}

スィ:

{
          "text": "シ",
          "consonant": "s",
          "vowel": "i"
}
zi vs ji

ズィ:

{
          "text": "ジ",
          "consonant": "z",
          "vowel": "i",
}

ジ:

{
          "text": "ジ",
          "consonant": "j",
          "vowel": "i",
}

再現手順

http://localhost:50021/docs#/%E3%82%AF%E3%82%A8%E3%83%AA%E4%BD%9C%E6%88%90
でtextに「スィ」、speakerに「1」を入力

期待動作

textを分ける

  • si -> スィ
  • shi -> シ のまま
  • zi -> ズィ
  • ji -> ジ のまま

VOICEVOXのバージョン

0.4.1

OSの種類/ディストリ/バージョン

Windows 10 Home (19042.1165)

フォーマッターを用意する

僕はよくVSCodeの設定をこのようにしています。
(mypyとblackとflake8を使っています)

{
    "python.linting.enabled": true,
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Args": [
        "--max-line-length=88",
        "--ignore=E203,W503,E741"
    ],
    "python.linting.mypyEnabled": true,
    "python.linting.lintOnSave": true,
    "python.formatting.provider": "black",
    "editor.formatOnSave": true,
    "python.languageServer": "Pylance",
    "[python]": {
        "editor.codeActionsOnSave": {
            "source.organizeImports": true
        }
    },
    "python.sortImports.args": [
        "--multi-line=3",
        "--trailing-comma",
        "--force-grid-wrap=0",
        "--use-parentheses",
        "--line-width=88",
    ],
}

これに合うようなフォーマットを実行できたり、lintしたりするツール&テストがあると良さそうです。

run.pyの改善

内容

run.pyに含まれるFastAPI関連のコードがFastAPIらしい(正確にはFastAPI公式がドキュメントに記している)書き方ではないです。
なので、この際書き直してみるとコードがより整理され、FastAPIらしい綺麗なコードがかけると思います。
要はただのリファクタです。

FastAPIは公式ドキュメント内で、依存するもの(今回であればSynthesis Engineクラス)がある場合、Dependency Injection(依存関係注入)を利用することが可能と示しています。
(参照: https://fastapi.tiangolo.com/tutorial/dependencies/ )
おそらく、現在のような関数内でAPIを定義する形よりも、グローバル下で定義するのが正しい形なのだと思います。

Pros 良くなる点

FastAPIを利用する際の一般的なコードにすることができ、保守性が向上すると思われます。

Cons 悪くなる点

Dependency Injectionを利用すると、各関数にDependsを差し込む引数を用意する必要があり、少し汚く見えてしまうかもしれません。

また、Dependsを利用すると、現状の構造ではCoreをいちいちimportし直す可能性があり、応答速度の低下が起こる可能性があります。まだ未検証事項ではあるので、ここら辺をちゃんと検証したうえでこれをPRに起こすべきか否かを判断すべきと考えます。
(よって、このIssueを取り下げる可能性は十分にあります。)

実現方法

run.pyを書き換える

VOICEVOXのバージョン

0.6.0

スタイルなどが追加されたコアにモックを対応

内容

VOICEVOX CORE 0.6.0から、話者のメタデータのデータ構造がかなり変わりました。
(例えばspeaker_idがありません)

構造はこんな感じです。(metas.json

[
  {
    "name": "四国めたん",
    "styles": [{ "name": "ノーマル", "id": 0 }],
    "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff",
    "version": "0.5.4"
  },
  {
    "name": "ずんだもん",
    "styles": [{ "name": "ノーマル", "id": 1 }],
    "speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9",
    "version": "0.5.4"
  }
]

エンジンはcoreのmetasをスルーパスする形なので、この形式になっても特に変更がいりませんが、モックを修正する必要がありそうです。

pyopenjtalk が pip install できなくなっている

ビルドに入る前に、URL 指定のコミットをチェックアウトできないようです。

https://github.com/Hiroshiba/voicevox_engine/blob/d82d0859b5a585c9a848fbb7c6d9992e2e11b1f9/requirements.txt#L7

(venv) > python -m pip install git+https://github.com/Hiroshiba/pyopenjtalk@69e5f354634f98098113f9cac5a6ea736443f9c9
Collecting git+https://github.com/Hiroshiba/pyopenjtalk@69e5f354634f98098113f9cac5a6ea736443f9c9
Cloning https://github.com/Hiroshiba/pyopenjtalk (to revision 69e5f354634f98098113f9cac5a6ea736443f9c9) to c:\users\buckw6eat\appdata\local\temp\pip-req-build-fip06c44
Running command git clone -q https://github.com/Hiroshiba/pyopenjtalk 'C:\Users\buckw6eat\AppData\Local\Temp\pip-req-build-fip06c44'
Running command git checkout -q 69e5f354634f98098113f9cac5a6ea736443f9c9
fatal: reference is not a tree: 69e5f354634f98098113f9cac5a6ea736443f9c9
ERROR: Command errored out with exit status 128: git checkout -q 69e5f354634f98098113f9cac5a6ea736443f9c9 Check the logs for full command output.

Hiroshiba@89a8b4f で変更前の git ソース (from #7) からであればインストール可能です。

git+https://github.com/r9y9/pyopenjtalk@59a33c04f81fab636e0f570708efea39bcd6b511

#16 なり #24 なりを崩すのに requirements.txt の再現性が欲しいのですが、戻してもよろしいでしょうか?

推論エンジンにONNXを採用し、サイズ削減とモデルポータビリティを向上させる

内容

現在特徴量からwave形式のfloat列を推論する each_cpp_forwarder にはTorchが使用されている。
TorchScriptを使っているためポータビリティが良く、PythonでもC++でも使用できるみたいなメリットを享受できている。

しかしTorchLibrary自体のサイズが非常に大きく、VOICEVOX ENGINEをフルビルドし動作させるためのランタイムを同梱すると4GBを超える非常に大きなものとなっている。
バージョンアップの度に4GB以上のダウンロードが行われるのは体験的に好ましくないだろう。

そこでRuntimeのサイズが小さく同等レベルのポータビリティを備えるONNXを使用することを提案する。

Pros 良くなる点

  • Runtimeが小さいため、バンドルサイズが削減できる
    • Torch単体で1GBを超えるが、ONNXは100MBを超えない
    • GPUでの推論のためにはCudaのランタイムが必要であるためその分のランタイムを同梱する必要があるが、現在のTorchが依存しているものよりは少なくなると予想される
  • ポータビリティが更に担保される
    • 多くの言語バインディングが存在し、each_cpp_forearderが存在しなくてもモデル単体を提供して多くの言語、プラットフォーム上で推論を行うことが可能
    • Webブラウザ上で推論を行うためのライブラリも提供が開始され、VOICEVOXの更なる展開が望める(?)

Cons 悪くなる点

  • CPP側で実装している箇所の大幅な書き換え(?)
    • どう実装されているのかわかっていないので想像で語っています

実現方法

  • TorchScriptでモデルを保存する際にtorch.onnx.exportで出力する
    • しかしONNXで実装されていないOperatorが存在した場合正常に出力できないなどあるので、ここで詰まることがあるかもしれません

VOICEVOXのバージョン

0.4.1

OSの種類/ディストリ/バージョン

  • Others

その他

大分古いバージョンでの作業例ですが

yamachu/nnmnkwii@7add37f

オレオレAutogradを作った場合こんな感じでONNXにする時にどう変換してほしいか書く必要があるものもあります(yukarin_s_forwarderとかsaとかその辺りがどう実装されているのかわからないので、単純にexportするだけで上手くいくかもしれません)。

もしかしたらEngineよりもCoreの方が適しているIssueかもしれませんね…

wavのサンプルレートについて

初めまして。少し気になったことがあるので、Issueを起票させていただきます。

現状、wavの出力サンプルレートが24kHzに固定されていると思います。
こちら、24kHzで固定している理由は何かあるのでしょうか?
(音声合成の上で何かしら常識みたいなものであればすみません...)

このようなIssueを起票した理由としては、諸事情により48kHzで出力したいからです。
私自身は音声合成等に詳しくなく、その上VOICEVOX Engineが依存している他のライブラリ等にも詳しくないので、48kHzで出力しようとしてもうまくいかなかったのです。

出来れば48kHzに限らず、出力サンプルレートの変更を任意にできればよいかなと思い、起票させていただきました。

このIssueについてはエンドユーザー的に何も影響がなく、優先度の低いことだとは思いますが、よろしくお願いします。

テストを書いてCIを設定したい

バージョン0.3.0アップデートの際に、簡単に気づけそうなバグがあった状態でリリースされてしまいました。
https://github.com/Hiroshiba/voicevox_engine/pull/15/files#diff-d6af0459a37d985953d7040c14f53feb3b9cc9e58b543aa3c2b80256d276c5e0

この部分は音声ライブラリがなくても動くので、テストを書いていれば気づけたはずです。
とりあえずgithub actionsでCIを設定して、音声ライブラリのモックを作ってテストを充実させていきたいです。

Linux用実行バイナリの動作検証

ref: #96
ref: #95

VOICEVOX ENGINEのLinux用実行バイナリを試した方がおられましたら、動作環境を返信で教えてくださるとうれしいです!

Linux用実行バイナリは、 masterブランチにコミットが追加されたときに自動実行されるWorkflowの実行結果(Summary)から、zipファイルとしてダウンロードすることができます。

展開すると、実行バイナリ run を含むファイル群を取り出せます。
zip内にディレクトリがないため、カレントディレクトリに直接中身が展開されるおそれがあるので注意してください(あらかじめディレクトリを作ってから、unzip -d dest/ file.zip)。

GitHub Artifactの仕様(zipの仕様)により、run ファイルに実行権限が付与されていないため、手動でchmod +x runする必要があります( actions/upload-artifact#38 )。

想定動作環境における、ある程度の調査ができた段階で、このIssueはいったんCloseし、個別のIssueを立てる形に移行するのがいいかな、と思っています。

想定している動作環境

  • Ubuntu 20.04(CPU amd64/x86_64、NVIDIA GPU)
  • Debian 11(CPU amd64/x86_64
  • Fedora 34(CPU amd64/x86_64
  • Ubuntu 18.04、CentOS 8、Cent OS Stream 8 については、#116 がマージされたため、動くかもしれません(未調査)

想定環境以外で動作した・動作しなかったときも、(動かした・動かそうとした方法を含めて)ぜひ教えてください!

詳細な動作環境

以下は、 #116 以前の動作環境になります。#116 以降については、未調査です。

  • glibc >= 2.29
    • Ubuntu/Debian: /lib/x86_64-linux-gnu/libc.so.6 を実行
    • Fedora: /lib64/libc.so.6 を実行
  • libstdc++ GLIBCXX_3.4.26
    • Ubuntu/Debian: apt update && apt install binutilsstrings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX_ を実行
    • Fedora: yum install binutilsstrings /lib64/libstdc++.so.6 | grep GLIBCXX_ を実行

知りたいこと

  • 使用した実行バイナリのバージョン(コミットハッシュ、WorkflowのURL)
  • CPUの種類
    • amd64/x86_64
  • OS
    • ネイティブ(PCに直接インストール)
      • OSの種類・バージョン
        • cat /etc/os-release
    • WSL
      • (Windowsのバージョン)
      • WSL側のOSの種類・バージョン
        • cat /etc/os-release
    • WSL2
      • (Windowsのバージョン)
      • WSL2側のOSの種類・バージョン
        • cat /etc/os-release
    • Docker
      • ホスト側OSの種類・バージョン
        • cat /etc/os-release
        • (Windows/macOSのバージョン・Docker Desktopのバージョン)
      • イメージ名・タグ名(イメージのダイジェスト)
      • 自作イメージの場合
        • ベースイメージ名
        • Dockerfile
  • glibcのバージョン
    • Ubuntu/Debian: /lib/x86_64-linux-gnu/libc.so.6 を実行
    • Fedora: /lib64/libc.so.6 を実行
  • libstdc++
    • バージョン
      • Ubuntu/Debian: apt list --installed libstdc++* を実行
      • Fedora: rpm -q libstdc++ を実行
    • GLIBCXX_ 対応バージョン
      • Ubuntu/Debian: apt update && apt install binutilsstrings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX_ を実行
      • Fedora: yum install binutilsstrings /lib64/libstdc++.so.6 | grep GLIBCXX_ を実行
  • 音声合成に使用したプロセッサの種類(CPUか、GPUか=--use_gpu
    • CPU
    • NVIDIA GPU
      • NVIDIA Driverのバージョン(e.g. 470.57.02
      • CUDAのバージョン(e.g. 11.4.1
  • 実行コマンド(実行までの流れ)
  • 実際に音声合成はできたか?
    • エラーが起きていないか?
    • mockが使われていないか?

動かし方

libsndfile(VOICEVOX ENGINEのAPIが返す、wavファイルの作成に使用)をインストール。

# Ubuntu 20.04, Debian 11
apt update
apt install libsndfile1

# Fedora 34
yum install libsndfile

CUDA/cuDNNをインストール(GPU実行の場合)。

実行バイナリをGithub ActionsのSummaryからダウンロード、展開、実行。

chmod +x ./run

# ネイティブ環境の場合
./run

# Dockerコンテナの場合(-p '127.0.0.1:50021:50021')
./run --host 0.0.0.0

既知の問題

libcore側のwarning表示

[W BinaryOps.cpp:467] Warning: floor_divide is deprecated, and will be removed in a future version of pytorch. It currently rounds toward 0 (like the 'trunc' function NOT 'floor'). This results in incorrect rounding for negative values.
To keep the current behavior, use torch.div(a, b, rounding_mode='trunc'), or for actual floor division, use torch.div(a, b, rounding_mode='floor'). (function operator())

ビルドの自動化

内容

VOICEVOXのコアライブラリが公開されました。 https://github.com/Hiroshiba/voicevox_core
これを用いれば、ビルドを自動化できるはずです。
(ちなみにエンジンのビルドは数十分かかります)

このタスクは非常に長くなると思われます。
ちょっとでも取り掛かった方がいたら、ぜひコメントで知見ややり方を共有して頂けると・・・!

プロジェクト変更の確認ダイアログが出ずに新規作成を実行できてしまう

内容

プロジェクトを変更している状態で新規作成を実行すると、確認ダイアログなどが表示されずにプロジェクトが新規作成されてしまいます。
プロジェクトが変更された場合は新規作成を実行したときに確認ダイアログが出るべきです。

Pros 良くなる点

誤ってプロジェクトを新規作成してしまっても対処できる。

Cons 悪くなる点

特になし

実現方法

不明

VOICEVOXのバージョン

0.7.0

OSの種類/ディストリ/バージョン

Windows 10 Home 64bit (19043.1237)

Mock 版で起動しない

不具合の内容

#78 マージ後より Mock 版 (voicevox-dir を指定しない、このプロジェクト単独での実行) で起動しない

現象・ログ

$ python run.py
Notice: mock-library will be used. Try re-run with valid --voicevox_dir
Traceback (most recent call last):
  File "run.py", line 331, in <module>
    voicelib_dir=args.voicelib_dir,
  File "run.py", line 81, in make_synthesis_engine
    from voicevox_engine.dev.synthesis_engine import (
  File "C:\github\voicevox_engine\voicevox_engine\dev\synthesis_engine\__init__.py", line 1, in <module>
    from .mock import SynthesisEngine
  File "C:\github\voicevox_engine\voicevox_engine\dev\synthesis_engine\mock.py", line 13, in <module>
    class SynthesisEngine:
  File "C:\github\voicevox_engine\voicevox_engine\dev\synthesis_engine\mock.py", line 64, in SynthesisEngine
    def synthesis(self, query: AudioQuery, speaker_id: int) -> npt.NDArray[np.int16]:
AttributeError: module 'numpy.typing' has no attribute 'NDArray'
pip list (パッケージ一覧)
$ pip list
Package            Version
------------------ -------------
aiofiles           0.7.0
asgiref            3.4.1
cffi               1.14.6
click              8.0.1
colorama           0.4.4
Cython             0.29.24
fastapi            0.68.1
h11                0.12.0
importlib-metadata 4.8.1
llvmlite           0.37.0
numba              0.54.0
numpy              1.20.0
pip                20.1.1
pycparser          2.20
pydantic           1.8.2
pyopenjtalk        0.1.4+69e5f35
python-multipart   0.0.5
resampy            0.2.2
scipy              1.7.1
setuptools         47.1.0
six                1.16.0
SoundFile          0.10.3.post1
starlette          0.14.2
typing-extensions  3.10.0.2
uvicorn            0.15.0
zipp               3.5.0
WARNING: You are using pip version 20.1.1; however, version 21.2.4 is available.
You should consider upgrading via the 'c:\github\voicevox_engine\venv-check-marged-87\scripts\python.exe -m pip install --upgrade pip' command.

再現手順

# venv 新しく作る
python -m venv venv-check-issue-79
source venv-check-issue-79/Scripts/Activate

# 依存関係インストール
pip install -r requirements.txt

# Mock でエンジン実行
python run.py

期待動作

エンジンが起動すること。

VOICEVOXのバージョン

0.5.1 5ed623e

OSの種類/ディストリ/バージョン

  • Windows 10 Pro 64bit (10.0.19043)

その他

numpy.typing,NDArray はかなり最近の機能である。
https://github.com/numpy/numpy/releases/tag/v1.21.0

A runtime-subcriptable alias has been added for ndarray

numpy.typing.NDArray has been added, a runtime-subscriptable alias for
np.ndarray[Any, np.dtype[~Scalar]]. The new type alias can be used for
annotating arrays with a given dtype and unspecified shape.

特定の文字列の音声合成用のクエリ作成に失敗する

不具合の内容

特定の文字列の音声合成用のクエリ作成に失敗する

現象・ログ

172.16.0.1
INFO:     127.0.0.1:54944 - "POST /audio_query?text=172.16.0.1&speaker=1 HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 373, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 75, in __call__
    return await self.app(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\fastapi\applications.py", line 208, in __call__
    await super().__call__(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\applications.py", line 112, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\middleware\errors.py", line 181, in __call__
    raise exc from None
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\middleware\errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\middleware\cors.py", line 86, in __call__
    await self.simple_response(scope, receive, send, request_headers=headers)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\middleware\cors.py", line 142, in simple_response
    await self.app(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\exceptions.py", line 82, in __call__
    raise exc from None
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\routing.py", line 580, in __call__
    await route.handle(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\routing.py", line 241, in handle
    await self.app(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\routing.py", line 52, in app
    response = await func(request)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\fastapi\routing.py", line 220, in app
    dependant=dependant, values=values, is_coroutine=is_coroutine
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\fastapi\routing.py", line 154, in run_endpoint_function
    return await run_in_threadpool(dependant.call, **values)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\concurrency.py", line 40, in run_in_threadpool
    return await loop.run_in_executor(None, func, *args)
  File "C:\Python37\lib\concurrent\futures\thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "run.py", line 177, in audio_query
    accent_phrases=create_accent_phrases(text, speaker_id=speaker),
  File "run.py", line 163, in create_accent_phrases
    speaker_id=speaker_id,
  File "run.py", line 113, in replace_mora_data
    accent_phrases=accent_phrases, speaker_id=speaker_id
  File "C:\home\develop\voicevox_engine\voicevox_engine\synthesis_engine.py", line 149, in replace_phoneme_data
    for accent_phrase in accent_phrases
  File "C:\home\develop\voicevox_engine\voicevox_engine\synthesis_engine.py", line 149, in <listcomp>
    for accent_phrase in accent_phrases
IndexError: index 2 is out of bounds for axis 0 with size 2
か。ら
INFO:     127.0.0.1:54778 - "POST /audio_query?text=%E3%81%8B%E3%80%82%E3%82%89&speaker=1 HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 373, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 75, in __call__
    return await self.app(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\fastapi\applications.py", line 208, in __call__
    await super().__call__(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\applications.py", line 112, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\middleware\errors.py", line 181, in __call__
    raise exc from None
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\middleware\errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\middleware\cors.py", line 86, in __call__
    await self.simple_response(scope, receive, send, request_headers=headers)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\middleware\cors.py", line 142, in simple_response
    await self.app(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\exceptions.py", line 82, in __call__
    raise exc from None
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\routing.py", line 580, in __call__
    await route.handle(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\routing.py", line 241, in handle
    await self.app(scope, receive, send)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\routing.py", line 52, in app
    response = await func(request)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\fastapi\routing.py", line 220, in app
    dependant=dependant, values=values, is_coroutine=is_coroutine
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\fastapi\routing.py", line 154, in run_endpoint_function
    return await run_in_threadpool(dependant.call, **values)
  File "C:\home\develop\voicevox_engine\.venv\lib\site-packages\starlette\concurrency.py", line 40, in run_in_threadpool
    return await loop.run_in_executor(None, func, *args)
  File "C:\Python37\lib\concurrent\futures\thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "run.py", line 177, in audio_query
    accent_phrases=create_accent_phrases(text, speaker_id=speaker),
  File "run.py", line 163, in create_accent_phrases
    speaker_id=speaker_id,
  File "run.py", line 113, in replace_mora_data
    accent_phrases=accent_phrases, speaker_id=speaker_id
  File "C:\home\develop\voicevox_engine\voicevox_engine\synthesis_engine.py", line 137, in replace_phoneme_data
    for accent_phrase in accent_phrases
  File "C:\home\develop\voicevox_engine\voicevox_engine\synthesis_engine.py", line 137, in <listcomp>
    for accent_phrase in accent_phrases
IndexError: index 1 is out of bounds for axis 0 with size 1

再現手順

$ curl -X 'POST'   'http://localhost:50021/audio_query?text=172.16.0.1&speaker=1'
Internal Server Error

期待動作

json が生成される

VOICEVOXのバージョン

0.4.0

OSの種類/ディストリ/バージョン

  • Windows 10 Home 64bit 21H1 (19043.1165)

長さ調整パラメータを実装する

VOICEVOXの音声ライブラリは、実は音素ごとの長さの調整に対応しています。
話速はこの長さを全部定数倍することで実現しています。
https://github.com/Hiroshiba/voicevox_engine/blob/c35d7c3996fe235189e46d8b87c3ad81e4400487/voicevox_engine/synthesis_engine.py#L258

しかしエンジン側にその制御機能がなく、かつソフトウェア側に制御UIがないため、音素ごとの長さを変えることができません。

まず音素長を求める処理を音声合成処理から分離し、
MoraModelの音素(子音・母音)ごとに長さのパラメータを設けて入出力を可能にすれば実現できそうです。

参考までに、音量パラメータを追加するプルリクエストを紹介します。 https://github.com/Hiroshiba/voicevox_engine/pull/19

プリセット機能を持たせる

内容

コメント読み上げなどのサードパーティソフトからエンジンを利用する際、音量や音高を調整したキャラクター音声を用いたいという要望を頂きました。
https://twitter.com/yakisobakuitai/status/1450763401693577219
ソフトウェアとは別に、エンジン側にプリセット機能を持たせても面白いんじゃないかと思います。

Pros 良くなる点

サードパーティソフトにプリセット機能がなくても用意したプリセットを使える

Cons 悪くなる点

実現方法

難しいのは「設定UI」と「APIの仕様の策定」だと思います。

設定UIは最悪なくても、yamlファイルを直接編集してもらう形式などで良いと思います。
APIの仕様が難しいです。speakersでプリセットを返すようにして、speaker引数のところにプリセットIDを渡してもらうとかでしょうか・・・。

その他

Linux版のVOICEVOX Engineの起動について

質問の内容

VOICEVOX Engineの実行についてなのですが、README.mdの説明にあるように、--voicevox_dirに製品版VOICEVOXのパスを指定しても、

ModuleNotFoundError: No module named 'core'
Notice: mock-library will be used. Try re-run with valid --voicevox_dir

と言われてモックで起動してしまいます。
文言を見るに、おそらくモジュールの読み込みに失敗しており、どこかで実行方法を間違えているものだと思うのですが、具体的にどのようにすると製品版VOICEVOXでサーバーを起動することができるのでしょうか。

VOICEVOXのバージョン

0.6.0

OSの種類/ディストリ/バージョン

  • OS : Arch Linux x86_64
  • Kernel : 5.13.5-arch1-1

その他

製品版VOICEVOXがWindows用バイナリだからではないかと思い、試しにLinux用ビルドとvoicevox_coreのあるディレクトリをを--voicevox_dirに指定して実行してみたのですが、voicevox_coreの場合は同様の文言、Linux用ビルドではModuleNotfoundErrorの代わりに

ImportError: libcore.so: cannot open shared object file: No such file or directory

と表示され同様にモックで起動しました。

製品版 VOICEVOX でのサーバー起動について

READMEには以下の様に記載してありますが、PYTHONPATHにはVOICEVOX_DIRを入れるべきではないでしょうか。
自分の環境では、以下のコードでは動かず、VOICEVOX_DIRに変更すると動作しました。(pythonはPYTHONPATH内のモジュールを読み込むようなので、each_cpp_forwarderがimportされていませんでした。)

# 製品版 VOICEVOX でサーバーを起動
VOICEVOX_DIR="C:/path/to/voicevox" # 製品版 VOICEVOX ディレクトリのパス
CODE_DIRECTORY=$(pwd) # コードがあるディレクトリのパス
cd $VOICEVOX_DIR
PYTHONPATH=$CODE_DIRECTORY python $CODE_DIRECTORY/run.py

「あっ」で /synthesis が Internal Server Error

不具合の内容

VOICEVOX の GUI で あっ というセリフを読み上げようとすると、
音素は出るものの、試聴しようとすると 再生に失敗しました のメッセージボックスが表示される。

現象・ログ

INFO:     127.0.0.1:64908 - "POST /synthesis?speaker=0 HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "C:\Users\ANONYM~1\AppData\Local\Programs\voicevox\uvicorn\protocols\http\h11_impl.py", line 373, in run_asgi
  File "C:\Users\ANONYM~1\AppData\Local\Programs\voicevox\uvicorn\middleware\proxy_headers.py", line 75, in __call__
  File "C:\Users\ANONYM~1\AppData\Local\Programs\voicevox\fastapi\applications.py", line 208, in __call__
  File "C:\Users\ANONYM~1\AppData\Local\Programs\voicevox\starlette\applications.py", line 112, in __call__
  File "C:\Users\ANONYM~1\AppData\Local\Programs\voicevox\starlette\middleware\errors.py", line 181, in __call__
ValueError: repeats may not contain negative values.

再現手順

GUI でセリフとして「あっ」とだけ入力して試聴する。

期待動作

あっ

VOICEVOXのバージョン

0.5.1

OSの種類/ディストリ/バージョン

Windows 10 Home 64bit 21H1 19043.1165

その他

私は陰キャなのでこれが読めないと困ることがあります。

空リストでmora_dataを叩くとInternal Server Error

不具合の内容

空リストでmora_dataを叩くとInternal Server Error

現象・ログ

エラーコード 500
Internal Server Error

(venv) PS C:\Users\Segu_g\Github\voicevox_engine> python C:\Users\Segu_g\Github\voicevox_engine\run.py --voicevox_dir=\Users\Segu_g\AppData\Local\Programs\voicevox --voicelib_dir=\Users\Segu_g\AppData\Local\Programs\voicevox
Notice: --voicevox_dir is /Users/Segu_g/AppData/Local/Programs/voicevox
INFO:     Started server process [6164]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
INFO:     127.0.0.1:64084 - "POST /mora_data?speaker=0 HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 373, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 75, in __call__
    return await self.app(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\fastapi\applications.py", line 208, in __call__
    await super().__call__(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\applications.py", line 112, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\middleware\errors.py", line 181, in __call__
    raise exc from None
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\middleware\errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\middleware\cors.py", line 86, in __call__
    await self.simple_response(scope, receive, send, request_headers=headers)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\middleware\cors.py", line 142, in simple_response
    await self.app(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\exceptions.py", line 82, in __call__
    raise exc from None
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\routing.py", line 580, in __call__
    await route.handle(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\routing.py", line 241, in handle
    await self.app(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\routing.py", line 52, in app
    response = await func(request)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\fastapi\routing.py", line 227, in app
    dependant=dependant, values=values, is_coroutine=is_coroutine
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\fastapi\routing.py", line 161, in run_endpoint_function
    return await run_in_threadpool(dependant.call, **values)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\concurrency.py", line 40, in run_in_threadpool
    return await loop.run_in_executor(None, func, *args)
  File "C:\Users\Segu_g\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "C:\Users\Segu_g\Github\voicevox_engine\run.py", line 281, in mora_data
    return replace_mora_data(accent_phrases, speaker_id=speaker)
  File "C:\Users\Segu_g\Github\voicevox_engine\run.py", line 132, in replace_mora_data
    speaker_id=speaker_id,
  File "C:\Users\Segu_g\Github\voicevox_engine\voicevox_engine\synthesis_engine.py", line 182, in replace_mora_pitch
    for accent_phrase in accent_phrases
  File "<__array_function__ internals>", line 6, in concatenate
ValueError: need at least one array to concatenate

再現手順

curl -X 'POST' \
  'http://localhost:50021/mora_data?speaker=0' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '[]'

期待動作

[]を返す
#80 で空リストが返るようになったので、エラーを出さずに空リストを返す仕様がきれいだと思いました。

VOICEVOXのバージョン

0.6.0

OSの種類/ディストリ/バージョン

Windows 10 Home (19042.1237)

その他

自動ビルドしたexeファイルを実行してAPIを叩くとエラー

不具合の内容

0.7.0用にビルドしたartifactにあるrun.exeを実行してAPIを叩くとエラーが出ました。
https://github.com/Hiroshiba/voicevox_engine/actions/runs/1323355607

現象・ログ

�[32mINFO�[0m:     Started server process [�[36m25920�[0m]
�[32mINFO�[0m:     Waiting for application startup.
�[32mINFO�[0m:     Application startup complete.
�[32mINFO�[0m:     Uvicorn running on �[1mhttp://127.0.0.1:50021�[0m (Press CTRL+C to quit)
�[32mINFO�[0m:     127.0.0.1:52381 - "�[1mGET /version HTTP/1.1�[0m" �[91m500 Internal Server Error�[0m
�[31mERROR�[0m:    Exception in ASGI application
Traceback (most recent call last):
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\anyio\_core\_eventloop.py", line 140, in get_asynclib
KeyError: 'anyio._backends._asyncio'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\uvicorn\protocols\http\h11_impl.py", line 373, in run_asgi
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\uvicorn\middleware\proxy_headers.py", line 75, in __call__
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\fastapi\applications.py", line 208, in __call__
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\starlette\applications.py", line 112, in __call__
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\starlette\middleware\errors.py", line 159, in __call__
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\starlette\middleware\cors.py", line 84, in __call__
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\starlette\exceptions.py", line 71, in __call__
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\starlette\routing.py", line 656, in __call__
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\starlette\routing.py", line 259, in handle
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\starlette\routing.py", line 61, in app
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\fastapi\routing.py", line 226, in app
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\fastapi\routing.py", line 161, in run_endpoint_function
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\starlette\concurrency.py", line 39, in run_in_threadpool
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\anyio\to_thread.py", line 28, in run_sync
  File "C:\Users\hihok\DOWNLO~1\WINDOW~1\anyio\_core\_eventloop.py", line 142, in get_asynclib
  File "importlib.py", line 127, in import_module
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'anyio._backends'

再現手順

期待動作

VOICEVOXのバージョン

0.?.0

OSの種類/ディストリ/バージョン

その他

python、ビルド後に実行すると何かが変わっていて思ったより実行できないことがある気がします。
ビルド後にrun.exeを実行して、適当なAPIが実行できるか試してもいいかも。

requirements.txtはもうちょっとバージョン固定してもいいかも。
あとは、pipenvかpoetryを使ってlockを作ってもいいかも。

ずっと使っているとGPUメモリが消費されていくか調査

長く使っているとGPUのメモリがあふれるというツイート・報告を見かけることがあります。
実際に調査してみる必要がありそうです。

CUDAをインストールするとnvidia_smiが付いてきて、これを用いるとメモリ使用量を把握できます。
image

音声合成エンジンのモックを作る

製品版がないと音声合成が動かないのは少し不便なので、とりあえずエンジンだけで音声合成ができるようなモックが有ると良さそうです。

モックがあれば、GitPodという初学者にとても向いていそうなサービスを利用できるかもしれません。
https://github.com/Hiroshiba/voicevox/issues/119

このエンジンで自然言語処理に用いているPyOpenJTalkには音声合成機能もあり、OS問わず動くように設計されているはずです。
こちらをモックとして活用できるかもしれません。
https://github.com/r9y9/pyopenjtalk/tree/60ea4df975003702a9b92a078ed76acd6d2802f1#tts

音素長と音高設定の API を分ける

内容

題目の通り。音素長パラメータの追加時から微妙に気になってはいたのですが Hiroshiba/voicevox#194 で需要も生じた気がするので。実現方法に問題がなさそうなら2日くらいで PR 上げます。

Pros 良くなる点

互換性維持対応がシンプルになる

Cons 悪くなる点

処理とコードがやや冗長化する

対応内容

  1. synthesis_engine.py 内の replace_phoneme_data を pitch (f0) と length 用に分離
  2. run.py の /synthesis の際に Mora.consonant_length / Mora.vowel_length がすべて 0 なら上述の length 設定関数を呼んで埋める (互換性のため) API が受け付けない以上無意味でした。
  3. 外部 API としても /mora_pitch (復活) と /mora_length (新設) を出す (フロントで UI が付くと多分個別にあったほうが良い)

VOICEVOXのバージョン

0.5.0 に間に合わせたい?

OSの種類/ディストリ/バージョン

N/A

docstringの整備

内容

CI整備(#16)と一緒にやってます( https://github.com/Hiroshiba/voicevox_engine/issues/16#issuecomment-907324672 )が、一応CI整備とは異なる分野なので、別でIssueを立てておきます。

Pros 良くなる点

コードが理解しやすくなる(サードパーティー製エンジンの作成や、これからの改善がしやすくなる)

Cons 悪くなる点

おそらくない(あって全体のコード行数が長くなるくらい...?)

実現方法

NumPyスタイルでdocstringを記述していく。

エンジン側のエラー発生時、クライアントにCORSエラーが表示される

不具合の内容

サーバーがエラーになると、なぜかクライアント側でCORSエラーとなります。
これのせいでエラーの原因を勘違いしやすくなっています。

その他

正常レスポンスではCORSを考慮したレスポンスが返されるようになっていますが、エラー時にそれが適用されてないかも

長い英単語の音声合成用のクエリ作成に失敗する

不具合の内容

長い英単語の音声合成に失敗します。

OK例

  • supercalifragilisticexpialidocious
  • Uncopyrightables

NG例

  • pneumonoultramicroscopicsilicovolcanoconiosis
  • Honorificabilitudinitatibus
  • Antidisestablishmentarianism

現象・ログ

run.exeのログ

�[32mINFO�[0m:     127.0.0.1:53897 - "�[1mPOST /audio_query?text=pneumonoultramicroscopicsilicovolcanoconiosis&speaker=1 HTTP/1.1�[0m" �[91m500 Internal Server Error�[0m
�[31mERROR�[0m:    Exception in ASGI application
Traceback (most recent call last):
  File "C:\Users\user\Desktop\VOICEV~2.1\VOICEVOX\uvicorn\protocols\http\h11_impl.py", line 373, in run_asgi
  File "C:\Users\user\Desktop\VOICEV~2.1\VOICEVOX\uvicorn\middleware\proxy_headers.py", line 75, in __call__
  File "C:\Users\user\Desktop\VOICEV~2.1\VOICEVOX\fastapi\applications.py", line 208, in __call__
  File "C:\Users\user\Desktop\VOICEV~2.1\VOICEVOX\starlette\applications.py", line 112, in __call__
  File "C:\Users\user\Desktop\VOICEV~2.1\VOICEVOX\starlette\middleware\errors.py", line 181, in __call__
ValueError: [<Phoneme phoneme='e'>, <Phoneme phoneme='s'>, <Phoneme phoneme='u'>]

再現手順

  1. run.exeを起動する
  2. 以下のコマンドをPowerShellで実行する
PS > curl -Method 'POST' 'http://127.0.0.1:50021/audio_query?text=<特定の英単語>&speaker=1'
  1. run.exeのコンソールを確認する

期待動作

jsonが返答される。

VOICEVOXのバージョン

0.4.1

OSの種類/ディストリ/バージョン

  • Windows 10 Home 64bit 20H2 (19042.1165)

その他

関連する可能性のあるIssue: #55

uvicornのhostアドレスを可変にしてほしい

uvicorn.run(generate_app(use_gpu=args.use_gpu), host="127.0.0.1", port=args.port)

現在、host="127.0.0.1"固定で起動していますが、可変にできないでしょうか。(Defaultは"127.0.0.1"で問題ありません)
エンジンに外部からアクセスできるようにhost="0.0.0.0"で起動したいです。

日本語ディレクトリだとエンジンが起動しない

不具合の内容

日本語ディレクトリだとエンジンが起動しない

現象・ログ

コアライブラリに日本語入りの絶対パスが渡ってきて落ちる。

$ ./run.exe
Traceback (most recent call last):
  File "C:\Users\hihok\DOWNLO~1\\u30dc\u30a4\u30dc\run.py", line 257, in <module>
  File "C:\Users\hihok\DOWNLO~1\\u30dc\u30a4\u30dc\run.py", line 61, in make_synthesis_engine
  File "core.pyx", line 6, in core.initialize
  File "core.pyx", line 14, in core.initialize
AssertionError

その他

コアライブラリが日本語に耐えられるようにするのが一番良さそう。
もしくは絶対パス__FILE__を相対パスにして直るならとりあえずそれでも良さそう。

speakers情報をcoreから取ってくるようにする

内容

コアライブラリの公開に伴って、話者情報をcoreから取ってこれるようになっています。
今の製品版バージョンを使えば、core.metas()でjsonが振ってくるはず。

Pros 良くなる点

speakers.jsonを作らなくても良くなる

音声ライブラリの改善(メモリリーク調査・再起動を可能に)

今の音声ライブラリには、消費GPUメモリが増え続けるというバグがあります。
https://github.com/Hiroshiba/voicevox_engine/issues/32

これはエンジンのプロセスを再起動することで解決できますが、できればそうせずに解決したいところです。

(音声ライブラリ部分はまだOSSになっていないので、自分に割り当てます。)

コードフォーマットをコミット時に自動で行う

READMEに書かれているコードフォーマットコマンド(pysen run format lint)を自動で実行するようにしたいです。
git hooksとpre-commitを使えばうまい具合にできると思いますが、ちゃんと調べ切れていません。

ただ、これができるようになればGitHub Actionsで気づいて修正、といった二度手間が減ると思うので、できれば追加すべきと考えます。

VOICEVOX ENGINEのLinux用実行バイナリを作る

ref: Hiroshiba/voicevox#218
ref: #85

内容

VOICEVOXのLinux用実行バイナリを作る( Hiroshiba/voicevox#218 )にあたり、
VOICEVOX ENGINEのLinux用実行バイナリが必要です。

VOICEVOXのビルド時に合わせてビルドしてもよいですが、
せっかく分離されていますし、再利用性からも、こちらのリポジトリでビルド済みバイナリを提供するほうがよいと思っています。

すでにUbuntu 20.04(ネイティブ環境、NVIDIA GPU)上のローカルビルドおよび、GitHub Actions上のDockerでのビルドを行い、ローカル環境で動作するバイナリの作成には成功しています。

しかし、異なる環境・ディストリビューション(Linuxカーネル?)で動作するのか、実行用バイナリの配布方法、など不明な点がさまざまあり、知見をいただけるとうれしいです。

実現方法

現在の自分のアプローチは、 #88 のDockerfileを拡張し、GitHub Actions上で自動ビルドするものです。
Dockerfileの拡張では、Nuitkaなどのビルド環境を構築した、マルチステージビルドの新しいターゲットを作成します。
GitHub Actions上の新しい自動ビルド(Workflow)は、このターゲットをDockerイメージとしてビルドし、そのまま同一Jobで実行用バイナリをビルド(docker run --rm -v ...)し、成果物をArtifact(ActionのSummary下部)としてアップロードします。

例: https://github.com/aoirint/voicevox_engine/actions/runs/1238234082

上の例は、Ubuntu 20.04で動かすことを想定したものです。一応、手元のネイティブ環境で動作を確認しています。
libtorchは同梱していますが、
libsndfile( https://github.com/bastibe/python-soundfile の依存. https://github.com/libsndfile/libsndfile )、
およびCUDA/cuDNN(GPUの場合)はあらかじめインストールしておく必要があると思います。

sudo apt install libsndfile1

VOICEVOXのLinux用実行バイナリのリリース方法によっては、これらの共有ライブラリも(Windows版と同様に)同梱するのが望ましいように思いますが、その際に環境を変えても動作するかよくわかりません。

実行例

# Ubuntu 20.04
# CUDA 11.4

$ echo "$LD_LIBRARY_PATH"
/usr/local/cuda/lib64:

$ sudo ldconfig
$ ldconfig -p | grep libtorch

$ chmod +x ./run

$ ./run --use_gpu
INFO:     Started server process [***]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)

リリース時の流れ

現在想定しているVOICEVOX ENGINEリリース時の流れについて(#85 の内容な気もしますが)。

まずGitHub Releaseを作成(バージョン付け)します。
Releaseの作成によりGitHub Actionsをトリガし、Nuitkaビルドを走らせ、その成果物(実行用バイナリ・共有ライブラリなどを含む圧縮ファイル)をArtifactとして自動アップロードさせます(おそらくRelease作成後、1.5時間くらいかかります)。
その後、成果物を手動でダウンロードし、Releaseにアップロードし直す、という流れを想定しています。

しかし、成果物の容量が大きい(おそらく圧縮時で3GBくらい、上の例で表示されるSizeは圧縮前のサイズのようです)ので、あまりいい方法ではないかもしれません。

GitHub Releaseをgit tagのpushなどでトリガして自動作成することもできそうですが、
複数のWorkflow/Jobをトリガする場合にうまく動かせるかよくわからないです。
他のOSSなどがどうしているかも気になります。

OSの種類/ディストリ/バージョン

  • Linux

一部の音素のtext(カタカナ表記)にアルファベットが混じる

不具合の内容

「ぎぇ」のように特殊な文字列のクエリを作成すると、読みの部分が「gyエ」のように英字が混じる

現象・ログ

ぎぇ
http://localhost:50021/audio_query?text=%E3%81%8E%E3%81%87&speaker=1

{
  "accent_phrases": [
    {
      "moras": [
        {
          "text": "gyエ",
          "consonant": "gy",
          "vowel": "e",
          "pitch": 5.479054927825928
        }
      ],
      "accent": 1,
      "pause_mora": null
    }
  ],
  "speedScale": 1,
  "pitchScale": 0,
  "intonationScale": 1,
  "volumeScale": 1,
  "prePhonemeLength": 0.1,
  "postPhonemeLength": 0.1,
  "outputSamplingRate": 24000
}

再現手順

image

期待動作

moras.text に「ギェ」が入る

VOICEVOXのバージョン

0.4.1

( curl http://localhost:50021/version で確認できます)

OSの種類/ディストリ/バージョン

Windows 10 Home (19042.1165)

後ろの無音時間を少し長くして生成して品質を上げる

内容

今のコアは、前後の無音時間を0.5秒ほど設定することで、最初と最後の音声が途切れやすい問題を軽減することができます。
最初の音声の無音は0.7.0アップデートで対処したのですが、最後の無音はそのままになっています。
ワークアラウンドですが、この処理もエンジンに含めると音声の品質が上がったように感じられそうです。

Pros 良くなる点

Cons 悪くなる点

実現方法

VOICEVOXのバージョン

0.?.0

OSの種類/ディストリ/バージョン

その他

wavのステレオ出力

#31 に付随するような仕様の変更なのですが、現状のwavの出力はモノラルオンリーとなっていると思います。
ソフトウェアの仕様上、ステレオ出力が好まれる場合もあると思います。
なので、これもaudio query上で選べれば良いかなと思っています。

こちらは、すでに解決案を持っているので @Hiroshiba さんが大丈夫であればPRしたいと思います。

音割れをさせずに音量を上げる方法を調査・実装する

内容

VOICEVOX ENGINEは音量パラメータがありますが、これは波形を単純に定数倍しているだけなので、音が割れます(-1~1の範囲外になる)。
おそらく世の中の音声ツールは、音が割れないように音量(音圧?)を上げられる仕組みになっているはずです。
このissueはその方法を調査して、(ライブラリの力などを借りつつ)実装することが目的です。

Pros 良くなる点

音割れせずに音量をあげられる

Cons 悪くなる点

仕様変更のアナウンスが必要

実現方法

pythonの音声系のライブラリlibrosaにヒントがあるかも。
あとはffmpegにもそういう機能があるかも。

その他

スピーカー一覧を返すAPIが欲しい

アプリ連携をする際に、スピーカー名から speaker_id を引けるようにするためのAPIが欲しいです

[
  {"name": "ずんだもん", "speaker_id": 1},
  {"name": "四国めたん", "speaker_id": 2}
]

な json を返してくれると嬉しいです。

"!"等のtextでaudio_query, accent_phrasesを叩くとInternal Server Error

不具合の内容

"!"や"?"といった文字しか含まれないテキストでaudio_query, accent_phrasesを叩くとInternal Server Error になる。

現象・ログ

エラーコード 500
Internal Server Error

(venv) PS C:\Users\Segu_g\Github\voicevox_engine> python C:\Users\Segu_g\Github\voicevox_engine\run.py --voicevox_dir=\Users\Segu_g\AppData\Local\Programs\voicevox --voicelib_dir=\Users\Segu_g\AppData\Local\Programs\voicevox
Notice: --voicevox_dir is /Users/Segu_g/AppData/Local/Programs/voicevox
INFO:     Started server process [25272]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
WARNING: JPCommonLabel_make() in jcomon_label.c: No phoneme.
INFO:     127.0.0.1:49559 - "POST /audio_query?text=%20%21&speaker=0 HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 373, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 75, in __call__
    return await self.app(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\fastapi\applications.py", line 208, in __call__
    await super().__call__(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\applications.py", line 112, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\middleware\errors.py", line 181, in __call__
    raise exc from None
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\middleware\errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\middleware\cors.py", line 86, in __call__
    await self.simple_response(scope, receive, send, request_headers=headers)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\middleware\cors.py", line 142, in simple_response
    await self.app(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\exceptions.py", line 82, in __call__
    raise exc from None
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\routing.py", line 580, in __call__
    await route.handle(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\routing.py", line 241, in handle
    await self.app(scope, receive, send)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\routing.py", line 52, in app
    response = await func(request)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\fastapi\routing.py", line 227, in app
    dependant=dependant, values=values, is_coroutine=is_coroutine
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\fastapi\routing.py", line 161, in run_endpoint_function
    return await run_in_threadpool(dependant.call, **values)
  File "C:\Users\Segu_g\Github\voicevox_engine\venv\lib\site-packages\starlette\concurrency.py", line 40, in run_in_threadpool
    return await loop.run_in_executor(None, func, *args)
  File "C:\Users\Segu_g\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "C:\Users\Segu_g\Github\voicevox_engine\run.py", line 188, in audio_query
    accent_phrases = create_accent_phrases(text, speaker_id=speaker)
  File "C:\Users\Segu_g\Github\voicevox_engine\run.py", line 175, in create_accent_phrases
    speaker_id=speaker_id,
  File "C:\Users\Segu_g\Github\voicevox_engine\run.py", line 125, in replace_mora_data
    speaker_id=speaker_id,
  File "C:\Users\Segu_g\Github\voicevox_engine\voicevox_engine\synthesis_engine.py", line 175, in replace_mora_pitch
    for accent_phrase in accent_phrases
  File "<__array_function__ internals>", line 6, in concatenate
ValueError: need at least one array to concatenate

再現手順

curl -X 'POST' \
  'http://localhost:50021/audio_query?text=%20%21&speaker=0' \
  -H 'accept: application/json' \
  -d ''

期待動作

accentPhrasesが空リストで返る

VOICEVOXのバージョン

0.5.0

OSの種類/ディストリ/バージョン

  • Windows 10 Pro 64bit (10.0.10586)

その他

音声の前後の無音時間のパラメータを追加する

キャラクターの立ち絵を表示したい

右の欄と同じ感じで、左の欄を作って、そこにキャラクターを表示したい。

アクティブなAudioCellのキャラクターが表示されていてほしい。
(連続再生すると立ち絵が再生中のキャラクターのものに変わってほしい)

立ち絵はとりあえずダミーで。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.