Skip to content

feat: 差分アップデートを追加 #2701

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

Open
wants to merge 46 commits into
base: main
Choose a base branch
from

Conversation

sevenc-nanashi
Copy link
Member

内容

差分アップデーターを追加します。

関連 Issue

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

(なし)

その他

(なし)

@sevenc-nanashi sevenc-nanashi requested a review from a team as a code owner July 7, 2025 07:11
@sevenc-nanashi sevenc-nanashi requested review from Hiroshiba and removed request for a team July 7, 2025 07:11
@voicevox-preview-pages
Copy link

voicevox-preview-pages bot commented Jul 7, 2025

🚀 プレビュー用ページを作成しました 🚀

更新時点でのコミットハッシュ:7624268

@sevenc-nanashi
Copy link
Member Author

メモ:

  • updateInfosを配信するサーバーを差し替える
    • 例:mkdir __gi_ui && https://voicevox.hiroshiba.jp/updateInfos.json -o __gi_ui/updateInfos.json && npx serve -l 3001 __gi_ui
  • このブランチをcheckoutする
  • nr electron:buildする
  • できたインストーラーを使って一旦インストールする(これはフルインストールになる)
  • package.jsonのバージョンを上げる
  • updateInfosを更新する
  • nr electron:buildする
  • npx serve ./dist_electron/nsis-webを立ち上げる
  • 最初にインストールしたVoicevoxを起動する
  • 差分アップデートされる(serveのログに206が出ていたら成功)

@sevenc-nanashi sevenc-nanashi marked this pull request as draft July 7, 2025 07:17
@@ -1,4 +1,4 @@
VITE_APP_NAME=voicevox
VITE_APP_NAME=voicevox-test
Copy link
Member Author

Choose a reason for hiding this comment

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

メモ:戻す

package.json Outdated
Comment on lines 2 to 3
"name": "voicevox-test",
"version": "0.24.8",
Copy link
Member Author

Choose a reason for hiding this comment

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

メモ:戻す

Copy link
Member Author

Choose a reason for hiding this comment

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

メモ:消す

@sevenc-nanashi sevenc-nanashi marked this pull request as ready for review July 11, 2025 14:12
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.

お!
リクエストをもらったけど、状況が分かっていないので、プルリクエストの内容変更をお願いします 🙏
とりあえずどういう状態が目標で、どういうのを実装したのか教えていただけると!

Copy link
Member Author

@sevenc-nanashi sevenc-nanashi left a comment

Choose a reason for hiding this comment

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

一通りできたのでDraft解除。

  • electron-updaterはこんな感じで動いています:
    • インストール時に7zを保存しておく
    • アップデートがあったら、変更されたファイルの分だけ取得して、保存しておいた7zと組み合わせる
      • 「アップデートがあったら」:特定の形式のyamlを配信する必要があります。
      • 「変更されたファイルの分だけ取得して」:HTTPの部分リクエストを飛ばしてます
    • インストーラーのpackage-file引数(7zのオーバーライド)を使って、組み合わせた7zをインストール
  • テストビルド:https://github.com/sevenc-nanashi/voicevox/releases/tag/999.0.0

考慮メモ:

  • OS、arch、デバイスを一位に特定できる文字列(target tuple的な)の仕様とかを雑でもいいので決めておく必要がありそう
    • 仮称:artifact
  • ファイル配信のサービスも考える必要がありそう
    • 部分リクエストに対応してる配信鯖の中で、1番手っ取り早いのはhuggingface、1番安定をとるならR2あたり?

@@ -53,7 +53,7 @@ jobs:
- artifact_name: linux-nvidia-prepackage
artifact_path: dist_electron/linux-unpacked
voicevox_engine_asset_name: linux-nvidia
package_name: voicevox
package_name: voicevox-test
Copy link
Member Author

Choose a reason for hiding this comment

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

メモ:ここら辺も戻す

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.

いろいろコメントしてみました!!!
まあ正直結構複雑度が上がるなーという印象です!
でも有意義だと思うので頑張りたい寄りです・・・!

ちなみにこれってMacとかってどうなるんでしたっけ。今のままだとエラーになる?
もしエラーになるなら、Windowsのみの機構にするんじゃなく、MacとかLinuxでも動くように頑張ると良い気もしました!

署名でエラーになるんだったらどうしようもないけど・・・。
いや、もういい加減Developer登録をする時期なのかもしれない・・・!!


インストーラー周りになるので、 @sabonerune さんのチェックの力も借りれるとすごい心強そう!!
もしお時間あればぜひ気になる所コメントいただければ!!! 🙇

Comment on lines +416 to +424
- name: Create app-update.yml
run: |
# prepackageを使うとapp-update.ymlが生成されないので、手動で作成する
cat <<YAML > ${{ matrix.app_asar_dir }}/app-update.yml
provider: generic
url: https://vv-update-api.sevenc7c.workers.dev/${{ matrix.installer_artifact_name }}
useMultipleRangeRequest: false
updaterCacheDirName: ${{ matrix.package_name }}-updater
YAML
Copy link
Member

Choose a reason for hiding this comment

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

ここはワークアラウンドって感じでしょうか?
これ、変更があった時に気づけなくて、結構バグになりやすそうな気がしました 😇

ちょっと大掛かりになっちゃうんですけれども、そもそもprepackageがもういらない気がしてきました。
prepackageを使わないようにしてここをなくす・・・というのはどうでしょう・・・?

ちょっとさすがにしんどすぎますかね・・・・? 🙇

(もしprepackageなくす場合、今のコードでprepackageなくしても問題ないかを @aoirint さんにもコメントいただけると心強そう。お忙しそうであれば僕と @sevenc-nanashi さんの判断だけで進んじゃって良さそう!)

Copy link
Member Author

Choose a reason for hiding this comment

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

ビルドフックでエンジン差し込みを行うって感じですかね?

Copy link
Member

Choose a reason for hiding this comment

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

よくわかってないのですが、そんな感じな気がしました!
まあどんな方法でも良さそうだけど、署名周りとか、コマンドの権限とか、気にしないといけないこといろいろありそう。

Copy link
Member

Choose a reason for hiding this comment

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

PRとしてはここどうするかも考えどころですねぇ。
どっちルート行きますかね・・・?

Copy link
Member Author

@sevenc-nanashi sevenc-nanashi Jul 13, 2025

Choose a reason for hiding this comment

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

今作業中ですが、そこそこ大きくなりそうなので一旦別PRにしたほうが良さそう。このPRでは変更しない(一旦prepackageのまま or 先にprepackageをやめるPRが完成してマージされたらそっち)みたいな感じで行こうと思います。

Copy link
Member

Choose a reason for hiding this comment

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

おお、失礼しました!!! お待ちしています!!

Copy link
Member

Choose a reason for hiding this comment

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

review request頂いたけど、ここどうしましょう?👀

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では変更しない(一旦prepackageのまま or 先にprepackageをやめるPRが完成してマージされたらそっち)みたいな感じで行こうと思います。

これの気持ちですね。一旦これでレビューしてもらえると...

Copy link
Member

Choose a reason for hiding this comment

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

なるほどです。
レビューは進めますが、たぶんこのプルリクはシステム変更が大きく、マージに凄まじい時間がかかるので、途中で別PRもらえると助かるかもです。

Copy link
Member

Choose a reason for hiding this comment

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

これも消す感じですかね

Copy link
Member Author

Choose a reason for hiding this comment

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

ですね。

@sevenc-nanashi
Copy link
Member Author

ちなみにこれってMacとかってどうなるんでしたっけ。今のままだとエラーになる?

ですね、Mac版でアップデートボタンを押すと死にます。
Linuxは対応済です。
Mac版も対応したいんですけど、自分がMacを持っていないので一旦パスしようかなと...

@Hiroshiba
Copy link
Member

ですね、Mac版でアップデートボタンを押すと死にます。

なるほどです! 死ぬのは良くない気がしますね。
ちょっと別で議論分けてコメントします!

@sevenc-nanashi
Copy link
Member Author

sevenc-nanashi commented Jul 12, 2025

メモ:今の状況です

  • latest.ymlをworkersに向けることによって、通常のインストール時の分割7zやiniもWorkerにリクエストが飛んでいってしまっているので、Hugging FaceになかったらGitHub Releasesに飛ばすみたいな機構も置いてあります
  • 本来はユーザーとWorkerの間に何か層を挟むとWorkers以外に乗り換えられるので望ましい(ドメインにマウントすれば解決するはず)
image

@sevenc-nanashi sevenc-nanashi requested a review from Hiroshiba July 13, 2025 08:36
@@ -1,4 +1,4 @@
VITE_APP_NAME=voicevox
VITE_APP_NAME=voicevox-test
Copy link
Member

@Hiroshiba Hiroshiba Jul 13, 2025

Choose a reason for hiding this comment

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

(ここに関係ないけど、議論分けたいのでここにコメントしました)

ちょっと相談です!!
かなりシステムが複雑化するのでどう進めようか迷っています。
例えばサーバーサイドのコードもこのリポジトリで管理するとか、projectブランチ作ってわりと途中な状態でもマージしやすくするとかを考えてます。

あるいは抜本的な解決策として、先にエンジン分離をやってしまえば、差分アプデがすごく簡単になる(githubのみで完結する)ことを思いつきました。
なので差分アプデを作り込んだときの恩恵は一時的でよく、そのためにサーバーを建てるのはかなり遠回りかもとか思いました。
huggingfaceとgithubのみで完結する形か、あるいは先にエンジン分離をやってしまうのはどうでしょうか…?

現状まだ考えきれてないですが、サーバー追加周りは考えることが山ほどあるなと思ってます。
例えばapi変更するときどうするのとか、セキュリティ的なのどうするのとか、ドキュメント書かないととか、ドメイン取らないととか、dev用サーバーどう建てようとか、単一情報源の法則どうしようとか(=blogへの依存を増やすのか)…。
あとはmacだけ解決してない(ダウンロード数見るにユーザー全体の2割くらいがmac)とかも考慮ポイントかも。

まああとで考えれば良いことが多いですが、であればもうエンジン分離してしまった方が早いんじゃないかと、ふと思ったのでコメントしてみました…。
自分の中でも結論でておらず、どうすべきかかなり悩んでいますが、サーバーを追加する場合サクッと実装するのが難しいのではと気づき始めていて、先にエンジン分離するのが丸いのかもと思い始めています🙇
以前と言ってること違ってたりしたらご指摘いただければ!!🙇

@sevenc-nanashi
Copy link
Member Author

sevenc-nanashi commented Jul 14, 2025

メモ:

  • latest.ymlのURLはフルURLを指定すればホストも変えられるので、cf workersは不要
  • エンジン分離しても大抵(特にUI)は使えるので今すぐやめるほど無駄なわけではない
  • Release Channelの機能を使えばエンジンのCPU/GPU周りもなんとかできるはず
    • エンジン分離し終えたら = エンジンのCPU/GPU周りが関係なくなったらエディタのチャンネルは1本になるけど、これって詰むのでは?
      • Release Channelを変える方法がない気がする
        • 記憶が正しければapp-update.ymlにchannel:キーが生える
        • ここらへんでlatest.ymlにフォールバックするようにすればOKかもしれない
        • 本体組み込みの本流に戻る機能は、allowPrereleaseがオンの時だけしかできないっぽい
          • 行儀悪いことを許容すれば:
            • 1行変えればpnpm patchで解決は可能
            • app-update.ymlを直にいじる手もある

@Hiroshiba
Copy link
Member

Hiroshiba commented Jul 14, 2025

Release Channelの機能を使えばエンジンのCPU/GPU周りもなんとかできるはず

いけそうだとわかったあと、実装する前に、この方法で進んだ時に問題がないのかをとりあえず1分くらい時間かけて考えると良さそうかもと感じました!
で1つやばいのが見つかったら、とりあえずその倍の時間かけて次の課題がないか考える感じ。
(まあまあやばいのが1分で見つかったなら、やばいのがまだありそうだという直感があるため)

たぶん、思いつく問題=アイデアは時間に相関する気がするので、かけた時間が重要なのかなぁと。
(vvppやマルチエンジンはここにあまり時間をかけなかったので、今その考えなかった時間の数倍~数十倍くらい苦労しているんじゃないかなという仮説)

直感思いついたのとしては、例えば

  • チャンネルをフォールバックするんだったらベースになるやつはリリースできないんじゃないか説
  • チャンネルは何を使うのが妥当なのか(CUDAやDirectMLなのかGPUなのか)考えないといけなさそう
  • 別のチャンネルに移動できるのかどうか
  • 開発用のを作るにはどうすればいいのか
  • URL(≒リポジトリ)をもし変えることがある場合どうすればいいのか(これはチャンネル関係なさそうだけど)
  • zip版どうなるのか(これもチャンネル関係なさそうだけど)
  • Hugging Face側が落ちてた場合どうなるのか

とか。
まだありそうなので、この辺りを考えを巡らせることになりそう。

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