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

Ubuntu 22.04 LTSのFcitx5 + Mozc環境で、日本語入力ができない #1237

Closed
1 of 3 tasks
kledgeb opened this issue Feb 27, 2023 · 17 comments · Fixed by #1611
Closed
1 of 3 tasks

Ubuntu 22.04 LTSのFcitx5 + Mozc環境で、日本語入力ができない #1237

kledgeb opened this issue Feb 27, 2023 · 17 comments · Fixed by #1611

Comments

@kledgeb
Copy link

kledgeb commented Feb 27, 2023

不具合の内容

Ubuntu 22.04 LTSのFcitx5 + Mozc環境で、日本語入力ができません。

現象・ログ

端末から VOICEVOX 0.14.5 を起動すると、以下の警告が出力されます。
Fcitx5のライブラリーが読み込めていないようです。

(voicevox:8996): Gtk-WARNING **: 21:55:53.592: /tmp/.mount_VOICEV3zQRsD/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules/im-fcitx5.so)

(voicevox:8996): Gtk-WARNING **: 21:55:53.615: Loading IM context type 'fcitx' failed

再現手順

1.Ubuntu 22.04 LTSをインストール
2.「fcitx5-mozc」パッケージをインストール
3.「言語サポート」を起動し、「キーボード入力に使うIMシステム」を「Fcitx 5」に切り替える
4.ログインし直す
5.「Fcitxの設定」を起動し、登録されている入力メソッドが「キーボードレイアウト」「Mozc」の順に登録されていることを確認する
->キーボードに標準的な日本語キーボードを利用しているため、ここではキーボードレイアウトに「キーボード - 日本語」を登録しています。
6.「VOICEVOX 0.14.5」を起動する
7.半角/全角キー等で入力メソッドを「Mozc」に切り替える
8.「VOICEVOX 0.14.5」で日本語を入力する

期待動作

「Mozc」経由で日本語を入力できる

VOICEVOXのバージョン

0.14.5
(VOICEVOX-CPU.Installer.0.14.5.Linux.sh経由でインストールしています。)

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

  • Windows
  • macOS
  • Linux

OS:Ubuntu 22.04 LTS
インプットメソッドフレームワーク:Fcitx5
インプットメソッド:Mozc(fcitx5-mozc)

その他

1.同環境でも「VOICEVOX 0.13.4」で日本語入力できることを確認しています。
2.「VOICEVOX 0.14.5」以外の「VOICEVOX 0.14.x」系のバージョンは未確認です。
3.同環境でもテキストエディターやFirefoxで日本語入力できることを確認しています。
4.同環境でもインプットメソッドフレームワークを「IBus」に切り替えた場合は、日本語入力できることを確認しています。

ところで「VOICEVOX 0.13.4」のLinux向けインストーラーの再ダウンロードは可能でしょうか。
Releasesに見当たらなかったため、もし再ダウンロード可能なら助かります。

@Hiroshiba
Copy link
Member

報告ありがとうございます!
0.13.4と0.14.5に含まれる差分のどこかが影響しているんだろうなと思いました。

ところで「VOICEVOX 0.13.4」のLinux向けインストーラーの再ダウンロードは可能でしょうか。

一応可能です!
Linux版インストーラーをダウンロードして頂き、そのスクリプトファイルを開くと仕組みがわかると思います。
バージョン指定しているので、そこに0.13.4を指定すればたぶん動くはずです。

@kledgeb
Copy link
Author

kledgeb commented Feb 27, 2023

お忙しいところご回答有り難うございます。
ご提案頂いた方法で無事「VOICEVOX 0.13.4」へダウングレードできました。

またLinux向けにも素晴らしいソフトウェアを提供して頂きありがとうございます。
おかげさまで楽しみが増えました。

@Hiroshiba
Copy link
Member

Hiroshiba commented Feb 27, 2023

よかったです!

しかし日本語入力できないのは、対策できないとずっとそのままになってしまうかもですね。
Linux環境で使われる方は少ないのでどうしても対処が遅れそうです。

@kledgeb さん自身で解決策を探してみるというのはどうでしょう 👀
もしそれは難しそうであれば、こちらのissueは一旦どうしようもできないということでcloseになるかなと思います。

@Hiroshiba
Copy link
Member

@kledgeb たびたびすみません!!
もしかしたらLinux版のビルドがubuntu18で行われていることが原因かもしれません。

原因の切り分けのために、もしよかったら @kledgeb さんの環境で、最新版のVOICEVOXをご自身で動かしてみて頂けないでしょうか 🙇
開発環境の構築はこちらにあります。不明な点などあれば聞いて頂ければ・・・ 🙇
https://github.com/VOICEVOX/voicevox/tree/2c4d7a673def0cf65c0602600a02140f20169688#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89

@kledgeb
Copy link
Author

kledgeb commented Feb 28, 2023

返信有り難うございます。
現状調べた内容を紹介します。

直接的な原因

本現象の直接的な原因は、VOICEVOXが同梱しているlibstdc++.so.6が、Ubuntu 22.04 LTSのFcitx5が要求するlibstdc++.so.6のバージョンよりも古いことです。

VOICEVOXではVOICEVOX 0.14.0からlibstdc++.so.6が同梱されるようになっています。
そのためVOICEVOX 0.14.0以降、VOICEVOXに同梱されているlibstdc++.so.6が使用されるようになりました。

VOICEVOX 0.13.4ではlibstdc++.so.6が同梱されておらず、Fcitx5はOS側のlibstdc++.so.6を参照しているため、この現象が発生していませんでした。

VOICEVOX 0.14.5でもtar.gz(CPU)版を展開し、同梱されているlibstdc++.so.6を削除してから VOICEVOXを起動すれば、OS側のlibstdc++.so.6を参照するようになるため日本語入力が可能です。
(ただしこの状態でセリフの日本語入力とキャラクターによる読み上げが可能なことは確認しましたが、GPU版やVOICEVOXが提供するすべての機能が問題なく動作するかどうかは未検証です。)

というわけで

VOICEVOXの要件としてlibstdc++.so.6の同梱が必須であり、そしてlibstdc++.so.6のバージョンアップができないのであれば、この問題の解消は難しいように思います。
またこの点はVOICEVOXのOSのサポート方針や機能要件などプロジェクトの方針が絡むため、これ以上のお力添えできそうにないです。
ですので本件はCloseして頂けたらと思います。

GLIBCXX_3.4.29の対応状況

Ubuntu 22.04 LTSのFcitx5は、GLIBCXX_3.4.29に対応したlibstdc++.so.6を要求しています。
以下の環境でlibstdc++.so.6GLIBCXX_3.4.29の対応状況を確認しました。

VOICEVOX 0.14.5に同梱されているlibstdc++.so.6

GLIBCXX_3.4.29に対応していない

$ strings ./libstdc++.so.6 | grep GLIBCXX

・・・(省略)・・・
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH

Ubuntu 20.04 LTSが提供するlibstdc++.so.6

GLIBCXX_3.4.29に対応していない

$ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

・・・(省略)・・・
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH

Ubuntu 22.04 LTSが提供するlibstdc++.so.6

GLIBCXX_3.4.29に対応している

$ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

・・・(省略)・・・
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30
GLIBCXX_DEBUG_MESSAGE_LENGTH

その他

さて本件に遭遇しているユーザーがこの問題を回避したい場合、インプットメソッドフレームワークでIBusを利用すれば、この問題を回避できます。
現在UbuntuはデフォルトのインプットメソッドフレームワークにIBusを採用しています。
そのためユーザーが明示的にFcitx5を利用しない限り本件に遭遇することはなく、本件による影響としては軽微だと思います。

またVOICEVOXのビルドに関してですが、VOICEVOXが同梱しているlibstdc++.so.6に起因する問題であるため、こちらでビルドしても同じ原因に辿り着くことが想定されます。
ですのでビルド作業は保留にしております。
もしビルド作業の中で役に立つ情報を提供できるならビルド環境を準備致しますが、いかが致しましょう?

@Hiroshiba
Copy link
Member

Hiroshiba commented Feb 28, 2023

詳細ありがとうございます!!!!!
なるほどです、依存しているものが増えてそれが古いという感じなんですね!!

対応状況の一覧化も非常に助かります。
こちらのissueにもある通り、ubuntu18→ubuntu20のビルド環境移行は検討されているのですが、これでもGLIBCXX_3.4.29に対応しなくて結局直らない可能性が高そうですね・・・。

ビルド環境に関しての申し出もありがとうございます!
おそらく「やっぱ対応してないな」ということを確かめられるとは思いますが、解決には至らない気がしますね・・・。

