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

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

Merged
merged 135 commits into from
Aug 23, 2022

Conversation

Hiroshiba
Copy link
Member

内容

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

その影響で変更される箇所の一覧です。

  • AudioCellのキャラクター一覧
    • アイコン・キャラクター名の表示
    • 音声合成
    • 立ち絵・キャラクター名の表示
  • デフォルトスタイル
  • キャラクター並び替え・試聴
  • キャラクターライセンスの表示
  • プロジェクトファイルのマイグレーション

動作確認手順

COEIROINK 1.0.1のwindowsビルドをダウンロードした後、.envをこんな感じにして起動してください。

NODE_ENV=development
DEFAULT_ENGINE_INFOS=`[
    {
        "uuid": "074fc39e-678b-4c13-8916-ffca8d505d1d",
        "executionEnabled": true,
        "executionFilePath": "C:/path/to/voicevox_engine/run.exe",
        "host": "http://127.0.0.1:50021"
    },
    {
        "uuid": "d9212658-962f-4918-80b2-310b7de70c41",
        "executionEnabled": true,
        "executionFilePath": "C:/path/to/coeiroink_engine/run.exe",
        "host": "http://127.0.0.1:50031"
    }
]`
VUE_APP_GTM_CONTAINER_ID=GTM-DUMMY

関連 Issue

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

その他

このPRは、こちらのPRの置き換えになります。
相当な修正範囲にもかかわらず良い感じに動いているのは、僕ではなく @aoirint さんの努力によるものです。本当にありがとうございます。

Copy link
Member

@Segu-g Segu-g left a comment

Choose a reason for hiding this comment

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

コードが大きいので全部見れているか不安ですが一応見てみました。
userOrderedCharacterInfosdefaultStyleIDsなどにおけるキャラクター重複時の操作が怪しくなりそうに感じました。恐らくまだCharacterが複数のエンジンで重複した際のUIもないので、そうであれば別PRで作成するのも手だと思います。

@shirowanisan
Copy link
Contributor

仕様なら問題ないですが、過去プロジェクトファイルがEvery audioItem should have a "engineId" attribute.により、互換がなくなりそうです。
また、互換をなくすならば、これを機にプロジェクトファイルにキャラクターUUIDを含めた方が良いように思いました

{"appVersion":"999.999.999","audioKeys":["7aec337d-3e3d-4bc1-b816-c0bf7b36fac7"],"audioItems":{"7aec337d-3e3d-4bc1-b816-c0bf7b36fac7":{"text":"今日はいい天気ですね","engineId":"d9212658-962f-4918-80b2-310b7de70c41","styleId":30,"query":{"accentPhrases":[{"moras":[{"text":"キョ","consonant":"ky","consonantLength":0,"vowel":"o","vowelLength":0,"pitch":0},{"text":"オ","vowel":"o","vowelLength":0,"pitch":0},{"text":"ワ","consonant":"w","consonantLength":0,"vowel":"a","vowelLength":0,"pitch":0}],"accent":1,"isInterrogative":false},{"moras":[{"text":"イ","vowel":"i","vowelLength":0,"pitch":0},{"text":"イ","vowel":"i","vowelLength":0,"pitch":0}],"accent":1,"isInterrogative":false},{"moras":[{"text":"テ","consonant":"t","consonantLength":0,"vowel":"e","vowelLength":0,"pitch":0},{"text":"ン","vowel":"N","vowelLength":0,"pitch":0},{"text":"キ","consonant":"k","consonantLength":0,"vowel":"i","vowelLength":0,"pitch":0},{"text":"デ","consonant":"d","consonantLength":0,"vowel":"e","vowelLength":0,"pitch":0},{"text":"ス","consonant":"s","consonantLength":0,"vowel":"U","vowelLength":0,"pitch":0},{"text":"ネ","consonant":"n","consonantLength":0,"vowel":"e","vowelLength":0,"pitch":0}],"accent":1,"isInterrogative":false}],"speedScale":1,"pitchScale":0,"intonationScale":1,"volumeScale":1,"prePhonemeLength":0.1,"postPhonemeLength":0.1,"outputSamplingRate":44100,"outputStereo":false,"kana":""}}}}

@shirowanisan
Copy link
Contributor

shirowanisan commented Aug 21, 2022

起動しての動作確認は、一通りの操作を行いましたが、問題なさそうでした。

コードは全体を見ましたが、type script初心者の自分には、ちゃんとしたレビューは難しそうでした。
すみませんが「ざっくり見た形では問題なさそう」という形のレビューとさせていただければ幸いです。

@Segu-g
Copy link
Member

Segu-g commented Aug 21, 2022

仕様なら問題ないですが、過去プロジェクトファイルがEvery audioItem should have a "engineId" attribute.により、互換がなくなりそうです。 また、互換をなくすならば、これを機にプロジェクトファイルにキャラクターUUIDを含めた方が良いように思いました

{"appVersion":"999.999.999","audioKeys":["7aec337d-3e3d-4bc1-b816-c0bf7b36fac7"],"audioItems":{"7aec337d-3e3d-4bc1-b816-c0bf7b36fac7":{"text":"今日はいい天気ですね","engineId":"d9212658-962f-4918-80b2-310b7de70c41","styleId":30,"query":{"accentPhrases":[{"moras":[{"text":"キョ","consonant":"ky","consonantLength":0,"vowel":"o","vowelLength":0,"pitch":0},{"text":"オ","vowel":"o","vowelLength":0,"pitch":0},{"text":"ワ","consonant":"w","consonantLength":0,"vowel":"a","vowelLength":0,"pitch":0}],"accent":1,"isInterrogative":false},{"moras":[{"text":"イ","vowel":"i","vowelLength":0,"pitch":0},{"text":"イ","vowel":"i","vowelLength":0,"pitch":0}],"accent":1,"isInterrogative":false},{"moras":[{"text":"テ","consonant":"t","consonantLength":0,"vowel":"e","vowelLength":0,"pitch":0},{"text":"ン","vowel":"N","vowelLength":0,"pitch":0},{"text":"キ","consonant":"k","consonantLength":0,"vowel":"i","vowelLength":0,"pitch":0},{"text":"デ","consonant":"d","consonantLength":0,"vowel":"e","vowelLength":0,"pitch":0},{"text":"ス","consonant":"s","consonantLength":0,"vowel":"U","vowelLength":0,"pitch":0},{"text":"ネ","consonant":"n","consonantLength":0,"vowel":"e","vowelLength":0,"pitch":0}],"accent":1,"isInterrogative":false}],"speedScale":1,"pitchScale":0,"intonationScale":1,"volumeScale":1,"prePhonemeLength":0.1,"postPhonemeLength":0.1,"outputSamplingRate":44100,"outputStereo":false,"kana":""}}}}

このプロジェクトファイルは開発版でappVersion: 999.999.999になっていますが実際の製品版のプロジェクトファイルではappVersion0.14未満となるはずなので上のマイグレーション処理でエンジンがVOICEVOX版のものに変更されるはずです。

@shirowanisan
Copy link
Contributor

shirowanisan commented Aug 21, 2022

実際の製品版のプロジェクトファイルではappVersionが0.14未満となるはずなので上のマイグレーション処理でエンジンがVOICEVOX版のものに変更されるはずです。

すみません、試してみたら確かにそうでした!ご指摘ありがとうございます...!!!

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Aug 21, 2022

@shirowanisan

また、互換をなくすならば、これを機にプロジェクトファイルにキャラクターUUIDを含めた方が良いように思いました

なるほどです!!たしかに、speakerIdを保存しておくようにすると、将来的に良い気がしました。
いったんこのPRではFIXMEコメントを残すだけにしても良いでしょうか。
また、タスクリストにAudioItemにSpeakerIdを追加するを追加し、engineId, speakerId, styleIdで声を一意に定めようとする方針を追記しました!

いったんこんな感じでどうでしょうか 👀

@Hiroshiba
Copy link
Member Author

レビューありがとうございます、とても助かります!!
指摘いただいた箇所を修正or FIXME コメントを追記してみました。
また見て頂けるととても心強いです 🙇‍♂️

@shirowanisan
Copy link
Contributor

@Hiroshiba

なるほどです!!たしかに、speakerIdを保存しておくようにすると、将来的に良い気がしました。

設計方針確認しました。自分からはLGTMです…!!!

Copy link
Member

@Segu-g Segu-g left a comment

Choose a reason for hiding this comment

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

コードについてはLGTMです!

方針についてはstyleIdはその型がnumberである以上意図しない重複の可能性があるため、styleIdとは別にstyleごとに固有なUUIDのstyleUUIDを用いたいです。
プロジェクトファイルに保存するものは{ engineId, speakerUUID, styleUUID, styleVersion?} (生成される音声がcoreに依存するならengineIdはいらない) にしておきたいです。
エンジンのspeaker_infoに入っているstyleInfoには現在styleUUIDは入っていないので変更する必要がありますが、その他の変更はUI側でCharacterのStoreを作ることで吸収できます。

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Aug 22, 2022

@Segu-g
styleUuidが良い旨、おっしゃるとおりだと思います。
方針としては、Uuidがあるべき姿ということにして、そこを目指せると嬉しそうです。
(ということを設計方針.mdに追記しました!)

@Hiroshiba
Copy link
Member Author

@aoirint さん
おふたりからLGTM頂いたのでマージしたいなと考えているのですが、今レビュー中だったりされますか・・・?
(いったんマージしても大丈夫でしょうか👀)

@aoirint
Copy link
Member

aoirint commented Aug 22, 2022

コード量が多いのでレビューコメント保留のままレビュー中でしたが、

の点についてはすでに指摘と方針が決まったようなのでよさそうです!

@aoirint
Copy link
Member

aoirint commented Aug 22, 2022

engineId, speakerId, styleIdで声を一意に定めようとする方針

プロジェクトファイルが声を一意に定める上で、コアのバージョンによる音声の違いも考慮できるといいと思います。
#883 (review){ engineId, speakerUUID, styleUUID, styleVersion?}styleVersionを(オプショナルでも)保持しておく方法に同意です(styleVersionが現状のVOICEVOXにおいてコアのバージョンという意味であれば)。
古いコアのバージョンを持つプロジェクトファイルが新しいエディタで開かれたときにどうするか、古いコアを新しいエディタでも使えるように整備するのか、というような問題が発生して難しそうですが、少しずつ機能追加する形でも考慮できないかなと思いました!

@aoirint
Copy link
Member

aoirint commented Aug 22, 2022

キャラクター並び替えUIについて、現状でも、設定ファイルを維持したままVOICEVOXをダウングレードした場合に、キャラクター並び替えUIにエラーが表示されるという現象があります。

並び替えリストに登録済みのキャラクターをエディタが認識していない場合にエラーになる点、処理を追加するタスクを設けておくとよさそうです!

あまり互換性面で想定していない操作のダウングレードより、カジュアルにキャラクターの増減が起き得るようになりそうなので、問題になることを予想しています。

ちょっと古いログなので行数がずれていそうですが、このようなエラー:

[01:14:09.781] [error] TypeError: Cannot read properties of undefined (reading 'metas')
    at http://localhost:8080/js/webpack:/src/components/CharacterOrderDialog.vue?5229:106:39
    at Proxy.find (<anonymous>)
    at http://localhost:8080/js/webpack:/src/components/CharacterOrderDialog.vue?5229:104:37
    at Proxy.filter (<anonymous>)
    at _callee$ (http://localhost:8080/js/webpack:/src/components/CharacterOrderDialog.vue?5229:102:66)
    at tryCatch (http://localhost:8080/js/webpack:/node_modules/regenerator-runtime/runtime.js:63:15)
    at Generator.invoke [as _invoke] (http://localhost:8080/js/webpack:/node_modules/regenerator-runtime/runtime.js:293:1)
    at Generator.next (http://localhost:8080/js/webpack:/node_modules/regenerator-runtime/runtime.js:118:1)
    at fulfilled (http://localhost:8080/js/webpack:/node_modules/tslib/tslib.es6.js:71:42)

Copy link
Member

@aoirint aoirint left a comment

Choose a reason for hiding this comment

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

LGTM!! PR引き継いでいただいてありがとうございます・・・!

@Hiroshiba
Copy link
Member Author

styleVersion

僕もバージョンを持たせるのは賛成です!
複数エンジン対応時はマストじゃないなと思っていますが、せっかくなのでタスクリストに追加してみようと思います!

名称をどうすべきかちょっと悩みそうです。
ほしいのは音声バージョンであり、実装がstyleのバージョンになっている形で、「version」として持つのも良いのかなとか・・・。
(なんのバージョンかわかりづらいのが難しいですが・・・。)

@Hiroshiba
Copy link
Member Author

並び替えリストに登録済みのキャラクターをエディタが認識していない場合にエラーになる

こちら、↓にissueを作成し、それをタスクリストからも参照する感じにしてみました!

@Hiroshiba
Copy link
Member Author

マージします!! レビューありがとうございました!!!
そして複数エンジンの大量のタスクを解禁し、実装PRを大量に募集し始めたいと思います・・・!!!

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.

4 participants