-
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ブランチをmainブランチにマージ #1029
Conversation
* update metas (add style type) * update engine manifest (add frame rate) * add sing api to core wrapper * add sing api to core adapter * add models for sing api * add sing process to tts engine * add sing api * fix miss * add fixme comment Co-authored-by: Hiroshiba <hihokaruta@gmail.com> * remove sing type * fix typo * remove optional * translate error detail * get -> create * fix docs * Revert "remove optional" This reverts commit 12b8fc6. * fix pytest * add comment * add fixme comment Co-authored-by: Hiroshiba <hihokaruta@gmail.com> * improve models --------- Co-authored-by: Hiroshiba <hihokaruta@gmail.com>
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.
ちょくちょく、なんでこうなったかの説明がないところがあるので、思い出せる限りとりあえずメモを書いてみました。
@@ -640,6 +642,69 @@ 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.
audio_query
に歌い方周りのデータを足すこともできたんですが、互換性とか考えるとややこしいので分けることにしました。
sing_audio_query
にすることもできたのですが、audio_query
はフレームレベルのデータ構造ではないこと、将来フレームレベルのtalkができうることを考えると、構造がフレームレベルであることがわかるようにした方が良さそうだったのでframe
を足しています。
) | ||
def sing_frame_audio_query( | ||
score: Score, | ||
style_id: StyleId = Query(alias="speaker"), # noqa: B008 |
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 はspeaker
引数になっています。
style_idにしようかまだ迷ってます(リリース前なので)。
core_version: str | None = None, | ||
) -> FrameAudioQuery: | ||
""" | ||
歌唱音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま歌唱音声合成に利用できます。各値の意味は`Schemas`を参照してください。 |
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.
歌唱音声合成用のクエリ
というドメイン用語は歌唱
と音声
がかぶってるので「歌唱合成用の」でもいいかもと思ってます。
}, | ||
tags=["音声合成"], | ||
) | ||
def frame_synthesis( |
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_synthesis
じゃないのは、この処理が歌に依存しておらず、将来的に例えば TTS 側でも利用できなくはないので、汎用的な名前を持たせるために、現状の役割ではなく処理内容を名前にしています。
@@ -57,6 +57,7 @@ class EngineManifest(BaseModel): | |||
url: str = Field(title="エンジンのURL") | |||
icon: str = Field(title="エンジンのアイコンをBASE64エンコードしたもの") | |||
default_sampling_rate: int = Field(title="デフォルトのサンプリング周波数") | |||
frame_rate: float = 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.
フレームレートはマニフェストに足しています。
FrameAudioQuery
の中に含めてレスポンスで判断してもらうという手も考えたんですが、それだとフレームレートが1回合成しないとわからないということになるので避けました。
ちなみフレームレートの逆数のframe second にする手もあったのですが、VOICEVOXのデフォルトフレームレート93.75は秒に直すと割り切れないのでこっちにしました。
@@ -57,6 +57,7 @@ class EngineManifest(BaseModel): | |||
url: str = Field(title="エンジンのURL") | |||
icon: str = Field(title="エンジンのアイコンをBASE64エンコードしたもの") | |||
default_sampling_rate: int = Field(title="デフォルトのサンプリング周波数") | |||
frame_rate: float = Field(title="エンジンのフレームレート") | |||
terms_of_service: str = Field(title="エンジンの利用規約") | |||
update_infos: List[UpdateInfo] = Field(title="エンジンのアップデート情報") | |||
dependency_licenses: List[LicenseInfo] = 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.
エンジンマニフェストに達しているデータはフレームレートのみです。
TTS 側みたく、歌に関する具体的な能力の有無も書き足そうかなと思ったのですがやめました。
理由は・・・ちょっといまいち説得力がないかもですが、仮に中途半端に能力を書き足した場合、後で機能が増えた時に、マルチエンジンに対応したエディター側に初期値が何なのかの処理をVOICEVOXエンジン依存で書く必要が出てきて大変だから、だった気がします。
だとしたらもっと時間がある時に必要な能力を列挙してしまって一気に実装した方が良いかなという判断になりました。
(sing
能力の有無だけはあっても良かったかもしれない・・・?)
key: int | None = Field(title="音階") | ||
frame_length: int = Field(title="音符のフレーム長") | ||
lyric: str = 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.
Noneはノートがない区間を表しています。
lyricはモーラにすることもできたのですが、将来多言語になることとか、あと2モーラ以上あるエンジンも考えられる(NEUTRINOとか)ので、strにしました。
(・・・今思ったら英語のような表音文字じゃない言語のことを考えると、音素列の方が良かったかも。まあその場合はphonemesも足せるようにすれば良さそう。)
class Score(BaseModel): | ||
""" | ||
楽譜情報 | ||
""" | ||
|
||
notes: List[Note] = 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.
将来的に何か情報が足せるように、要素が一つだけのクラスを作りました。
内容
project-sブランチをmainブランチにマージします。
関連 Issue
その他