VOICEVOXにとって一番良いのは、(Github Actionsの)ubuntu20環境でビルドしつつ、GLIBCXX_3.4.29入りのlibstdc++.so.6を同梱することかなと思いました。
ググった感じ、自前でlibstdc++.so.6をビルドする必要がある感じでしょうか・・・ 😇
なにか良い方法ご存知ないでしょうか。。 (もしよかったら @aoirint さんからも意見頂けると助かります 🙇‍♂️ )

あ! あと同じ現象になりそうな方の数もなんとなくで良いのでご存知でしたら知りたいかもです。
Fcitx5 + Mozcがメジャーなのであれば、優先度も上げるべきかなと思った次第です。

@aoirint
Copy link
Member

aoirint commented Mar 1, 2023

VOICEVOX 0.13.4ではlibstdc++.so.6が同梱されておらず、Fcitx5はOS側のlibstdc++.so.6を参照している

とのことなので、

0.13.4と0.14.5に含まれる差分

を調べて、libstdc++がビルドのどの段階で入り込むようになったか調査したいですね

影響しそうなのはこのあたりでしょうか...

  • コアのRust化
  • エンジンのPyInstaller化
  • エディタのElectronアップデート
  • コア・エンジン・エディタ間でビルドに使用するOSバージョンがずれている

OS側のlibstdc++が使われるのが0.13までの期待された動作(OSに同梱されているlibstdc++のバージョンをもとにOS間互換性を考慮していた)だったと思います。

コアとエンジンとエディタが同じディレクトリにあるので、コアやエンジンのためのlibstdc++をElectronが読み込んでいる可能性があるかもです。GLIBCXXを見る感じ、Ubuntu 20.04由来のlibstdc++.so.6のようなので、エンジン以前から来ていそうな気がしました。0.14のエディタはアップデート作業が追いついておらず、Ubuntu 18.04でビルドされていると思います。

GLIBCXX_3.4.29入りのlibstdc++.so.6を同梱する

libstdc++のビルドは知見がないですね...。

Ubuntu 20.04, Ubuntu 22.04間で最低動作バージョン(GLIBCXX)が同じであれば、libstdc++.so.6だけUbuntu 22.04からもらってくるのが簡単な気はします(いまもUbuntu 18.04/20.04からビルド時にもらってきているはずなので)。

もしくは、22.04用に別バージョンのVOICEVOXを配布する手もありそうです。


Fcitx5 + Mozcがメジャーなのであれば

個人の経験的には、snapという(リリースの速い)パッケージマネージャでインストールしたGUIアプリケーションの日本語入力が、デフォルトのIBus + Mozcでできないことがあり、その対策で好みとは別にFcitx + Mozcを使うことはあった気がします(このIssueとは逆の状況)。Fcitx5がFcitxの後継であれば、同じ状況になる人はいるかもです。(個人的には、GUIアプリケーションをsnapでインストールしないようにして、IBus + Mozcを使い続けています)

@kledgeb
Copy link
Author

kledgeb commented Mar 1, 2023

ビルド

以下の環境でビルドしてみました。
結論は「5. テストと確認」をご確認ください。

ビルドに使用したOS:Ubuntu 20.04 LTS

1. Node.js 16.17.0のインストール

$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash

$ nvm install 16.17.0

$ node -v
v16.17.0

2. ソースコードの入手とnpm ciの実行

$ git clone https://github.com/VOICEVOX/voicevox.git

$ cd voicevox

$ npm ci

3. .envファイルの準備

.env.productionファイルをコピーして.envファイルを作成後、
executionFilePath"/home/ubuntu/VOICEVOX_0.14.5/run"に修正

※ VOICEVOXビルド後に、修正した.envファイルがAppImage内の.envファイルに反映されなかったため、.env.productionファイルにも同じ修正を行いました。

4. ビルド

$ npm run electron:serve
$ npm run electron:build

5. テストと確認

さて出来上がったvoicevox/dist_electron/VOICEVOX-999.999.999.AppImageイメージですが、libstdc++.so.6が含まれていませんでした。
上記で報告した環境にこのAppImageをコピーし、VOICEVOX起動したところ、日本語入力できました。

しかしVOICEVOX 0.14.5 CPUと今回作成したビルド版のファイル構成を比較すると、大幅にファイル構成が異なっています。

何かビルド手順が足りていないような気がします。
とりあえずここまでの確認ですが、何か必要な情報や確認事項はありますでしょうか?
手順の誤り等ございましたら、コメント頂ければと思います。


なにか良い方法ご存知ないでしょうか。

libstdc++.so.6の同梱が必須であるとの前提ですと、自前か拾ってくるぐらいしか思いつきません。
後はSnapのようなアプリケーションコンテナへの移行でしょうか。
他の方からのご意見も伺いたいところです。

あと同じ現象になりそうな方の数

私見ですがUbuntu 22.04 LTSFcitx5を利用しているユーザーは特別多いようには感じません。
さすがにユーザー数までは分かりませんが、本件による影響は軽微であるとの印象です。
(本件はこのままCloseでも良いと思っております。)


OS側のlibstdc++が使われるのが0.13までの期待された動作

VOICEVOXの要件としてlibstdc++.so.6の同梱が必須でなければ、この方針が望ましいと思います。
今回たまたまFcitx5でこの現象が起きましたが、今後のことも考えるとlibstdc++.so.6を同梱しない方が今回のようなリスクを回避できると思います。

@Hiroshiba
Copy link
Member

Hiroshiba commented Mar 1, 2023

なるほどです!!

@kledgeb ビルドお試しありがとうございます!!
おそらくエディタのみがビルドされ、エンジンが同梱されていない状況だと思います。
となるとつまり、 @aoirint さんの仰るとおりエディタは原因ではなくエンジンがlibstdc++.so.6を召喚していそうですね!!
(コアはたしかonnxruntime.soくらいしか同梱していないため)

ちなみにエンジンはこちらでダウンロードできます。
linux版のものを展開して全ファイルを同じディレクトリに配置すればおそらくVOICEVOXが動くと思います。
https://github.com/VOICEVOX/voicevox_engine/releases

Fcitx5 + Mozcがメジャーなのであれば

こちらに関してもありがとうございます!すごく多いというわけではたぶん無い、という感じなのかなと思いました。
簡単に取れる対策なら取りたいところですね・・・。libstdc++.so.6が誰からも依存されてなさそうなら、消しちゃっても良いのかも・・・?

@madosuki
Copy link
Contributor

madosuki commented Mar 1, 2023

https://pyinstaller.org/en/stable/usage.html#making-gnu-linux-apps-forward-compatible

ビルドスクリプト見ても変なところは無いので、libstdc++.so.6を同梱しているのは多分PyInstaller?

@Hiroshiba
Copy link
Member

なるほどです!! PyInstaller側で議論がありました。 pyinstaller/pyinstaller#6998

ドキュメントにも記載されていました。
消したら望みのものは動くかもだけど、別の依存が壊れるかもしれません、的な感じですかねぇ。
https://pyinstaller.org/en/stable/usage.html#making-gnu-linux-apps-forward-compatible

@sabonerune
Copy link
Contributor

動的ライブラリのロードの仕組みについて(特にLinuxを所有していないため)あまり詳しくはないのですがPyinstallerのライブラリが混ざってしまうことが原因ならエンジンを別のディレクトリにしてしまえばいいような気がします。

現在は同じディレクトリにエンジンをそのまま展開してしまっているのですが新しくengineデイレクトリを作ってその中にエンジンのファイルを展開するような感じです。

@kkai1010
Copy link

kkai1010 commented Aug 12, 2023

こんにちは、できないと思いましたがlibstdc++.so.6を削除した結果、日本語を打てるようになりました!すべての機能も使えます(今は)

@LirimSakura
Copy link

こんにちは。ほぼ同環境で同現象が出ていて調べてたらこのissueにたどり着きました。

libstdc++.so.6 を削除

という同じ回避方法で動作確認しました。(cpu版 〜tar.gz を使用)

  • fcitx5+mozc環境
    ibus+mozcで使ってましたが、2022年終わりごろに日本語入力に切り替えると初期状態が直接入力になる仕様になって
    使いにくくなったので、fcitx5に切り替えました。
    同じ理由でfcitx5の組み合わせに変えた人はもしかしたらいるかもしれないです。

  • 原因はpyinstallerによる?
    試しにエンジン側をモックビルドしてみたのですが、こちらの環境ではbuildされた中にはsoファイルは無しでした。
    配布用のビルド方法ともしかしたら違うのかもですが。

sakura@nadesico64:~/development/voicevox_engine/build/run$ ls
Analysis-00.toc  COLLECT-00.toc  EXE-00.toc  PKG-00.toc  PYZ-00.pyz  PYZ-00.toc  base_library.zip  localpycs  run  run.pkg  warn-run.txt  xref-run.html

デフォルトでは必要なライブラリがバンドルされると書かれているので、
もとの状態を確認してから、specファイルに追記して試してみようと思ったのですが、もとの状態からsoファイル無しだったので確認できず。
https://pyinstaller.org/en/stable/spec-files.html#posix-specific-options

  a = Analysis(...)
  a.exclude_system_libraries()

@Hiroshiba
Copy link
Member

Hiroshiba commented Oct 1, 2023

@LirimSakura ご報告ありがとうございます!!
エンジンのみのビルド結果はこちらにあります。
https://github.com/VOICEVOX/voicevox_engine/releases/tag/0.14.5
このlinux版に含まれていなければ、エンジンビルドの後のビルド(つまりエディターのビルド)の可能性が高いのかもと思いました!

@LirimSakura
Copy link

@Hiroshiba
エンジンのみのビルド結果のzip解凍した中にはsoファイル含まれていたので、
GitHub Actionsのworkflow眺めてみました。

前回のコメントで 〜/build/run 以下には無かったから…と書いていたのですが、
配布物に含まれるファイル群は、〜/dist/run の物でした。

あらためてモックビルドで確認してみたところ、
次のようにexclude_system_libraries を追記すればシステムライブラリ含まれなくなりました。

…でもこれが正解かというと微妙なところですね。
同梱されなくなったライブラリを入れてない環境だと、不足で動かなくなったりしそうですし。
その点だとエンジンだけ別ディレクトリにしてっていうのが安全かもしれないです。

  • ビルド後 dist/run の中身
sakura@nadesico64:~/development/voicevox_engine/dist/run$ ls
_cffi_backend.cpython-311-x86_64-linux-gnu.so  libffi.so.8                              libssl.so.3        pydantic
base_library.zip                               libgcc_s.so.1                            libstdc++.so.6     pyopenjtalk
default.csv                                    libgfortran-040039e1.so.5.0.0            libtinfo.so.6      pyworld
default_setting.yml                            liblzma.so.5                             libuuid.so.1       pyworld-0.3.4.dist-info
engine_manifest.json                           libogg.so.0                              libvorbis.so.0     run
engine_manifest_assets                         libopenblas64_p-r0-5007b62f.3.23.dev.so  libvorbisenc.so.2  soxr
importlib_metadata-6.8.0.dist-info             libopus.so.0                             libz.so.1          speaker_info
lib-dynload                                    libpython3.11.so.1.0                     licenses.json      ui_template
libFLAC.so.8                                   libquadmath-96973f99.so.0.0.0            markupsafe         yaml
libbz2.so.1.0                                  libreadline.so.8                         numpy
libcrypto.so.3                                 libsndfile.so.1                          presets.yaml
  • run.specにa.exclude_system_libraries() を入れてビルドしたとき
sakura@nadesico64:~/development/voicevox_engine/dist/run$ ls
_cffi_backend.cpython-311-x86_64-linux-gnu.so  lib-dynload                              numpy                    soxr
base_library.zip                               libgfortran-040039e1.so.5.0.0            presets.yaml             speaker_info
default.csv                                    libopenblas64_p-r0-5007b62f.3.23.dev.so  pydantic                 ui_template
default_setting.yml                            libpython3.11.so.1.0                     pyopenjtalk              yaml
engine_manifest.json                           libquadmath-96973f99.so.0.0.0            pyworld
engine_manifest_assets                         licenses.json                            pyworld-0.3.4.dist-info
importlib_metadata-6.8.0.dist-info             markupsafe                               run

@Hiroshiba
Copy link
Member

@LirimSakura おおお!!詳細にありがとうございます!!

次のようにexclude_system_libraries を追記すればシステムライブラリ含まれなくなりました。
…でもこれが正解かというと微妙なところですね。

ものすごく同感です。ファイルリストを眺めていましたが、かなりいろんな依存が消えるんですねぇ。
逆にシステムに入っているもののバージョンが古い・新しいとかでボイボ側が動かなくなることも有り得そうかもですね・・・。

ディレクトリ分けが丸そうですね!!!

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.

7 participants