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

ソング:pauが重ならないようにする #2056

Merged
merged 9 commits into from
May 13, 2024

Conversation

sigprogramming
Copy link
Contributor

@sigprogramming sigprogramming commented May 4, 2024

内容

以下を行います。

  • pauが(呼吸音と歌が)重ならないようにする
    • フレーズの先頭の休符(pau)の長さ
      • 以下の手順で算出
        1. 実際の(フレーズの先頭の)休符の長さを計算
          • 1小節目の最初から始まるフレーズの場合は、4分音符の長さを休符の長さとする
        2. 休符の長さが4分音符以下になるようにする
        3. 休符の長さが最小の長さ(0.12秒に設定)以上になるようにする
        4. 休符の長さが1フレーム1tick以上になるようにする
    • フレーズの最後の休符(pau)の長さ
      • 1秒に設定 → 0.5秒に変更
      • 0.15秒のフェードアウトを行うようにしていて、フェードアウト後の0.35秒は無音
  • ノートのキーのシフトをcreateNotesForRequestToEngine内で行っていたので、shiftKeyOfNotesで行うように変更
  • リファクタリング

関連 Issue

close #1943

その他

@sigprogramming sigprogramming requested a review from a team as a code owner May 4, 2024 04:43
@sigprogramming sigprogramming requested review from Hiroshiba and removed request for a team May 4, 2024 04:43
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/store/singing.ts Outdated Show resolved Hide resolved
src/store/singing.ts Outdated Show resolved Hide resolved
src/store/singing.ts Outdated Show resolved Hide resolved
src/store/singing.ts Outdated Show resolved Hide resolved
src/store/singing.ts Outdated Show resolved Hide resolved
src/store/singing.ts Show resolved Hide resolved
src/store/singing.ts Show resolved Hide resolved
src/store/singing.ts Outdated Show resolved Hide resolved
src/store/singing.ts Outdated Show resolved Hide resolved
src/store/singing.ts Outdated Show resolved Hide resolved
@Hiroshiba
Copy link
Member

あ、そういえば心なしか品質が上がって聞こえました。
たぶんフレーズ前の休符の時間が正確にわかるようになってリズミカルになりやすくなったんじゃないかなとか思いました。
だとしたらフレーズ後休符の時間も正確にしたらより良くなるのかも・・・?

@sigprogramming
Copy link
Contributor Author

伴奏と合わせてみたのですが、フレーズのタイミングがずれてるかも…
バグが無いか確認してみます…

@sigprogramming
Copy link
Contributor Author

伴奏の方がずれてました…!処理は問題なさそうです

@sigprogramming sigprogramming requested a review from Hiroshiba May 7, 2024 12:12
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!!!

変更ありがとうございます!!!

やっぱりかなり品質が上がって聞こえる気がします!!
前のpauの長さを調整していますが、もしかしたら後ろの長さも調整すると学習データに近くなって綺麗に歌えるようになるのではとかちょっと思いました!
人は後ろにあるpau、つまり休符がどれぐらいの長さかを想像しながら歌うので、同じく機械学習モデルも再現しようとするから、後ろの休符の長さをちゃんと与えた方がうまく歌えるのかもと・・・!!!

Comment on lines +922 to +931
phraseFirstRestDuration = Math.max(
phraseFirstRestDuration,
phraseFirstNote.position -
secondToTick(
tickToSecond(phraseFirstNote.position, tempos, tpqn) -
phraseFirstRestMinDurationSeconds,
tempos,
tpqn,
),
);
Copy link
Member

Choose a reason for hiding this comment

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

ちょっと変なこと言うかもなんですか、ここって直接↓じゃ駄目な感じでしょうか 👀

phraseFirstRestDuration = Math.max(
          phraseFirstRestDuration,
          secondToTick(phraseFirstRestMinDurationSeconds),
        );

Copy link
Contributor Author

Choose a reason for hiding this comment

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

曲中のテンポ変更を考慮してこの形になっています!
(長さをそのまま変換せず、開始位置を計算して、終了位置から開始位置を引くことで長さを求めています)

Copy link
Member

Choose a reason for hiding this comment

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

なーーーるほどです!!!
連続時間を離散時間(tick・frame)にするとき、連続時間の長さを離散時間の長さにするときはこうする、みたいな概念図があると分かりやすそうですね・・・!!!!

Comment on lines +932 to +933
// 1tick以上にする
phraseFirstRestDuration = Math.max(1, phraseFirstRestDuration);
Copy link
Member

Choose a reason for hiding this comment

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

この上の処理で最小の長さ以上になってるから不要かも?
(phraseFirstRestMinDurationSeconds=0を想定する場合必要かも)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

