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

VOICEVOXのLinux用実行バイナリを作る #218

Closed
Hiroshiba opened this issue Sep 11, 2021 · 17 comments · Fixed by #270
Closed

VOICEVOXのLinux用実行バイナリを作る #218

Hiroshiba opened this issue Sep 11, 2021 · 17 comments · Fixed by #270

Comments

@Hiroshiba
Copy link
Member

内容

VOICEVOXのコアライブラリが公開されました。 https://github.com/Hiroshiba/voicevox_core
これでLinux版のVOICEVOXを作成できるはずです。

このタスクは非常に長くなると思われます。
ちょっとでも取り掛かった方がいたら、ぜひコメントで知見ややり方を共有して頂けると・・・!

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

  • Linux
@aoirint
Copy link
Member

aoirint commented Sep 18, 2021

Linux版VOICEVOXの配布方法の候補は、zip配布、deb/rpm、PPA=Ubuntuの非公式パッケージリポジトリ、AppImage、snap、flatpakが考えられるかなと思っています。

Ubuntuを使っていてよく見るのはdebとAppImageです。rpmはCentOS, Red Hat Linux系におけるdebに相当するものだと思っています。
わたしは、どれも作成や特性の知見がないので、VOICEVOXでは使えないものもあるかもしれません。
debは、OSのパッケージマネージャを使う形と思います。
AppImageは、1つのファイルにライブラリや実行バイナリを格納し、./MyApp.AppImageのように実行する形です。

Electronの例だと、
atom/atomVSCodeはdeb/rpm、
laurent22/joplin はAppImageを採用しているようです。

@Hiroshiba
Copy link
Member Author

なるほどです! deb/rpmAppImageが良さそうですね。
electron-builderを見るに、どれでも選択できそうでした。
https://www.electron.build/index.html

個人的には、GUIを使うユーザーにとってわかりやすいものが良いかなと思っています。

@aoirint
Copy link
Member

aoirint commented Sep 23, 2021

AppImage で進める形で取り組んでみようかと思っています。

@aoirint
Copy link
Member

aoirint commented Sep 23, 2021

AppImage を選ぶ場合、配布の方法として、2つの候補を考えています。

  • AppImage にVOICEVOX フロントエンド(このリポジトリ)と、VOICEVOX ENGINEをまとめて、分割配布する
  • AppImage にはVOICEVOX フロントエンドの実行用バイナリのみを格納する。あとから追加で、圧縮分割されたVOICEVOX ENGINEをダウンロードする

@aoirint
Copy link
Member

aoirint commented Sep 23, 2021

deb を選ぶ場合、checkinstallを使って、Makefileから簡単にdebパッケージを作ることができるようです。

rpm も同じくcheckinstallを使って作成できそうです。

Makefile

#!/usr/bin/env make

.PHONY: all
all:
	mkdir -p build
	wget -O build/index.html https://www.example.com/

.PHONY: install
install:
	mkdir -p /opt/myexample
	cp -r build/* /opt/myexample

.PHONY: uninstall
uninstall:
	rm -rf /opt/myexample

.PHONY: clean
clean:
	rm -rf build/

debパッケージを作成するコマンド

sudo apt install checkinstall

make all

sudo checkinstall --install=no --fstrans=yes --pkgname=myexample --pkgversion=0.1.0

ls | grep .deb
# myexample_0.1.0-1_amd64.deb

make clean

sudo dpkg -i myexample_0.1.0-1_amd64.deb

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Sep 24, 2021

AppImage を選ぶ場合、配布の方法として、2つの候補を考えています。

ユーザーが1つだけ操作を行えばVOICEVOXが使えるようになるのが良いのかなと思っています。(windowsの場合はインストーラーのダブルクリック)
同じような形式にできれば、まとめて配布でも分割配布でもどちらも良いなと思いました。

@aoirint
Copy link
Member

aoirint commented Sep 24, 2021

AppImage にVOICEVOX ENGINEを同梱した形で配布できそうです( #265 を取り込めば run も実行できます)。

AppImageの場合、Release上では、7zで圧縮分割した状態で配布し、
ユーザ側で1つ1つダウンロードすることにはなるのかなと思っていますが、
ファイルをそろえて展開すれば、実行可能なAppImageファイルを取得できます。

もしくは、インストール用のスクリプトを用意することになるかな、と思っています。

アプリケーション一覧に登録するには、$HOME/.local/share/applicationsのようなディレクトリに
*.desktop ファイルを追加する必要があります。
しかし、Electron Builder 21以降は、そのような機能がないようなので、
VOICEVOX側で実装するか、インストールスクリプトが必要になるように思っています。

Since electron-builder 21 desktop integration is not a part of produced AppImage file. AppImageLauncher is the recommended way to integrate AppImages.

ちなみに、Ubuntu (20.04)では、p7zip-fullパッケージをインストールしておく必要はありますが、
GUI上(GNOME Archive Manager=File Roller)で7z圧縮分割ファイルの展開ができました。

voicevox_linux_cpu_7z_volume

@Hiroshiba
Copy link
Member Author

どういう配布形式が良いのか全く検討つかなくて判断が難しいですね・・・

一旦用意が簡単な方法で配布してみて、ツイッターなどで反応を確かめてもいいかなと思いました。
なので手っ取り早そうな方法でやってみるのはどうでしょう。
個人的にはなんとなく、 @aoirint さんの言及にあるインストールスクリプトの用意が簡単そうだなと感じました!

@aoirint
Copy link
Member

aoirint commented Sep 29, 2021

メモ

#270 で、Linux版VOICEVOX終了時 app.on("quit", ...) 、ENGINEのプロセスが終了されない問題が起きています。
AppImageだけでなく、npm run electron:serveでも発生します。

background.tspkrumins/node-tree-kill でプロセスキルする部分が関係していて、Linux・macOS上で問題が起きると思っています。

TreeKillは、 child_process.spawn を使って ps コマンドを実行し、
killすべきプロセスIDリストを取得する実装になっていますが、試したところ、
ChildProcessのコールバック ChildProcess.on("close", ...) が呼び出されず、
プロセスIDリストが返ってこないため、ENGINEのプロセスがkillされないという流れのように思いました。

子プロセスのkillが終わる前に親プロセスが停止しているのかもしれません。

Node.jsのリポジトリにも過去に似た問題が報告されていそうでしたが、同じ問題かはわかりません。

一応、tree-killのコードを書き換えて、child_process.spawn の代わりに child_process.spawnSync を使った同期実行にすると解消するようでした。

また、tree-kill の代わりに、 process.kill でENGINEのPIDをkillしても解決するのかなと思っていますが、孫プロセス(ENGINEの子プロセス)がkillできないということがあるのかな、とも思っています。

app.on("before-quit", ...)app.on("will-quit", ...) で停止処理をする方法もありそうです。

@Hiroshiba
Copy link
Member Author

報告ありがとうございます!
なるほど…プロセス周りのことはよく知らないのですが、マルチプラットフォームで同じように動く実装にしたいですね…

でもいい感じの方法が思いつかないので、ワークアラウンド的にwin以外の場合は普通にkillを実行しても良い気がしました。

@aoirint
Copy link
Member

aoirint commented Sep 29, 2021

ENGINEのプロセスが終了されない問題

#282 のパッチで解決すると思います。
Ubuntu・Windowsの npm run electron:serve で動作確認しています。

ENGINEのプロセスが終了するまでVOICEVOXのプロセス終了を待機させる方法( app.on("before-quit", ...)でENGINEプロセスの停止処理をする方法)で実装しています。

ログ出力まわりの整理 #280 、ENGINEのログを確認できるようにする #281 を合わせて送っています。

Hiroshiba pushed a commit that referenced this issue Oct 3, 2021
* add VOICEVOX_ENGINE_DIR env for electron-builder

* add linux electron-builder config

* add workflow

* pack VOICEVOX ENGINE

* fix workflow

* rm engine archive to free space

* name steps

* show disk space

* update voicevox engine run path for linux

* revert linux diff

* remove original engine after artifact build

* env check; empty string or undefined

* fail-fast false

* upload win unpacked

* stage build

* prepackaged

* fix prepackage

* add disk space disp

* merge nsis-web artifact

* engine-prepackage

* upload to release

* fix dir

* fix merge condition

* rename job; distributable

* fix engine copy

* fix matrix var name

* fix step name

* fix matrix var ref

* add fixme note to rename before upload to asset

* disable cpu build

* enable cpu engine prepackage

* build distributable only on release

* build on push master

* fix commented step name

* build on push main

* revert removeOriginalEngine diff

* temporary use Hiroshiba/voicevox_engine check-2021-09-25

* use env to define voicevox engine repo/ver

* use env directly (env cannot be used in matrix)

* add noengine-prepackage name and path in matrix

* windows build-workflow diff

* add linux appimage build config

* add linux matrix

* overwrite .env.production for linux

* appimage build

* upload linux appimage to release as splitted archives

* fix listing

* fix engine-prepackage artifact name

* split log

* recover file permissions before packaging to AppImage

* remove artifact dir layer in asset

* remove linux cpu asset

* fix recover file permissions

* impl upload-distributable-to-release

* generate public/licenses.json

* ci licenses.json

* mkdir

* engine

* Update build.yml

* npm ci

* license: use packageName if name is undefined

* revert packageName substitution

* skip uploading to release

* parentheses

* add comment

* env SKIP_UPLOADING_RELEASE_ASSET

* commonize os matrix

* temporarily upload splitted appimage to artifact

* fix indent

* add tar.gz artifact

* replace github.ref

* add size, hash in list

* change engine repo and version

* swap order

* add comment: tar.gz
@Hiroshiba
Copy link
Member Author

可能なら、tar.gz形式のvoicevoxバイナリもダブルクリックで実行可能にしたいところなのですが、ダブルクリックしても実行できない問題はそもそもどんな感じですか・・・?
もしライブラリのパスが見つからないためであれば、こちらのコメントでもしかしたら修正可能かもと思いました。
https://github.com/Hiroshiba/voicevox/pull/270#issuecomment-932898602

@aoirint
Copy link
Member

aoirint commented Oct 3, 2021

ライブラリのパスが見つからない

いえ、共有ライブラリではなく、Ubuntu(GNOME)のファイルエクスプローラであるNautilusの挙動が問題です。

ターミナルから実行すると、tar.gzから展開したVOICEVOXを起動することができます。

$ **/linux-nvidia-prepackage-targz/VOICEVOX/voicevox
[02:11:19.186] [info]  Starting ENGINE in GPU mode
[02:11:19.676] [error] Error: Failed to fetch Failed to fetch AudioQuery for the text "".
[02:11:19.683] [error] TypeError: Failed to fetch
[02:11:20.651] [info]  waiting engine...
[02:11:21.652] [info]  waiting engine...

...

ダブルクリックで実行しようとするには、わたしの環境(Ubuntu 20.04, GNOME nautilus 3.36.3)では、
以下のような準備が必要でした。

  • voicevoxファイルを右クリックする
  • ファイルを開く方法の選択ダイアログを開く
  • Run Softwareを選択する

その上で実行しようとすると、Nautilusのログに以下のように表示され、起動しませんでした。Electronのプロセスがそもそも立ち上がりません。なにかファイルシステムが仮想化されていそうです。

** (nautilus-autorun-software:***): WARNING **: ***: Unable to find device for URI: Containing mount for file /home/***/voicevox not found

*.desktopファイルをダブルクリックして実行するようにすることもできそうで、こちらが有力に思っているのですが、同じように起動しませんでした。

** (nautilus-autorun-software:***): WARNING **: ***: Unable to find device for URI: Containing mount for file /home/***/voicevox.desktop not found

Nautilusの*.desktopファイルの取り扱いや、実行ファイルのダブルクリック実行の挙動は安定していない印象があります。
Ubuntu 18.04では、*.desktopファイルのアイコンが表示されていて、ダブルクリック実行できたように思うのですが、Ubuntu 20.04にアップデートしてから表示されず、実行できなくなりました。

詳しく見ていませんが、いくつかIssueが立っています。

まだ調査が必要そうです。

Nautilusのログ確認用コマンド

killall nautilus
G_DEBUG="all" NAUTILUS_DEBUG="All" nautilus

@aoirint
Copy link
Member

aoirint commented Oct 3, 2021

デスクトップ($HOME/Desktop/)に*.desktopファイルをコピーした上で、右クリックメニューからAllow Launching を選択することで、ダブルクリックから起動できました。

04_04_10_2021_03_12_26

20 04_04_10_2021_03_12_12

[Desktop Entry]
Name=VOICEVOX
Exec=/path/***/voicevox/voicevox
Terminal=false
Type=Application
Icon=/path/***/voicevox/voicevox.png
StartupWMClass=VOICEVOX
Categories=AudioVideo;

ディレクトリから実行する方法はわかりません..(Run Softwareは上のコメントと同じ)

04_10_2021_03_15_56

@Hiroshiba
Copy link
Member Author

おーなるほどです!!!
ユーザー向けにどう案内しようか悩みますね・・・

確認なのですが、AppImageインストーラー版はアイコンをダブルクリックすることでVOICEVOXを起動可能、という認識で合っていますか?
であれば、一旦解決策がわかるまでインストーラー版だけ出して、tar.gz版はissueを建てて調査というのでも良いのかなと思った次第です。

@aoirint
Copy link
Member

aoirint commented Oct 4, 2021

AppImageインストーラー版はアイコンをダブルクリックすることでVOICEVOXを起動可能

はい、
AppImageインストーラ版は、アイコンの(シングル)クリックで起動可能です。

WIndowsのスタートメニューに相当する場所に登録されるので、そこから起動する形です。

ちなみにAppImage単体は、実行権限を与えれば、ファイルエクスプローラからダブルクリックで起動可能です。
いま気づきましたが、tar.gzでなくて、分割されていないAppImageの配布でもいいのかもしれません..
ただ、Artifactでは linux-{cpu,nvidia}-appimage ですが、CPU版のAppImageビルドは、Windowsに合わせてコメントアウトしています(コメントアウトを解除すれば動くと思います)。

@Hiroshiba
Copy link
Member Author

tar.gzでなくて、分割されていないAppImageの配布でもいいのかも

確かに!! それが一番手っ取り早い上にユーザーにとってもわかりやすい気がしました。

CPU版のAppImageもせっかくなので作っておくと喜ばれそうだと思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants