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

feat!: liberate VOICEVOX CORE #825

Draft
wants to merge 29 commits into
base: main
Choose a base branch
from

Conversation

qryxip
Copy link
Member

@qryxip qryxip commented Aug 30, 2024

内容

  1. manifest.jsonの"…_filename"部分を変更し、.binを認識できるようにします。.binの場合、change: liberate VOICEVOX CORE ort#8で追加されるSessionBuilder::commit_from_vv_binを用います。

        "predict_duration": {
          "type": "onnx",
          "filename": "predict_duration.onnx"
        },
        "predict_intonation": {
          "type": "onnx",
          "filename": "predict_intonation.onnx"
        },
        "decode": {
          "type": "onnx",
          "filename": "decode.onnx"
        },
        "predict_duration": {
          "type": "vv-bin",
          "filename": "pd.bin"
        },
        "predict_intonation": {
          "type": "vv-bin",
          "filename": "pi.bin"
        },
        "decode": {
          "type": "vv-bin",
          "filename": "d.bin"
        },
  2. Onnxruntime::LIB_NAME"onnxruntime"から"voicevox_onnxruntime"にします。

    compatible_engineの場合だけ、"voicevox_onnxruntime"で失敗すると"onnxruntime"にフォールバックするようにしています。
    (モック目的で使えるように)

  3. change: liberate VOICEVOX CORE ort#8でログのフィルタリングをやめる代わりに、C APIのログフィルタのort=infoort=warnにします。

    (現行のONNX Runtime v1.17.3とsample.vvmだとログが大量に出てしまいました)

  4. build_and_deployのis_production周りを吹き飛ばします。

関連 Issue

Resolves VOICEVOX/voicevox_project#24.
Resolves #388.
Resolves #722.

その他

@qryxip
Copy link
Member Author

qryxip commented Aug 31, 2024

a5f009c (#825)
.binの呼び方をbinからvv-binとしました。

      "type": "vv-bin",

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.

draft状態ですけどちょっと見させていただきました!
コードは良さそう!!


製品版周りの扱いに関して相談があります!

VOICEVOXエンジンやエディタは、OSSリポジトリのreleasesで製品版をリリースしています。
コアも同じ感じにしていたのですが、このプルリクエストでis_productionフラグが消えて、一部製品版ではないものをビルドする方に倒されてるかもと感じました!

そのため製品版のonnxruntimeであるvoicevox_onnxruntimeを使っているけど、READMEは製品版のものに変えず、製品版のVVMのサポートが外れ、代わりにOSSサンプルのVVMがビルドされる形になっていそうです。
is_producrionフラグを消すのは賛成で、更に全部製品版に寄せるのが手っ取り早い気がしました。

この辺りは考え方いろいろあると思います!
とりあえずエンジンとエディターに合わせる感じとかどうかなと思い、その前提でちょっと色々コメントしてみました。

.github/workflows/build_and_deploy.yml Outdated Show resolved Hide resolved
Comment on lines 384 to 398
ASSET_NAME: model-${{ needs.config.outputs.version }}
ASSET_NAME: sample-model-${{ needs.config.outputs.version }}
steps:
- uses: actions/checkout@v4
- name: Checkout VOICEVOX FAT RESOURCE
if: inputs.is_production
uses: actions/checkout@v4
with:
repository: VOICEVOX/voicevox_fat_resource
ref: ${{ env.VOICEVOX_FAT_RESOURCE_VERSION }}
path: download/fat_resource
- name: Raplace resource
if: inputs.is_production
shell: bash
run:
rm -r ./model; mv download/fat_resource/core/model ./model
Copy link
Member

Choose a reason for hiding this comment

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

この変更によってダウンローダーが製品版のVVMをダウンロードできなくなるので、最新版のmainブランチを見て製品版のVVMを使う方法がわからなくなったかもです。
ちょっとどういう運用にするか迷いますが、とりあえずダウンローダーがダウンロードできるものは製品版のままにしておくのはどうでしょう。

(将来的にはVVM置き場を別で作ったりするのもアリ。全部ダウンロードすると重いし。)

Copy link
Member Author

Choose a reason for hiding this comment

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

#825 (comment)と重複しますが、このPRでダウンローダから直接voicevox_fat_resouceのファイルをダウンロードするようにすることを考えています。どうでしょうか?

Copy link
Member

@Hiroshiba Hiroshiba Sep 2, 2024

Choose a reason for hiding this comment

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

今の範囲でレビューしちゃったので、可能なら分けていただけると助かる思いはあります!
他にも理由は2つほどありそうでした。

  • このPRは製品版コアのパッチ取得を辞めることが主目的だと思うので、VVMダウンロード方法とは独立してる
  • fat_resourceの運用が定まっておらず、あとからどうせコア側の変更が必要になるかもしれない(fat_resourceのバージョン管理とか)

まあでもどうしてもそうしてほしいというレベルじゃないです。must/should/want/canのshouldから少しwant寄りくらい!

Copy link
Member Author

Choose a reason for hiding this comment

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

わかりました。このPRでダウンローダは手を付けないことにします。

Cargo.toml Outdated Show resolved Hide resolved
Comment on lines +101 to +104
pub(crate) enum ModelBytes {
Onnx(Vec<u8>),
VvBin(Vec<u8>),
}
Copy link
Member

Choose a reason for hiding this comment

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

(判断メモ)

enumで2つの種類のバイナリを想定するのではなく、別途typeを持っておく手もあると思うのですが、今のこの方法で問題ないと思いました!
こっちの方が管理しやすそうですし、いろんなところで型を判定しまくることもなさそうですし、フォークする場合はこのVvBin側を変えれば良いし!

Copy link
Member Author

@qryxip qryxip Sep 2, 2024

Choose a reason for hiding this comment

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

こうしている理由としてはどちらかというと、「OnnxVec<u8>」と「VvBinVec<u8>」が別個の役割を持っているからですね。TSだとしても{ type: "Onnx"; onnx: Uint8Array } | { type: "VvBin"; vvBin: Uint8Array; }にする…のはちょっと冗長かもしれませんが、Rustの直和型ならこれが綺麗かなと思った次第です。

ただmanifest.jsonの方のこっちはどうしましょうかね… こっちはJSONの{ "type": "onnx", "filename": "decode.onnx" }を表しますし、VVMのZIPからの読み込み時のこともあってtypeを分離させるメリットがあるんですよね…
(追記) もし分離させるんだったらRust的な観点からはtypeじゃなくてkindとでもしたいんですが、manifest.jsonに書く内容としては、うーん

#[derive(Deserialize, Clone)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub(crate) enum ModelFile {
    Onnx { filename: String },
    VvBin { filename: String },
}

