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

複数エンジン対応: すべてのエンジンからキャラクター情報を取得する #743

Closed
wants to merge 107 commits into from

Conversation

aoirint
Copy link
Member

@aoirint aoirint commented Mar 9, 2022

内容

#741, #742, #754, #755 の差分を含んでいます。そちらを先に確認おねがいします。

これまで、DEFAULT_ENGINE_INFOSに登録されたエンジンを起動し、接続テストを待機するようになっていました。

このPRでは、エディタ起動時にすべてのエンジンからキャラクター情報を取得するようにします。

AudioCellにengineIdの追加が必要になったので、変更量が多めな気がします(概念としてengineKeyとengineIdが混じりあっていてややこしい実装になっていると思っているし、適切に使い分けられているか自信がない...)。

TODO

動作確認手順

Windows上で、VOICEVOXエンジン・COEIROINKエンジンを適当なディレクトリに配置後、.envファイルを以下のように書き換えてください(engineKeyはランダム)。

DEFAULT_ENGINE_INFOS=[{"key":"074fc39e-678b-4c13-8916-ffca8d505d1d","executionEnabled":true,"executionFilePath":"C:/Users/aoi/local/voicevox_engine_cpu-0.11.3/run.exe","host":"http://127.0.0.1:50021"},{"key":"d9212658-962f-4918-80b2-310b7de70c41","executionEnabled":true,"executionFilePath":"C:/Users/aoi/local/COEIROINK-CPU-c1.0.1+v0.10.4/run.exe","host":"http://127.0.0.1:50031"}]
# DEFAULT_ENGINE_INFOS=[{"key":"074fc39e-678b-4c13-8916-ffca8d505d1d","executionEnabled":true,"executionFilePath":"C:/Users/aoi/local/voicevox_engine_cpu-0.11.3/run.exe","host":"http://127.0.0.1:50021"}]
VUE_APP_GTM_CONTAINER_ID=GTM-DUMMY

関連 Issue

スクリーンショット・動画など

image

その他

@aoirint aoirint marked this pull request as draft March 26, 2022 10:14
@Hiroshiba
Copy link
Member

こちら、ぜひぜひPRを見てみたいです。
かなりコンフリクトが発生しちゃっていますが、rebaseでなんとかなりそうでしょうか・・・👀

@aoirint aoirint marked this pull request as ready for review June 26, 2022 15:50
@aoirint
Copy link
Member Author

aoirint commented Jun 26, 2022

コンフリクト解消しました!

Copy link
Member

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

コンフリクト解消ありがとうございます!!
ちょっと最初に1点だけコメントしました!

`No engineKey for target character style (speakerUuid == ${speakerUuid}, styleId == ${styleId})`
);

const engineId = getEngineIdByEngineKey(store.state, engineKey);
Copy link
Member

Choose a reason for hiding this comment

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

たしかにengineKeyとengineIdの使い分けがなかなか難しそうな気がしました!
ちょっと何度も聞いてしまっていて申し訳ないのですが、どういう使い分けが想定されていたんでしたっけ・・・🙇

Copy link
Member Author

Choose a reason for hiding this comment

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

engineIdは、エンジンの種類(VOICEVOX ENGINEやCOEIROINK ENGINE)に対して、エンジンの提供者が割り振るIDです。バージョンが変わっても同じIDを使うことを想定しています。

engineKeyは、エディタに登録されたエンジンの登録項目(ユーザ登録エンジン1、ユーザ登録エンジン2のような)に対して、エディタが自動的に割り振るIDです。
例えば、以下を区別するためのものです。

  • ローカルで実行されているVOICEVOX ENGINE 0.12.3
  • ローカルで実行されているVOICEVOX ENGINE 0.7.5
  • VPSで実行されているVOICEVOX ENGINE 0.7.5

Copy link
Member Author

Choose a reason for hiding this comment

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

ただ製品版VOICEVOX(エディタとエンジンが同梱配布)では、エディタ初回実行時にengineKeyを決定するような仕組みを入れるのは複雑かなと思ったので、配布時に既に割り振られている(.env.productionに記述されている)形を想定しています(DEFAULT_ENGINE_INFOSでは決め打ちの値ということ)。

Copy link
Member Author

Choose a reason for hiding this comment

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

