Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2話者からモーフィングさせた音声を生成するAPIを追加 #151

Merged
merged 8 commits into from
Oct 26, 2021

Conversation

mes51
Copy link
Contributor

@mes51 mes51 commented Oct 23, 2021

内容

2つの話者で生成した音声をWORLDでモーフィングさせ、その結果を出力するAPIを追加します

関連 Issue

下記tweetのスレッドを参照
https://twitter.com/mes_deleted_n/status/1451845426533990407

その他

サンプルリクエスト

curl -s -H "Content-Type: application/json" -X POST -d @- "http://localhost:50021/synthesis_morphing?base_speaker=0&target_speaker=1&morph_rate=0.9"

TODO

  • キャッシュをどうするか
    • エンジン側でキャッシュするにしても、WORLDの解析分もキャッシュしないと効果が薄い(WORLDが重い)が、メモリをかなり消費するためキャッシュするかしないか含め考える必要がある

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

素晴らしい!! 問題がなさそうな実装でした!!

キャッシュですが、確かにworldの解析結果をキャッシュする必要があって、確かに容量がなかなか大きそうな感じがしますね…
まあモーフィング用にほしいキャッシュは、おそらく直前で試している数個の音声だけだと思うので、32ほどキャッシュすれば十分な気がします。
32個くらいならキャッシュしてもそんなに大きいメモリにはならないはず?

キャッシュ判定は、ソフトウェアの方でもやっている、AudioQueryをjson化してなんかしらのハッシュ値を取る方法が使えるかもです。
あとはちょっとpythonの知識が必要ですが、lru_cacheというものが便利かもしれません。

わからなければ聞いていただければ…!

run.py Outdated Show resolved Hide resolved
run.py Outdated Show resolved Hide resolved
run.py Outdated Show resolved Hide resolved
@mes51
Copy link
Contributor Author

mes51 commented Oct 24, 2021

情報ありがとうございます!
キャッシュについては、WORLDで再合成するために必要な物をキャッシュすると、おおよそ1秒約11.77MBほど消費する(サンプリングレート24kHzの場合で計算)ようで、32個だと結構メモリ圧迫することになりそうなので、様子を見つつ調整が必要かもしれません

@Hiroshiba
Copy link
Member

32個だと結構メモリ圧迫することになりそうなので

思った以上にメモリ消費が激しそうですね・・・
正直直前のモーフィング以外はキャッシュしてなくてもそこまで影響ないと思うので、直前のモーフィングに利用した2音声×2つくらいのキャッシュで十分かもしれません。

@Hiroshiba Hiroshiba marked this pull request as ready for review October 24, 2021 14:39
run.py Show resolved Hide resolved
@github-actions
Copy link

github-actions bot commented Oct 24, 2021

Coverage Result

Resultを開く
Name Stmts Miss Cover
run.py 229 167 coverage-27%
voicevox_engine/acoustic_feature_extractor.py 81 0 coverage-100%
voicevox_engine/full_context_label.py 145 7 coverage-95%
voicevox_engine/kana_parser.py 75 1 coverage-99%
voicevox_engine/model.py 73 7 coverage-90%
voicevox_engine/mora_list.py 4 0 coverage-100%
voicevox_engine/synthesis_engine.py 115 99 coverage-14%
TOTAL 722 281 coverage-61%

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本当に非の打ち所がない素晴らしいコードだと思いました!!
聞きたいことと、そこまで強い意見ではないけど変更をお願いしたいところがあったのでRequest changesにしています!

run.py Show resolved Hide resolved
run.py Outdated Show resolved Hide resolved
voicevox_engine/model.py Outdated Show resolved Hide resolved
voicevox_engine/model.py Show resolved Hide resolved
@Hiroshiba
Copy link
Member

コードは完璧だと思います!

あとせっかくなので利用方法の具体例をREADMEで紹介するのはどうでしょう?

読み方を AquesTalk 記法で取得・修正するサンプルコードの下辺りに、実際の話者2人でモーフィングが体験できる例があると良いのかなと思います。
rateを変数にしておいて、値を変えて実行すれば変わるということと、初回は時間がかかるけど同じ組み合わせであれば2回め以降はキャッシュが働くことを伝えておくと良いのかなと感じました!

windowsからcurlで日本語文字をPOSTするのは結構くせがあります。わからないところがあれば聞いていただければ・・・!

@mes51
Copy link
Contributor Author

mes51 commented Oct 26, 2021

確かにぱっと見使い方がわからないAPIではあるので、サンプルがあった方が良いですね...
追加してみます

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! とても良いREADMEだと思います!
少し長い議論になりましたがとても良い機能になったと思います! お疲れさまでした!

一部細かい修正をこちらで加えちゃってマージしたいと思います。
(最終commitは僕になってしまいますが、貢献者一覧にはもちろん掲載させていただきます!)

README.md Outdated Show resolved Hide resolved
README.md Outdated Show resolved Hide resolved
README.md Outdated Show resolved Hide resolved
@Hiroshiba Hiroshiba merged commit 1b7e81b into VOICEVOX:master Oct 26, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants