-
Notifications
You must be signed in to change notification settings - Fork 206
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] ハミング用APIを追加 #1008
[project-s] ハミング用APIを追加 #1008
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
まだちゃんと処理コード追えてないのですが、とりあえずコメントしてみました!
最初の二つ以外はAPIに関わらないので、コメントだけ足しといてあと回しでも全然良いかなと思います。
(そのための別ブランチですし)
voicevox_engine/model.py
Outdated
""" | ||
|
||
key: int | None = Field(title="音階") | ||
length: int = Field(title="音符の長さ") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(細かいけど)説明は「フレーム長」とかのが秒と勘違いしなくて良いかも?
まあintなのでわかるのですが…。あ、JSだとどちらもnumberなのでちょっとだけわかりやすい……かも…?
いっそframe_lengthにした方が良いかも。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
一旦説明を「フレーム長」に変える方向で対処しようかなと...!
Phoneme
モデルについても、length
プロパティを持つので、もし変えるならプロパティ名は統一した方がいいかもですね...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
考えてたんですが、FrameAudioQueryの方はlengthでも良いけど、Phonemeの方はframeレベルなのか自明ではないので、FramePhonemeにするかframe_lengthにしたほうが良い気がしました!
たぶんFramePhoneme
にしつつframe_length
にもするのが良さそう。
あとAPI構成はここだけですね!
エディタ側の変更も少なくなるし、とりあえずここだけ決めて変えておきたい気持ちがちょっとあります。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FramePhonemeにしつつframe_lengthにもする
これが良さそうに思いました、これで行きたいと思います...!
@@ -374,6 +426,143 @@ def synthesize_wave( | |||
wave = raw_wave_to_output_wave(query, raw_wave, sr_raw_wave) | |||
return wave | |||
|
|||
def get_sing_phoneme_and_f0_and_volume( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
getは意図と反してるかも。書くなら…create…?
あとf0とphonemeと〜ってのをやめて、「歌い方」みたいなドメイン用語作っても良いかも。
create_歌い方 みたいな(英語考えてないですが。。)
あるいは「フレーム特徴量」みたいな用語作ってcreate_sing_frame_featureとか。
(まあAPIに露出しないので、fixmeコメントだけ書いて後回しでも。)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
とりあえずget
はcreate
に置換して、FIXMEコメントにしてしまおうかなと...!
Co-authored-by: Hiroshiba <[email protected]>
This reverts commit 12b8fc6.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
こちらのAPIに関わってくる部分以外はLGTMです!
気になったとこはissueの方にコメントで列挙しておいてみました。あとで潰していければ!
LGTMですが、子音がないモーラが来たときにバグりそうな気がしました!
こんな感じでCoreのモック書いちゃえば、意外とすぐテスト(兼チェック用のコード)書けるかもです。
あ、コメントがいっぱい書いてあって読みやすかったです!
すごい細かいですが、2行のコメントにしてるところはコミッターによるおしゃれの差が出ちゃうので、1行にしちゃったほうが良い気がしました。
@@ -704,6 +706,77 @@ def _synthesis_morphing( | |||
background=BackgroundTask(delete_file, f.name), | |||
) | |||
|
|||
@app.post( | |||
"/sing_frame_audio_query", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
判断メモです。
ここをsingにすべきかsongにすべきかですごく迷うのですが、これは「歌うためのクエリ」であり、「歌のクエリ」ではないので、singが合っているのかなと思いました。
もし仮に名詞にするならsongではなくsong_snyhtesisとかかなと。長いのでsingで良さそう。
vowel_length = note_durations[i] | ||
phoneme_durations.append(vowel_length) | ||
|
||
phoneme_durations_array = np.array(phoneme_durations, dtype=np.int64) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
後回しで良いのですが、この関数の引数のnote_durations
はNDArrayな一方、phoneme_durations
はlistで、逆にphoneme_durations_array
はNDArrayとなかなかややこしいことになっていそうです。
以前のエディタ辞書機能追加時に後回しにしたタスクはたしか全部は片付いてないんですよね・・・・・・。
後回しタスクは絶対やるという気持ちでいきましょう・・・!!
# もし、次のノートの子音長が負になる場合、現在のノートの半分にする | ||
if next_consonant_length < 0: | ||
next_consonant_length = consonant_lengths[i + 1] = note_duration // 2 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここのワークアラウンド、普通に考えるとノート長の半分よりも1フレームにするとかのが良い気がしました。
もし最低1フレーム保証にするだけなら、コアの方に書くべきかも?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
普通に考えれば1にするのが正しそうですが、子音長を1にすると、滑舌が怪しくなることがあるので、できれば避けたいかもです。
とはいえ、前のノートが長い場合、子音長もつられて長くなりそうなので、少し検討した方がいいなとは思いますね...
とはいえ負になるのはまずモデルが悪いので、コア側で調整するのが正しいそうですね...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
普通に考えれば1にするのが正しそうですが、子音長を1にすると、滑舌が怪しくなることがあるので、できれば避けたいかもです。
気持ちはわかるのですが、それはそれで1だと推論したものがそのままになるので、意図と実装がずれてる雰囲気を感じます。
触ってないのでわからないのですが、子音長が1だった場合は2にする、とかが良い気がしてます。
とりあえずマージを目指すのが良さそうな気がするので、非負になる処理をコアに足すことをFIXMEコメントにしてとりあえず後回しにするのはどうでしょう。
# もし、次のノートの子音長が負になる場合、現在のノートの半分にする | |
if next_consonant_length < 0: | |
next_consonant_length = consonant_lengths[i + 1] = note_duration // 2 | |
# もし、次のノートの子音長が負になる場合、現在のノートの半分にする | |
# FIXME: 非負にする処理をコア側に足す | |
if next_consonant_length < 0: | |
next_consonant_length = consonant_lengths[i + 1] = note_duration // 2 |
def calc_phoneme_lengths( | ||
consonant_lengths: NDArray[np.int64], | ||
note_durations: NDArray[np.int64], | ||
) -> NDArray[np.int64]: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あれ、これって子音長とノート長だけから、子音・母音の全音素の長さを返す感じですよね。
母音のみのノートだった場合どうなるんでしょう・・・?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
母音のみのノートは子音長が0になるようなマスクがモデル内部でかかっているので、ノートの頭から母音が始まるだけの処理になります。
暗黙的な処理ではあるので、どこかで説明は必要そうですね....
あと、子音長が0と誤って予測された場合のことを考えていないので、それも含めて改善してからマージすべきな気はします。
少し調整します。
# 予測した子音長を元に、すべての音素長を計算する | ||
phoneme_lengths = calc_phoneme_lengths(consonant_lengths, note_lengths_array) | ||
|
||
# 時間スケールを変更する(音素 → フレーム) | ||
frame_phonemes = np.repeat(phonemes_array, phoneme_lengths) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
phoneme_lengthsは必ずノート数×2だけど、phonemes_arrayは音素数になってて数が合ってない気がする・・・?
Co-authored-by: Hiroshiba <[email protected]>
バグっている箇所もあるんですが、とりあえずAPIをブランチから生やしたいのでマージさせていただきます!! |
内容
題の通りです。
関連 Issue
ref VOICEVOX/voicevox_core#712
その他
ドキュメントなどは適当に作ったので、少し修正した方がいいかもしれません。