phraseFirstRestMinDurationSecondsの単位は秒で、TPQNとテンポからtickに変換していて1tick以上になることを保証できないので、この処理を行っています!

Copy link
Member

Choose a reason for hiding this comment

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

あーーーーーーなるほどです!!!!!
コメントから推察できた気がしますね。。すみませんありがとうございます!!

Comment on lines +938 to +943
const searchPhrases = async (
notes: Note[],
tempos: Tempo[],
tpqn: number,
phraseFirstRestMinDurationSeconds: number,
) => {
Copy link
Member

Choose a reason for hiding this comment

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

(別にこのままでも大丈夫なのですが)
searchPhrasesにこの秒数を渡すの不思議かもと思いました!

const quarterNoteDuration = getNoteDuration(4, tpqn);と同様に0.12というマジックナンバーも、定数として関数内で宣言するのはどうでしょう。
あるいは定数なので定数が定義されてるファイルに書いてimportするか、あるいはもうRENDER関数の一番最初に定義して使います形もありかも。

Copy link
Contributor Author

Choose a reason for hiding this comment

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

確かに、実行中に変更される値ではないので定数にして良さそうです。

関数の名前も、generatePhrasesの方が合ってるかも…?

Copy link
Member

Choose a reason for hiding this comment

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

関数の名前も、generatePhrasesの方が合ってるかも…?

あっ ほんとですね!!
キャッシュを持ってることも示唆するのであればfindOrGenerateとかもありかも。長いかもですが。。

Comment on lines +1000 to +1013
const firstRestStartSeconds = tickToSecond(
notes[0].position - firstRestDuration,
tempos,
tpqn,
);
const firstRestStartFrame = Math.round(
firstRestStartSeconds * frameRate,
);
const firstRestEndSeconds = tickToSecond(
notes[0].position,
tempos,
tpqn,
);
const firstRestEndFrame = Math.round(firstRestEndSeconds * frameRate);
Copy link
Member

Choose a reason for hiding this comment

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

もしかしたらticksToFrame関数を作っても良いかも・・・?
(どちらでも良さそう)

Comment on lines +891 to +897
const calcPhraseFirstRestDuration = (
prevPhraseLastNote: Note | undefined,
phraseFirstNote: Note,
phraseFirstRestMinDurationSeconds: number,
tempos: Tempo[],
tpqn: number,
) => {
Copy link
Member

Choose a reason for hiding this comment

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

パラメータ多くなってきたのでこの辺の値を指定し間違えて発見しづらいバグに繋がったりしやすいかもと感じました!
こんな感じで引数の型指定すると引数名を書く形で関数呼び出しできるので間違いづらくなるかも。
(その代わり引き数の型がややこしくなってしまうのですが。。)

Suggested change
const calcPhraseFirstRestDuration = (
prevPhraseLastNote: Note | undefined,
phraseFirstNote: Note,
phraseFirstRestMinDurationSeconds: number,
tempos: Tempo[],
tpqn: number,
) => {
const calcPhraseFirstRestDuration = ({
prevPhraseLastNote,
phraseFirstNote,
phraseFirstRestMinDurationSeconds,
tempos,
tpqn,
}: {
prevPhraseLastNote: Note | undefined,
phraseFirstNote: Note,
phraseFirstRestMinDurationSeconds: number,
tempos: Tempo[],
tpqn: number,
}) => {

@Hiroshiba
Copy link
Member

あ、いくつかコメントしていますがコンフリクト解消してマージさせていただきたいと思います!!

@Hiroshiba Hiroshiba merged commit 3ecddbf into VOICEVOX:main May 13, 2024
9 checks passed
@Hiroshiba
Copy link
Member

@sigprogramming ちょっと突発的な思いつきで相談が・・・!

ニーズのある機能が実装されたときにSNSで言及しておりまして、今回のプルリクエストもツイートしたいと思っています。
https://twitter.com/search?q=%23VOICEVOX%E9%96%8B%E7%99%BA%E7%8A%B6%E6%B3%81
もしよかったらそこで @sigprogramming さんのXアカウントをツイート文に含めて紹介させていただきたいのですが、構わないでしょうか・・・?

こんな感じを予定しています・・・!

#VOICEVOX開発状況 
ソングで、休符のたびに聞こえがちだった呼吸音が発生しにくくなりました🎉(今後のアップデートで実装されます。)
【開発者: @m_sig_tw】
https://github.com/VOICEVOX/voicevox/pull/2056

@sigprogramming
Copy link
Contributor Author

紹介していただいて大丈夫です!

@Hiroshiba
Copy link
Member

ありがとうございます!! 今日の昼ぐらいにポストさせていただこうと思います!!

@sigprogramming sigprogramming deleted the fix_overlapping_pau branch May 20, 2024 10:01
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