VOICEVOX 0.12.3では、キャラクター+スタイルの情報は、AudioCellがstyleIdとして持っています。
AudioCellの内容はプロジェクトファイルに保存されます。
複数エンジン対応後、キャラクター+スタイルを一意に識別するには、少なくとも(engineId, styleId)または(speakerUuid, styleId)が必要です(エンジンバージョンによる違いは無視)。
#609 (comment) で(engineId, styleId)がよさそうということだったと思うので、このPRではAudioCell(プロジェクトファイル)が(engineId, styleId)をもつように変更しています。

Copy link
Member Author

@aoirint aoirint Jun 26, 2022

Choose a reason for hiding this comment

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

engineKeyからengineIdを引く処理、またはengineIdからengineKeyを引く処理が必要になっていて、この変換が挟まること、どの関数でどちらを受け取るべきなのかを決めること、が複雑(わかりにくい)と思っています。

このPRでは、実装を簡単にするためにengineKey == engineIdを想定していて、このロジックが分散しないようにgetEngineIdByEngineKeygetDefaultEngineKeyByEngineIdで共通化しています(インタフェースは暫定的なものです)。

例えば、エンジン設定UIでengineIdに対するデフォルトのengineKeyを設定できるようにして、それをgetDefaultEngineKeyByEngineIdが返すことで、シンプルなエンジン切り替え(バージョン切り替え)の仕組みが作れると思っています(いろいろな初期化が必要そうなので再起動を促すと楽そう)。

Copy link
Member

Choose a reason for hiding this comment

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

ありがとうございます!!非常によくわかりました!!!

AudioCellでengineIdを使うのは、現行と同じ挙動になって、少なくとも使い勝手が悪くなることは無く、かつ実装もそこそこシンプルなので、やっぱり良い方法だと感じました。

将来的にはAudioCell(よいうよりAudioInfo)にengineKeyも保存する形を目指す感じになる感じでしょうか。
(過去バージョンのエンジンと今のエンジンを統一的に使えるように)

engineIdとengineKeyを分けたいのは賛成なのですが、今は同一に扱っているため、潜在的なバグに気づきにくく、かつ実装方針もなかなか定まりにくいのかなと感じています。
もうAudioInfoにengineKeyも持たせちゃうのはどうでしょう 👀

getDefaultEngineKeyByEngineIdgetEngineIdByEngineKeyを用意するのは賛成です!
でももしかしたらgetDefaultEngineKeyByEngineIdgetEngineIdByEngineKeyを呼ぶべき機会はとても少なくて、
前者は「AudioInfoにあるengineKeyがengineInfosにないので仕方なくデフォルトのを使うとき」のみ、
後者は「AudioInfoに登録するためにengineIdを得るとき」のみにできるのかなと思っています。

なんか見落としや気づいてない点がありそうなので、ご指摘頂けると。。。🙇

Copy link
Member

Choose a reason for hiding this comment

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

もしくは、engineId周りを一旦コードから外しちゃうというのはどうでしょう 👀

一旦外すことを提案している理由はもう2つあります。
理由の1つは、上述のような、engineIdをどう扱うか・どう実装するかの議論が発生してしまうためです。
結構大きな変更コード量なので、差分を明確にしたいという気持ちがあります。

もう1つの理由は、このプルリクエストが、エディタ側の複数エンジン対応に必須な最後のコードだからです。
この最後のキャラクター統合さえ完了すれば、他のコードを一気に組み込んで行けるため、ぜひ早く取り込みたいという気持ちがあります・・・!!!

もしよければ・・・!!

@Hiroshiba
Copy link
Member

engineIdどうするかさえ決まれば…!!

@Hiroshiba
Copy link
Member

こちらいかがでしょう 👀

今頂いている2つのPRの機能が揃うと複数エンジン対応を多人数でガツガツ進められそうな気がしています。
お返事厳しそうであれば、来週か再来週くらいにブランチをforkして実装して別のPRを作らせていただこうかなと思います。
せっかく実装して頂いたのにお待ちできなくて申し訳ないです・・・。

@Hiroshiba
Copy link
Member

ちょっとお返事がないので、頂いたPRを派生して実装して別のRPを作ってみます!
@aoirint さんすみません 🙇

@aoirint
Copy link
Member Author

aoirint commented Aug 23, 2022

に引き継いでいただいて、マージされたのでこちらはクローズします!
ありがとうございます!
(そしてこちらのPRになかなかお返事できず申し訳ないです・・・!)

@aoirint aoirint closed this Aug 23, 2022
@Hiroshiba
Copy link
Member

レビューありがとうございました!!

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