Copy link
Member

@Hiroshiba Hiroshiba Sep 2, 2024

Choose a reason for hiding this comment

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

あ、manifest.jsonは現状PRのModelFileのままtypefilenameのキーをもたせるのが良さそうだと感じました!
(しっかりわかってないのでなにか変なこと言ってるかも)

Copy link
Member Author

Choose a reason for hiding this comment

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

#830 をマージしたときに若干つらみが出てきてしまったので、こうしてしまいました。

#[derive(Deserialize, Clone)]
pub(crate) struct ModelFile {
    pub(crate) r#type: ModelFileType,
    pub(crate) filename: Arc<str>,
}

#[derive(Deserialize, Clone, Copy)]
#[serde(rename_all = "snake_case")]
pub(crate) enum ModelFileType {
    Onnx,
    VvBin,
}

accb03f (#825)

Comment on lines +37 to +43
.or_else(|err| {
warn!("{err}");
warn!("falling back to `{alt_onnxruntime_filename}`");
voicevox_core::blocking::Onnxruntime::load_once()
.filename(alt_onnxruntime_filename)
.exec()
})
Copy link
Member

Choose a reason for hiding this comment

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

(ただのコメントです)
ここのフォールバックは将来必要なくなるかもですね!
まあまだ色々わからないけど。

@qryxip
Copy link
Member Author

qryxip commented Sep 4, 2024

  • 80345e5 (#825): 嘘コメントのリバート
  • 148fa5d (#825): ↑で修正したところのコメントに従い、install_name_toolsでのrpath変更をvoicevox_onnxruntime.framework宛てに

@qryxip
Copy link
Member Author

qryxip commented Sep 5, 2024

voicevox_onnxruntime自体の用意ができていませんが、多分時間がかかりそうであることを考えるとこのPRはさっさとマージした方がよいですかね?
(その場合 VOICEVOX/voicevox_project#24#388 のlinkを外した上でdraftを外します)

@Hiroshiba
Copy link
Member

@qryxip ちょっと迷いどころですが、 @qryxip さんの都合に合わせてマージしてもいいと思います!

というのも、多分このプルリクエストをマージすると、製品版をビルドしてもVVMがロードできなくなるんですよね~~
別に必ずビルドする必要はないと思うので問題はないのですが、ちょっと後ろ髪を引かれる部分があるなと。

ただこのプルリクエストがマージされていないと進められないタスクもあると思うので、マージするのに反対ではないです。
本当に都合次第だと思います。

まあもしmainブランチで製品版ビルドしたものが動かない状態が微妙というところでしたら、一旦projectブランチを作ってそちらにマージするとかはありかもです。
コンフリクトが発生していくので早くなんとかしたい気持ちもありますが。

ということで、ちょっと問題は生じそうです+とはいえ進めやすい方法でいいと思います、って感じです!

@qryxip
Copy link
Member Author

qryxip commented Sep 6, 2024

そうですね… このPRによってブロックされるというタスクは多分そんなに無い気がするので、draftのままでいいのかなと思ってます。ダウンローダーもVVMについては別で進められるかと。

(projectブランチも作らなくていいのではと思ってます。結局コンフリクト解消の手間をいつ取るのかという話になりそう。)

@qryxip qryxip changed the title change: liberate VOICEVOX CORE feat!: liberate VOICEVOX CORE Oct 14, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants