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

split decoder into sosoa and vocoder #28

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

Yosshi999
Copy link
Contributor

ストリーミング処理を見据え、decoderからvocoderを切り離す

@Hiroshiba
Copy link
Owner

ありがとうございます!!! ちょっと時間かかるかもですがレビューさせていただこうと思います!!

check_contourのテストが落ちてるけど、色々あって使っていないので無視で良さそう・・・!!

@Hiroshiba
Copy link
Owner

@Yosshi999 すみません、ちょっと確認させていただければ!

Discord の方でお伺いしたのですが、やはり計算誤差は出てしまう感じでしょうか?
聞いた時に問題のないエラーでも、最終的に品質が何か微妙かもとなった時に必ずここに立ち返ってこなくちゃいけなくなるので、可能なら完全一致させておきたい気持ちがちょっとあります。

でも実際聞いた時に問題ないのであればあまりモチベーションとしても微妙だと思うので、ちょっとこちらで頑張ってみようかなと思ってお聞きした次第です!!
どのあたりが原因で誤差が出ていそう、みたいな検討ってついていたりしますか・・・?

@Yosshi999
Copy link
Contributor Author

この分割自体は出力の変化は発生していません(今のrun.pyはランダム性を持つのでseedを固定する必要がありますが、)mainブランチのonnxとこのブランチのonnxの出力結果の差は0でした

差分が確認されているのは、https://github.com/Yosshi999/streaming_hifigan/blob/master/04_chunking_onnx.py で実験したtransformersのFastSpeech2ConformerModelであり、フルサイズで生成した波形と、(十分なoverlapを持たせたうえで)hifiganをチャンクごとに生成した波形を比較したときに、[-1, 1]の値域のなかで最大 2.6524067e-06 の誤差が発生したものです。時間を横軸にとって誤差を縦軸に取ったときのグラフがランダムだったのでチャンク由来というよりはfloatの数値誤差だとおもいます。
diff

いっぽうで自分が気になっているのは、同じく上記の実験でちょっとチャンクの実装を変えて、入力のmelspectrogramの右端を0でパディングした時に後方の結果が変わることです。すべてのconvolutionはzero paddingだと思っていたので原因がわからず奇妙に思っています(それでも誤差の最大は 0.0019995747 どまりではあります)。
diff

(おまけ)overlapがhifiganのreceptive fieldより足りないと下のようにつなぎ目で誤差が発生します
diff

@Hiroshiba
Copy link
Owner

おお、なるほどです!!! 完全一致素敵!!!

fastspeechの方の計算結果が合わないのはちょっと分かりませんが、右端のパディングに関してはもしかしたら学習時にスペクトログラムをリフレクトするようにしてるかも・・・?
numpy.padのmodeをreflectにする方もちょこちょこいらっしゃる印象です。信号処理的にはこれがそこそこ良い・・・みたいな感じだった記憶・・・。
https://numpy.org/doc/2.0/reference/generated/numpy.pad.html

まあもしリフレクトにしてたとしたら、前の方はゼロパディングで計算結果が合ってるのはよくわからないのですが。。。。。
な、何かの参考になればということで。。。

@Hiroshiba
Copy link
Owner

あ、こちらちょっとマージさせていただこうかどうか迷っています!
というのもdecode.onnxができなくなるので、新キャラとかの対応が難しくなるな~と。
なのでストリーム周りの色々が前進し次第マージさせていただければと思っています!!

もしよかったら出来上がった.onnxをこのプルリクエストにアップロードお願いしても良いでしょうか 🙇
コアの方で誰かが試すときとか、そのonnxがあると嬉しそうだなぁと。
多分.zipに固めれば、プルリクエストのコメント欄にドラッグ&ドロップでアップロードできると思います!(便利)

お願いばかりですみません!
難しそうであればこちらで作ってアップロードしてみようと思います!!

qryxip pushed a commit to VOICEVOX/voicevox_core that referenced this pull request Oct 12, 2024
この本文は @qryxip が記述している。

ストリーミング処理を見据え、decoderからvocoderを切り離す。ただしこのPRで
はAPIは変えない。

モデルとしては、`decode`を`generate_full_intermediate`と
`render_audio_segment`に分離する。"audio"ではなく"wave"の方が適切かもし
れないが、リリースするまでに考えることとする。

#851 (review)

Refs: Hiroshiba/vv_core_inference#28
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