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ブランチをmainブランチにマージ #1029

Merged
merged 5 commits into from
Jan 27, 2024
Merged

Conversation

Hiroshiba
Copy link
Member

内容

project-sブランチをmainブランチにマージします。

関連 Issue

その他

y-chan and others added 5 commits January 14, 2024 00:30
* 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>
@Hiroshiba Hiroshiba requested a review from a team as a code owner January 27, 2024 20:15
@Hiroshiba Hiroshiba requested review from y-chan and removed request for a team January 27, 2024 20:15
@Hiroshiba Hiroshiba merged commit ea76515 into master Jan 27, 2024
6 checks passed
@Hiroshiba Hiroshiba deleted the project-s branch January 27, 2024 20:16
Copy link

Coverage Result

Resultを開く
Name Stmts Miss Cover
run.py 497 313 coverage-37%
voicevox_engine/init.py 1 0 coverage-100%
voicevox_engine/cancellable_engine.py 94 72 coverage-23%
voicevox_engine/core_adapter.py 81 34 coverage-58%
voicevox_engine/core_initializer.py 59 30 coverage-49%
voicevox_engine/core_wrapper.py 257 183 coverage-29%
voicevox_engine/dev/core/init.py 2 0 coverage-100%
voicevox_engine/dev/core/mock.py 36 8 coverage-78%
voicevox_engine/dev/tts_engine/init.py 2 0 coverage-100%
voicevox_engine/dev/tts_engine/mock.py 28 0 coverage-100%
voicevox_engine/engine_manifest/EngineManifest.py 35 0 coverage-100%
voicevox_engine/engine_manifest/EngineManifestLoader.py 12 0 coverage-100%
voicevox_engine/engine_manifest/init.py 3 0 coverage-100%
voicevox_engine/library_manager.py 92 4 coverage-96%
voicevox_engine/metas/Metas.py 36 0 coverage-100%
voicevox_engine/metas/MetasStore.py 18 6 coverage-67%
voicevox_engine/metas/init.py 2 0 coverage-100%
voicevox_engine/model.py 180 9 coverage-95%
voicevox_engine/morphing.py 71 46 coverage-35%
voicevox_engine/part_of_speech_data.py 5 0 coverage-100%
voicevox_engine/preset/Preset.py 13 0 coverage-100%
voicevox_engine/preset/PresetError.py 2 0 coverage-100%
voicevox_engine/preset/PresetManager.py 80 2 coverage-98%
voicevox_engine/preset/init.py 4 0 coverage-100%
voicevox_engine/setting/Setting.py 11 0 coverage-100%
voicevox_engine/setting/SettingLoader.py 17 0 coverage-100%
voicevox_engine/setting/init.py 3 0 coverage-100%
voicevox_engine/tts_pipeline/acoustic_feature_extractor.py 34 0 coverage-100%
voicevox_engine/tts_pipeline/kana_converter.py 88 1 coverage-99%
voicevox_engine/tts_pipeline/mora_list.py 7 0 coverage-100%
voicevox_engine/tts_pipeline/text_analyzer.py 146 6 coverage-96%
voicevox_engine/tts_pipeline/tts_engine.py 264 93 coverage-65%
voicevox_engine/user_dict.py 145 12 coverage-92%
voicevox_engine/utility/init.py 5 0 coverage-100%
voicevox_engine/utility/connect_base64_waves.py 37 0 coverage-100%
voicevox_engine/utility/core_version_utility.py 8 1 coverage-88%
voicevox_engine/utility/mutex_utility.py 13 0 coverage-100%
voicevox_engine/utility/path_utility.py 26 8 coverage-69%
voicevox_engine/utility/run_utility.py 10 7 coverage-30%
TOTAL 2424 835 coverage-66%

Copy link
Member Author

@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.

ちょくちょく、なんでこうなったかの説明がないところがあるので、思い出せる限りとりあえずメモを書いてみました。

@@ -640,6 +642,69 @@ def _synthesis_morphing(
background=BackgroundTask(delete_file, f.name),
)

@app.post(
"/sing_frame_audio_query",
Copy link
Member Author

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
Copy link
Member Author

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`を参照してください。
Copy link
Member Author

Choose a reason for hiding this comment

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

歌唱音声合成用のクエリというドメイン用語は歌唱音声がかぶってるので「歌唱合成用の」でもいいかもと思ってます。

},
tags=["音声合成"],
)
def frame_synthesis(
Copy link
Member Author

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="エンジンのフレームレート")
Copy link
Member Author

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="依存関係のライセンス情報")
Copy link
Member Author

Choose a reason for hiding this comment

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

エンジンマニフェストに達しているデータはフレームレートのみです。

TTS 側みたく、歌に関する具体的な能力の有無も書き足そうかなと思ったのですがやめました。
理由は・・・ちょっといまいち説得力がないかもですが、仮に中途半端に能力を書き足した場合、後で機能が増えた時に、マルチエンジンに対応したエディター側に初期値が何なのかの処理をVOICEVOXエンジン依存で書く必要が出てきて大変だから、だった気がします。
だとしたらもっと時間がある時に必要な能力を列挙してしまって一気に実装した方が良いかなという判断になりました。

sing能力の有無だけはあっても良かったかもしれない・・・?)

Comment on lines +80 to +82
key: int | None = Field(title="音階")
frame_length: int = Field(title="音符のフレーム長")
lyric: str = Field(title="音符の歌詞")
Copy link
Member Author

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も足せるようにすれば良さそう。)

Comment on lines +85 to +90
class Score(BaseModel):
"""
楽譜情報
"""

notes: List[Note] = Field(title="音符のリスト")
Copy link
Member Author

Choose a reason for hiding this comment

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

将来的に何か情報が足せるように、要素が一つだけのクラスを作りました。

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