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

[project-s] 出力する音声が0dBを超えないようにする #1593

Merged
merged 2 commits into from
Sep 30, 2023

Conversation

sigprogramming
Copy link
Contributor

@sigprogramming sigprogramming commented Sep 29, 2023

内容

出力する音声が0dBを超えないようにします。
Limiterで大きい音を抑え、抑えきれなかった音をClipperで-1~1の範囲にクリップします。

Limiterは内部でDynamicsCompressorNodeを使用していて、パラメーターは以下のように設定しています。

compNode.threshold.value = -5;
compNode.ratio.value = 20; // 最大に設定しています
compNode.knee.value = 8; // 0でも良いかも
compNode.attack.value = 0;
compNode.release.value = 0.25;

DynamicsCompressorNodeではメイクアップゲインが自動で設定されますが、音圧を上げることが目的ではないので、GainNodeを繋いでメイクアップゲインで上がった分を下げています。

correctionGainNode.gain.value = 0.85;

コンプレッションカーブは以下のようになります。
Figure_1
LimiterClipperは以下のページを参考に実装しています。

コンプレッサーやリミッターについては、以下のYouTubeの動画がわかりやすいです。

関連 Issue

ref #1578

その他

@sigprogramming sigprogramming requested a review from a team as a code owner September 29, 2023 12:48
@sigprogramming sigprogramming changed the title 出力する音声が0dBを超えないようにする [project-s] 出力する音声が0dBを超えないようにする Sep 29, 2023
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!!

理解が浅いのですがちょこっとコメントしています!

src/infrastructures/AudioRenderer.ts Show resolved Hide resolved
src/infrastructures/AudioRenderer.ts Outdated Show resolved Hide resolved
src/store/singing.ts Outdated Show resolved Hide resolved
options: LimiterOptions = { inputGain: 0, outputGain: 0, release: 0.25 }
) {
this.inputGainNode = new GainNode(audioContext);
this.compNode = new DynamicsCompressorNode(audioContext);
Copy link
Member

@Hiroshiba Hiroshiba Sep 30, 2023

Choose a reason for hiding this comment

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

どれくらいこれの影響が出てるか可視化しておくと音声合成の傾向掴めて便利かもと&なんか音量編になったときのデバッグに便利かもとかちょっと思いました。
.reductionで値が取れるらしいので、どこかで監視しておいてなにか変な値になったらwarn出すと参考になるかも?
(かなり思いつきレベルの提案です)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

確かにリダクションが確認できると後々デバッグなどで役立ちそう&UIでも圧縮中(音が大きすぎる)かどうか確認できると良さそうです。後でこれらも実装したいと思います!

Copy link
Contributor

@romot-co romot-co left a comment

Choose a reason for hiding this comment

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

@sigprogramming @Hiroshiba
ありがとうございます、すごい…!LGTMです!!


詳細まで見られていない&自分担当の分の実装する余力ないのにコメントだけするのはだいぶアレかなあなのですが、レビューなので以下、念のため確認です…!


目的と実装

  • ノーマライズではなく、クリップ抑制を目的としたコンプレッサー(リミッター的動作)+クリップリミッターの実装
  • コンプレッサーとしてはスレッショルドが-5db/レシオ1:20/アタック0sec/リリース0.25sec/ニー8で固定値
  • おそらく単一トラックではなく、マルチトラック用(未確認)

気になる点

  • エンジンからの生音と音(波形)は変わってしまうかも…?(それ込みでVoiceVoxの音とする or パラメータ変更できたりOFFも可能であればよさそう)
  • エンジン出力時点でクリップしている場合にはクリップ抑制にならない可能性?(このPRの目的外)

@Hiroshiba Hiroshiba merged commit 7a94cb4 into VOICEVOX:project-s Sep 30, 2023
@sigprogramming
Copy link
Contributor Author

sigprogramming commented Oct 1, 2023

レビューありがとうございます!

@romot-co
目的・実装の整理、ありがとうございます!

エンジンからの生音と音(波形)は変わってしまうかも…?

一応withLimiter変数をfalseに設定することでリミッターOFFで書き出せます!
また、リミッターONの場合でも、 音量がスレッショルド以下であれば音は変わらないので、以下を行うことで極力そのままの音で書き出せると思います。

  • スレッショルドを0dBギリギリに設定(ひとまず-5dBに設定していますが、-4dB~-3dBでも良いかも?)
  • 歌声のみを書き出す場合は、歌声(トラック)の音量をスレッショルド以下に設定

再生時は音割れ防止のためにリミッターはONのままが良いかなと思います。

@sigprogramming sigprogramming deleted the limit_and_clip_output branch October 14, 2023 16:25
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.

3 participants