-
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
run.pyの改善 #119
Comments
たしかにrun.pyはかなり膨れ上がっているので、改善していきたいです。 |
手の付けやすそうなところから、 目指す先としては、ENGINEを単体で動くPythonパッケージ化(PyPI上で公開)することを考えています(何を目指したいか、の意図と合っているかわからないですが)。メンテナンスが大変になるかもなので、実際にそこまで進めるのがいいのかはわかりません。 ひとまず、リファクタリングはやったほうが良さそうに思うので、 |
SynthesisEngineのインスタンス管理について、FastAPIと関係なく、シングルトンみたいなものを作って管理する方法がありそうだなと思いました(SynthesisEngineのインスタンスを保持するSynthesisEngineRegistryのようなモジュールを作って、初期化などのための関数を用意するとか)。 |
面白そうです! 今ENGINEにはサーバー機能とTTS機能(テキスト→音声機能)が混じっていて、おそらくPyPIになっていて嬉しいのはどちらかというと後者の方かなと感じています。 (今のCOREは音素やら音高やらを処理したベクトルを音声にしているのでかなり玄人向けになっていて、TTSだけをライブラリ化すれば気軽に利用できてユーザーが増えそうなので、すごくやりたいなぁと思っています。) |
いいと思います! (前者はシェルにコマンドを追加するconsole_scripts機能を使う想定でPyPIに上げることを考えていました。コアライブラリの読み込み・Nuitkaビルドとの兼ね合いなどのメンテナンス性、ライセンス周知など課題があるなと思っています) |
なるほどです、そちらも面白そうですね! |
issue立てるか迷いましたが開発で感じた改善点はここで書く様?なので書きます。 ProsFast APIで使用する型と内部処理で使用する型を分離できる例えば #229 では内部で使用されているデータ型がそのままFastAPIでの戻り値の型として使用されていたのでフロントに影響を与えてしまうため安易にフィールドの変更が行えない状況でした。これによりPRのレビュー停滞と回避するためにSynthesisEngineBase内部でWorkaround的な実装する必要がありました。経験上この問題は開発が進んで機能追加が進んでいく毎に顕著に現れやすくなるのでなるべく早く解消したほうが良いと思います。 複数種類のインターフェースを提供しやすくなる現状engineはhttp 通信のインターフェースしかないですが、開発者のニーズとしては通常のライブラリとして使用したいというのはあるかと。すでにaoirintさんがengineのPythonパッケージ化を提案されてますが、私個人としてはengineをdllで配布し、一般的なC APIの形でも提供しても良いかなと感じました。こうすることにより理論上はほぼ全ての言語に対してengineの機能を提供できます。 Consengineをメンテする際の学習コストが上がるメンテナーがレイヤードアーキテクチャを理解してる必要があるので若干参加するためのハードルが上がります。特に採用したての頃はある程度混乱を招くだろうと予見されます。 リファクタリングコストが高い完全に採用しようとするとけっこう修正しなければならないと思います。段階的に採用するにしても長い道のりになるかと。 実装する量が増える典型的なのがレイヤー間の型の詰替え処理を書かなくてはならなくなります。人によってこれは結構苦痛になるようです。 部分的にアイディアを採用する方法もなくはないですが、それを見極めるためにはやはり理解している必要があります。 |
私には判断しかねますが、個人的にちょっとconsが大きすぎる気がしました。
こちら、Pythonパッケージ化とは別に VOICEVOX/voicevox_core#43 で議論していますので、その件はこちらに移動するとよいかなと思いました...! |
僕もレイヤードアーキテクチャに関しては @.y-chan さんとほぼ同じ意見です。
こちらは確かに必要になってくるだろうなと感じました。 |
そうですね。データ構造の分離だけでも効果はあると思います。 |
リファクタリングしてしまいたいですが、run.pyに対するテストコードがなくて怖くてできず、かといってリファクタリングしないとSynthesisEngineをDIできないようなので適切なテストコードが書けないという状態になってると思います。 とりあえず今書けるだけのrun.pyに対するテストコードを書く -> run.pyのリファクタリング(fastAPI部分のみ) -> 本当に必要なrun.pyのテストコードを書く(ここで #230 完了) |
こちらの議論を前提として、現在は以下の個別 issue が走っているとの認識です:
本 issue は役割を終えたとの認識で合っているでしょうか?(close 可能?) |
@tarepan ほぼ同感です! あとは「現在のような関数内でAPIを定義する形よりも、グローバル下で定義するのが正しい形なのだと思います」ってのもあるかもです。 ほかは確かに別issueになってたりするので、closeで良いのではと感じました。 |
内容
run.pyに含まれるFastAPI関連のコードがFastAPIらしい(正確にはFastAPI公式がドキュメントに記している)書き方ではないです。
なので、この際書き直してみるとコードがより整理され、FastAPIらしい綺麗なコードがかけると思います。
要はただのリファクタです。
FastAPIは公式ドキュメント内で、依存するもの(今回であればSynthesis Engineクラス)がある場合、Dependency Injection(依存関係注入)を利用することが可能と示しています。
(参照: https://fastapi.tiangolo.com/tutorial/dependencies/ )
おそらく、現在のような関数内でAPIを定義する形よりも、グローバル下で定義するのが正しい形なのだと思います。
Pros 良くなる点
FastAPIを利用する際の一般的なコードにすることができ、保守性が向上すると思われます。
Cons 悪くなる点
Dependency Injectionを利用すると、各関数にDependsを差し込む引数を用意する必要があり、少し汚く見えてしまうかもしれません。
また、Dependsを利用すると、現状の構造ではCoreをいちいちimportし直す可能性があり、応答速度の低下が起こる可能性があります。まだ未検証事項ではあるので、ここら辺をちゃんと検証したうえでこれをPRに起こすべきか否かを判断すべきと考えます。
(よって、このIssueを取り下げる可能性は十分にあります。)
実現方法
run.pyを書き換える
VOICEVOXのバージョン
0.6.0
The text was updated successfully, but these errors were encountered: