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

コア(共有ライブラリ)の読み込みにおいてコアの API 変更に追従する #454

Closed
3 of 5 tasks
PickledChair opened this issue Aug 27, 2022 · 18 comments

Comments

@PickledChair
Copy link
Member

PickledChair commented Aug 27, 2022

内容

VOICEVOX/voicevox_core#217 がマージされたことにより、コアの API に破壊的変更を伴う改善が入りました。次のバージョンのリリースまでにこの新しい API に対応する必要があります(API の戻り値が VoicevoxResultCode に統一されたり、一部の関数が消えたりリネームされたりなど結構変わりました)。作業や考えるべきことがいくつかありそうだったので「実現方法」の欄にリストアップしました。

Pros 良くなる点

新しいコアが使える

Cons 悪くなる点

コアのバージョンの自動判別がこれまで以上にややこしくなる

実現方法

思いついた範囲では以下のようなことが考えられました(他に考慮すべきことがあったり、もっと良い対応方法があったりした場合は提案をいただけると助かります!)。

  • 新 API に対応した新しい CoreWrapper を実装する
    • 現状は1つの CoreWrapper を用いているが、単純にこれに新 API 対応のコードを追加するとコードが肥大すると思うので、別のクラスに実装を分けた方が良い? SynthesisEngineBase のように抽象基底クラスを定義してそれを継承する実装にするのも良いかもしれない。
  • コアのバージョンの自動判別をどうするか決定する
    • これまではバージョンアップに伴う非互換が発生したときに コアの変更への追従 #385 におけるような方法などで何とか自動判別する方針をとっていた
    • 今回の新しいコアは構成するファイル的に見てもバージョン 0.12, 0.13 のコアと区別がつかないので、自動判別する方針を維持するなら別の方法を考える必要がある
    • 例えば、コアの存在するディレクトリに、コアのバージョン情報を持っている txt ファイルを配置するなどして、それをもとにバージョンを判別する、という案が考えられる(この txt ファイルがない場合はこれまでの自動判別の仕組みを用いることで、これまでの仕様を維持できる)。

VOICEVOXのバージョン

0.14.0 リリースまでに実装?

OSの種類/ディストリ/バージョン

  • Windows
  • macOS
  • Linux

その他

VOICEVOX/voicevox_core#213 の作業に関連しています。この Issue には他に #438 (pyopenjtalk の扱う文字コードを新しい openjtalk に合わせて UTF-8 にする)も関係しています。

@github-actions github-actions bot added OS 依存:linux Linux に依存した現象 OS 依存:mac macOS に依存した現象 OS 依存:win Windows に依存した現象 labels Aug 27, 2022
@qwerty2501
Copy link
Contributor

いま qryxip さんがpython wrapperを作るためのPRを作ってるのでengineからはそっちを使用したほうがよいかもしれません
VOICEVOX/voicevox_core#239

@PickledChair
Copy link
Member Author

PickledChair commented Aug 27, 2022

いま qryxip さんがpython wrapperを作るためのPRを作ってるのでengineからはそっちを使用したほうがよいかもしれません

確かに、デフォルトはコアの共有ライブラリを直接ロードするのではなく PyO3 で作ったモジュールを使用する、という方が良さそうですね! リリース版のエンジンをデフォルトの設定で使う場合はそれで対応できそうです。

一方、過去のコアや開発版のコアを --voicelib_dir オプション経由で使いたい、というケースを引き続きサポートする場合は、やはりコアライブラリのロードの仕組みに手を入れる必要があります。この機能を維持するかどうかの決定次第ですかね……。

(おそらく、複数のバージョンのコアを読み込める仕様をこの先も維持する場合、そのコストは増加し続けそうです。個人的には、あるバージョンのエンジンはその時点の最新のコアのみを使用することにする、ということにしても良いような気がしています。複数のバージョンのコアを同時に扱うということは、今実装が進んできている複数エンジン対応に委ねるのがシンプルに見えます。 ← すみません、あまり関係ない話題だったかもしれません。)

@PickledChair
Copy link
Member Author

複数のバージョンのコアを同時に扱うということは、今実装が進んできている複数エンジン対応に委ねるのがシンプルに見えます。

と書いたのですが、複数の voicevox_engine が立ち上がっているのは想定されてなかったかも……? あまりよくわかっていないで書いてしまいました、すみません。

@Hiroshiba
Copy link
Member

Hiroshiba commented Aug 27, 2022

バージョンを指定する機能に関してですが、読み上げ等でもキャラごとにバージョンを変えたい要望がある場合は、エンジン側(かコア側)に切り替え機能があると喜ばれそうに思いました!

(ちなみに過去バージョン切り替えなのですが、近い将来に全キャラのイントネーションが若干変わる?可能性があって、そのタイミングで必須になりそうに感じています。
それまでにUIがほしいのですが、そういえばキャラごとにどのバージョンが利用可能なのかの一覧が未実装なのでUI実装不可能ですね・・・。issue作ってみます。)

@PickledChair
Copy link
Member Author

PickledChair commented Aug 27, 2022

バージョンを指定する機能に関してですが、読み上げ等でもキャラごとにバージョンを変えたい要望がある場合は、エンジン側(かコア側)に切り替え機能があると喜ばれそうに思いました!
近い将来に全キャラのイントネーションが若干変わる?可能性があって、そのタイミングで必須になりそうに感じています。

なるほどです! それであれば、やはりコアのロードの仕組みには手を入れる必要がありそうですね(PyO3 版は、音声のモデルとコアがまだ分離できていない関係上、複数のバージョンのモデルを切り替える手段を持てないと思うので)。

また、現状のコアのバージョンの自動判別は、実際には「互換性のあるコアのバージョンごと」の判別しかしていないので、ロードしたコアが具体的にバージョン 0.x.x のコアであるのかという情報をエンジンが保持していない状態です。そのため、エンジンが使用可能なコアのバージョンの一覧を返すには、バージョンの自動判別をやめて、ロードするコアごとに明示的にそのコアのバージョンを指定することが必要なのかなと感じました。

@PickledChair
Copy link
Member Author

すみません、metas にバージョン情報が入っているのをすっかり失念していました……。大丈夫でした!

@PickledChair
Copy link
Member Author

Rust 版のコアは initialize 関数を呼んでからでなくても metas の文字列を取得できるということに気づいた(C++ 版は initialize されてからでないと多分空文字列が返ると思います)ので、「もしかして metas を取得したときに空文字列だったら以前のバージョン、ちゃんと内容が取得できれば新しいバージョン、と判別できるのでは……?」と一瞬期待したのですが、関数名が変わった(metas -> voicevox_get_metas_json)のでやはり先にバージョンを取得できていなければならないということがわかりました……

@qwerty2501
Copy link
Contributor

qwerty2501 commented Aug 27, 2022

一方、過去のコアや開発版のコアを --voicelib_dir オプション経由で使いたい、というケースを引き続きサポートする場合は、やはりコアライブラリのロードの仕組みに手を入れる必要があります。この機能を維持するかどうかの決定次第ですかね……。

これそもそもなんですがRust C API版でも大きく前とAPIが変わってますのでRust python API版とそこまでやりやすさは変わらないのではないかと思います。

@PickledChair
Copy link
Member Author

PickledChair commented Aug 27, 2022

これそもそもなんですがRust C API版でも大きく前とAPIが変わってますのでpython版とそこまでやりやすさは変わらないのではないかと思います。

現状の設計の python 版では複数のバージョンの python 版コアを同居させられない(特にビルドされたエンジンで)と思うので、コアのバージョン 0.15 以降を使用するエンジンで過去の python 版コアが使用できなくなると思います(間違っていたらすみません。ただ、これが正しければ python 版ではやりやすさの観点の前に、複数のバージョンの python 版コアを同時に扱うことが現状は不可能だと思います)。なので共有ライブラリをロードできるようにする機能はコアのバージョン 0.14 以降でも必要になってくると思います。このことから、共有ライブラリのロードの仕組みに手を入れるかどうかは

この機能を維持するかどうかの決定次第

ということを書きました。そして #454 (comment) よりこの機能は維持した方がよさそう(今のところ代替案がない)であり、コアをロードする前にコアのバージョンを知るための何らかの対応策がどうしても必要になる、ということです。

補足:python 版コアをエンジンに導入することに反対している訳ではないです(むしろ賛成です!)。ただし、python 版コアで複数のバージョンの音声モデルを扱う仕組みができるまでは、共有ライブラリをロードする方法も(新しいコアのバージョンに対しても)維持する必要がある、ということを言いたかった感じです。

@PickledChair
Copy link
Member Author

もうちょっと考えたのですが、0.14 のコアをデフォルトで使うエンジンについては、共有ライブラリ経由で読み込みたいコアは 0.13 以前のバージョンだと思うので、デフォルトで使用するコアは python 版を使うとして、共有ライブラリ経由の読み込みはまだ急いで対応する必要はなさそうですね!

@PickledChair PickledChair changed the title コアの API 変更に追従する コア(共有ライブラリ)の読み込みにおいてコアの API 変更に追従する Aug 27, 2022
@qwerty2501
Copy link
Contributor

qwerty2501 commented Aug 27, 2022

pythonについては詳しくないのですが、 動的にimportを行えば良いのかなと思ってたのですがこれだとだめですかね?
https://www.yoheim.net/blog.php?q=20171004

@PickledChair
Copy link
Member Author

pythonについては詳しくないのですが、 動的にimportを行えば良いのかなと思ってたのですがこれだとだめですかね? https://www.yoheim.net/blog.php?q=20171004

なるほど、そういう仕組みもあるんですね……(ありがとうございます)。もし上手くいくなら、そちらの方が良いかもしれません!

@Hiroshiba
Copy link
Member

いったんバージョン判定の件ですが、先にバージョンを知るのを迂回できる方法として、例えば新APIと過去API用のコアラッパーを用意して、片方でロードできなければもう片方でロードをtryする、というのを思いつきました!
この方法だとどうでしょうか 👀

@Hiroshiba
Copy link
Member

あ! そもそもcoreディレクトリにVERSIONファイルがあるので、これでバージョン判定できるかも・・・?

@Hiroshiba
Copy link
Member

辞書機能やAudioQuery機能などに関して、互換性維持の観点を完全に念頭から外れていろんな提案をしていました、すみません 🙇‍♂️

過去のコアの互換性を考えると、辞書機能やAudioQuery作成などの機能は全てエンジン側に必要になります。
コアにもAudioQuery機能はあり、仮にコアの機能を使うと、互換性維持用のコードとコアのコードを使う2通りのコードが出来上がります。
これをメンテするのは大変そうなので、コア側の辞書・AudioQuery機能への対応は必須ではないかなと思いました。

考慮漏れでした、申し訳ないです 🙇

@PickledChair
Copy link
Member Author

PickledChair commented Sep 13, 2022

@Hiroshiba

過去のコアの互換性を考えると、辞書機能やAudioQuery作成などの機能は全てエンジン側に必要になります。
コアにもAudioQuery機能はあり、仮にコアの機能を使うと、互換性維持用のコードとコアのコードを使う2通りのコードが出来上がります。
これをメンテするのは大変そうなので、コア側の辞書・AudioQuery機能への対応は必須ではないかなと思いました。

わかりました!(多分 Discord で話されていた話題についてですね?)個人的にも、コア側の辞書や AudioQuery 機能を使うようにするのは変化が大きすぎると感じたので、最終的にどんな形になるかはともかく、新しいコアについてもまずは既存の仕組みに組み込むことを目指すのが良さそうだと思いました。

新しいコアに対応する作業工程についてですが、 #454 (comment)VOICEVOX/voicevox_core#266 (comment) の提案の通り、最初から python API 版コアのみに対応をしぼるということも考えられます。

ただ、新しいコアへの対応にあたって既存のコアのロードの仕組みをちょっとリファクタしておきたいという気持ちがあり、その過程で、まずは共有ライブラリ版コアの読み込みの方でも新しいコアに対応させる方が、移行のやり方としてなだらかでやりやすいと感じています。

共有ライブラリ版コアのバージョン判定の仕組みについては、次のバージョン以降は #454 (comment) の提案の通り、コアの VERSION ファイルを使用するというのが最もシンプルで良さそうと感じました。仕組みとしては以下のようなものを考えています:

  • Rust 版コアの最初の正式リリースバージョン以降は、VERSION ファイルの存在を必須としてそれをバージョン判定に使う
  • おそらく VERSION ファイルは onnxruntime に移行してからコアの配布物として同梱されている感じに見えたので、過去のコアについても VERSION ファイルを発見できればそれを使ってバージョン判定する
  • VERSION ファイルがなければ従来のバージョン判定方法を使う

現在、エンジンのビルドでは VERSION ファイルを同梱するようにはなっていないので、次のリリースでも共有ライブラリ版コア (core.dll) を使用する場合、含めるようにする必要があります。ただし、ビルド済みエンジンと一緒に VERSION ファイルを同梱すると、それがコアのバージョンなのかエンジンのバージョンなのかわからなくなってしまうので、VOICEVOX_CORE_VERSION などのようにリネームして同梱するのが良いと感じました。

(python API 版も利用可能になった時点で利用したいですが、例えば過去バージョンの python API 版コアの wheel を動的に読み込む方法があるのかどうかまだわかっていません。python API 版コアは内部で numpy や pydantic に依存しているので、それらのバージョンを更新した時に複数のバージョンを共存できるかどうかについて自信がないです……。ぱっと見では、wheel にこれらの依存ライブラリが同梱されているようにも見えませんでした。python API 版の動的読み込みが現実的でない場合は、最新バージョンのコアだけ pip でインストールして使う形になると想像しています。)

追記: VOICEVOX/voicevox_core#256 がマージされたら共有ライブラリの名前が voicevox_core.dll だったら rust 版というように判断できることに気が付きましたが、今後も仕様変更はあり得るので、VERSION ファイルを利用するのが良さそうという考えは今のところそのままです。

@tarepan
Copy link
Contributor

tarepan commented Dec 7, 2023

本 issue は以下の複数課題を扱っているかと思います:

A. コアAPI変更に追従した現行機能の維持
B. 将来的API変更を前提としたバージョン判定法の導入
C. コア新規API/機能への追従

このうち A および B は関係者の尽力により現在解決されています。

@Hiroshiba
これに関して質問です。

Q. 開発方針「VOICEVOX ENGINE は VOICEVOX CORE の全機能に追従していく」は存在するか否か

回答がNOの場合、課題 C は都度個別 issue で議論されるのが適切なため、本 issue は目標達成、close可能かと思います。

@Hiroshiba
Copy link
Member

Hiroshiba commented Dec 9, 2023

@tarepan
本当ですね、課題に関してはほぼ解決かなと感じました!!
コメント全部読み返した感じ、コアのPython APIを使うかどうかも検討されていましたが、おそらく動的ライブラリを直接使用する形で今のところ落ち着いているのかなと思いました。

Q. 開発方針「VOICEVOX ENGINE は VOICEVOX CORE の全機能に追従していく」は存在するか否か

将来的には分かりませんが、このissueの目的はコア0.14への対応(これ)が目的で、コア0.14の全機能には一旦追従しないということになりそうです。
ただまぁ0.14の例えば辞書機能をエンジン側で使う、みたいなのもあると思うので、 @tarepan さんのおっしゃる通り都度issue化して検討していく形が良いのかなと思いました!

なのでこのissueは完了の形でcloseさせていただこうと思います!

@PickledChair さん、改めてありがとうございました!!!

@tarepan tarepan removed the OS 依存:mac macOS に依存した現象 label Mar 17, 2024
@tarepan tarepan removed OS 依存:linux Linux に依存した現象 OS 依存:win Windows に依存した現象 labels Mar 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants