VOICEVOX / voicevox_core

無料で使える中品質なテキスト読み上げソフトウェア、VOICEVOXのコア
https://voicevox.hiroshiba.jp/
MIT License
844 stars 114 forks source link

iOS版でApp Storeにサブミットすると問題がありと指摘され受取拒否される。 #715

Open nekomimimi opened 7 months ago

nekomimimi commented 7 months ago

不具合の内容

手元で動いてるVOICEVOXライブラリを含んだiOS版アプリをApp StoreにサブミットするとUploadが完了するがその後、 ITMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it. と指摘があり受取を拒否される。

環境

voicevox_core: 0.15.0-preview.16 (voicevox_core-ios-xcframework-cpu-0.15.0-preview.16.zip) onixruntime: 1.14.1 (onnxruntime-ios-xcframework-1.14.1.zip) Xcode Version 15.1 (15C65) MacOS Sonoma 14.1.1

現象・ログ

スクリーンショット 2023-12-28 0 08 00

再現手順

新規プロジェクトを作り正常にサブミットできることを試した後に再度サブミットし、上記エラーを受ける手順となります。 AppleのDeveloperのアカウントがあり証明書が設定されているStoreへアプリをサブミットできる環境の下で、以下の手順で再現します。 ①XCodeで新規プロジェクトを作る。 ②App Store Connect側にプロジェクトと同じBundle Identifierのアプリ情報を登録する。 ③適当にAssetsにアイコン、プロジェクトのTargetのGeneralのDisplay Name(アイコン下の名前)を適当に設定する。(最低限ストアーへのサブミットを通すため) ④リリース用にAny iOS Device(Arm64)などに向けてArchive。 ⑤OrganizerのArchivesから今回のアプリを選んでDistribute AppをするとバイナリーをApple側で受け取ってくれる。メールでcompleted processingが来るのでこれを確認。 ⑥Onnix runtimeを追加する。 プロジェクトのTargetのGeneralのFrameworks, Libraries, and Embedded Contentから + をおしてonnxruntime.xcframeworkのファイルを追加。(onnixruntimeがembedでsignedになるはず。) ⑦再度、④⑤のアーカイブとサブミットを行うと、今度はUploadは成功するが、後ほどメールでITMS-90426: Invalid Swift Supportと通知があり受取拒否される。 (voicevox_coreも確認が必要ですがとりあえずonnxruntimeだけを試しています。)

期待動作

AppleのApp Storeでバイナリーを正常に受領される。

VOICEVOXのバージョン

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

iOS 17.1.2

その他

原因はiOSの onnxruntime.xcframework voicevox_core.xcframework にダイナミックライブラリーを含んでいるためと推測しています。

公式ドキュメントでは以下のように書かれています。 https://developer.apple.com/documentation/xcode/creating-a-multi-platform-binary-framework-bundle

Avoid using dynamic library files (.dylib files) for dynamic linking. An XCFramework can include dynamic library files, but only macOS supports these libraries for dynamic linking. Dynamic linking on iOS, watchOS, and tvOS requires the XCFramework to contain .framework bundles. (翻訳 - .dylib ファイルをダイナミックリンキングに使用しないでください。XCFramework には .dylib ファイルを含めることができますが、ダイナミックリンキングにこれらのライブラリをサポートしているのは macOS のみです。iOS、watchOS、および tvOS でのダイナミックリンキングには、XCFramework が .framework バンドルを含んでいる必要があります。)

これは、ゲームエンジンのGodot Engineで同じ文言の同じ事象があったようです。 https://github.com/godotengine/godot/issues/86224

nekomimimi commented 7 months ago

回避策

以下のように回避できましたので、ご参考まで。

方針

xcframeworkの中に、ios-arm64-simulatorとios-arm64のframworkをぞれぞれ作りその中にダイナミックライブラリを入れる。

このURLの通り。 https://stackoverflow.com/questions/53818772/embedding-a-dylib-inside-a-framework-for-ios/62962630#62962630

方法例

空のframeworkを作りダイナミックライブラリを上書きし、それをxcframework化します。

1.空のフレームワークの作成

onnixrunntimeなどの名前で空のframeworkのprojectを作って、TargetのGeneralのMinimum Deploymentをonnixruntimeでは16.0、voicevox_coreでは16.2とする。 ios-arm64-simulatorとios-arm64の2つをBuild。

2.ダイナミックライブラリ名の変更

libonnxruntime.1.14.0.dylibの名前を1.に合わせてonnxruntimeとしたいので、

lipo -create libonnxruntime.1.14.0.dylib -output onnxruntime

としてframeworkを上書き。

3.xcframeworkにする

ios-arm64-simulatorとios-arm64をくっつける。

xcodebuild \
-create-xcframework \
-framework Release-iphoneos/onnxruntime.framework  \
-framework Release-iphonesimulator/onnxruntime.framework  \
-output outuput/onnixruntime.xcframework

などとする。

4.rpathの変更

今の自分自身のrpathが@rpath/libonnxruntime.1.14.0.dylibとなっていて見つからないので 今回の環境に合わせて変更する。

install_name_tool -id "@rpath/onnxruntime.framework/onnxruntime" onnixruntime.xcframework/ios-arm64/onnxruntime.framework/onnxruntime

install_name_tool -id "@rpath/onnxruntime.framework/onnxruntime" onnixruntime.xcframework/ios-arm64-simulator/onnxruntime.framework/onnxruntime 

voicevox_coreも1.〜4と同様にする。

5.voicevox_coreの依存のrpathの変更

加えて、voicevox_coreはonnxruntimeに依存しているので、それを見つけるためrpathも変更する。

install_name_tool -change "@rpath/libonnxruntime.1.14.0.dylib" "@rpath/onnxruntime.framework/onnxruntime" voicevox_core.xcframework/ios-arm64/voicevox_core.framework/voicevox_core 

install_name_tool -change "@rpath/libonnxruntime.1.14.0.dylib" "@rpath/onnxruntime.framework/onnxruntime" voicevox_core.xcframework/ios-arm64_x86_64-simulator/voicevox_core.framework/voicevox_core
Hiroshiba commented 7 months ago

詳細なissue作成とコメントありがとうございます!!! ちょっとちゃんとつかめてないのですが、dylibではなくframeworkにしてからxcframeworkに含める必要があったんですね!!

ちなみにビルドもOSSで管理しているので、どのようなビルドコードになっているかは見れたりします。

onnxruntimeのxcframeworkのビルド箇所はこちらです。 https://github.com/VOICEVOX/onnxruntime-builder/blob/e4e26e437fd9dba1b33ac1927181b41d71fed9ce/.github/workflows/build.yml#L216

voicevox_coreのxcframeworkのビルド箇所はこちら。 https://github.com/VOICEVOX/voicevox_core/blob/ca7b00a6f23e780d1a6e1e86f743dfca1aeaf2e4/.github/workflows/build_and_deploy.yml#L359

見た感じの雰囲気的に、ちょっとコードを足せばよさそう・・・・・・・・・・? (ちゃんと精査できてないですが。。。)

nekomimimi commented 7 months ago

workflowが何一つわからないので、年内、直せそうかを試してみて、無理そうだったらgive upします〜。

Hiroshiba commented 7 months ago

おお!!チャレンジしてくださるの嬉しいです!! とりあえずworkflowを回してビルドチェックするのは、Forkしたリポジトリ内で、Actionsを許可した後、Actionsタブへ行き、左からbuild and deploy workflowを選んで、右のRun workflowを押して、ブランチを選べばできると思います! 不明な点があればなんでも聞いていただければ!

nekomimimi commented 7 months ago

大体上の説明で理解しました。ありがとうございます! 作成してみたいと思います。

2点質問があります。

1.onnxruntime iOSのonnxruntime側も変更する必要がありますが、 https://github.com/VOICEVOX/onnxruntime-builder/ このレポジトリですか?

試しにforkして1.15.1を指定してbuld.ymlを実行したら、エラーとなりました。 https://github.com/nekomimimi/onnxruntime-builder/actions/runs/7368431899/job/20052719209

2.ファイルの置き場 現状ある voicevox_core/crates/voicevox_core_c_api/xcframework の中に、今回使うframeworkの雛形ファイルを入れて大丈夫ですか?

Hiroshiba commented 7 months ago

1.onnxruntime

はい、そちらのリポジトリになります!

試しにforkして1.15.1を指定してbuld.ymlを実行したら、エラーとなりました。

おっと・・・! distutilsが無いというエラーが出てますね。ちょっと調べてみました。 いつの間にかGithub Actionsのmacos-12上でのデフォルトpythonのバージョンが3.12になっていて、distutilsが削除され、onnxruntime 1.15.1をビルドするためのコードが非対応になってしまったっぽいです。

↓の感じで、バージョン3.12未満のPythonをインストールすると良さそうです! このコードの3.8はちょっと古いので3.10とかでも良いかもです。 https://github.com/VOICEVOX/voicevox_core/blob/f18499536806615b86540aca77ea0075947a623d/.github/workflows/python_lint.yml#L25-L27 (たぶん、ubuntu上でapt installされているpythonもついでに削除できると思います!)

2.ファイルの置き場 現状ある voicevox_core/crates/voicevox_core_c_api/xcframework の中に、今回使うframeworkの雛形ファイルを入れて大丈夫ですか?

ちょっとわかってないのですが、たぶん大丈夫なのかなと思っています!

環境や動作タイミングがよくわからないのです問題があるかわからないのですが、 ソース側がタグで管理されていてworkflowはタグで管理されない仕組みな気がします。 過去のタグをbuild and deploy workflowをした時にファイルが見つからずに通らなくならないかを心配しました。

こちらですが、もしよかったらどういう例を懸念されているかお聞きしてもよろしいでしょうか 🙇

nekomimimi commented 7 months ago

↓の感じで、バージョン3.12未満のPythonをインストールすると良さそうです!

動きました。ありがとうございます!

こちらですが、もしよかったらどういう例を懸念されているかお聞きしてもよろしいでしょうか 🙇

自分が相当勘違いしてたようなので忘れてください🙇

nekomimimi commented 7 months ago

すみません、一点、躓いていまして。

build_and_deploy.ymlのdownload testで失敗したり成功したりするという症状で調べてまして、 例えばmainの現状の最新の[4e13bca]で

失敗例

https://github.com/nekomimimi/voicevox_core/actions/runs/7392613001 https://github.com/nekomimimi/voicevox_core/releases/tag/0.15.0-preview.10

成功

https://github.com/nekomimimi/voicevox_core/actions/runs/7388802114 (すでにrelease物は残ってない)

でして、原因を調べてます。 何か失敗の原因がわかりますでしょうか?

Releasesの同名のタグの前回のリリース物を削除して、 バージョン(例):0.15.0-preview.10 コード署名:チェックなし 製品版ビルド:チェックなし で使ってます。 (自分の使い方を疑ってます💦)

追記

ccをアップデートする前でも同じ失敗が出るので、最近の修正とは関係なさそう(?) 1回目 成功 https://github.com/nekomimimi/voicevox_core/actions/runs/7388743149 (すでにrelease物は残ってない) 2回目 失敗 https://github.com/nekomimimi/voicevox_core/actions/runs/7393347917 https://github.com/nekomimimi/voicevox_core/releases/tag/0.15.0-preview.18 3回目 失敗 https://github.com/nekomimimi/voicevox_core/actions/runs/7393491688 https://github.com/nekomimimi/voicevox_core/releases/tag/0.15.0-preview.20

ブランチを作って1回目は成功して2回目以降は失敗する印象。

ver 0.14.5はOKかも

の707もOKかも

の710もOKかも

の716はNG

https://github.com/nekomimimi/voicevox_core/actions/runs/7394339408

の711はOK

原因は#の716?

Hiroshiba commented 7 months ago

@nekomimimi すみません遅くなりました!! 調べてるのですが、ちょっと原因まだわかりません。。

とりあえずの応急処置ですが、download_testは落ちていてもiOSのビルドのとこまでは大丈夫です! (全部のビルドが終わってからdownload_testが始まる設計なのと、iOSのxcframework周りはダウンロードテストしていないので。。)

ちょっと原因は引き続き調査中です。キャッシュ周りが悪さしてそうな予感・・・?

調査結果(わからんという結論) とりあえずファイルの中身に`cuda`関連のなにかが紛れ込んでるからエラーになってるっぽみ。う〜む。 https://github.com/VOICEVOX/voicevox_core/releases/tag/0.15.0-preview.16 の`voicevox_core-windows-x64-directml`の内容 ``` README.txt VERSION onnxruntime.dll voicevox_core.dll voicevox_core.h voicevox_core.lib ``` https://github.com/nekomimimi/voicevox_core/releases/tag/0.15.0-preview.18 の`voicevox_core-windows-x64-directml`の内容 ``` README.txt VERSION onnxruntime.dll onnxruntime_providers_cuda.dll onnxruntime_providers_shared.dll onnxruntime_providers_tensorrt.dll voicevox_core.dll voicevox_core.h voicevox_core.lib ``` ありえるとしたらrust-cache・・・・・・・? https://github.com/VOICEVOX/voicevox_core/blob/4e13bca5a55a08d7aea08af4f949462bd284b1c1/.github/workflows/build_and_deploy.yml#L255-L256
nekomimimi commented 7 months ago

とりあえずの応急処置ですが、download_testは落ちていてもiOSのビルドのとこまでは大丈夫です!

はい。気にせず作業を進めます!

(試したところでは #716 から発生しているようでしたが、原因わからずでした。)

nekomimimi commented 7 months ago

@Hiroshiba

テスト中、エラーが出て原因を調べてまして、

ERROR voicevox_core::helpers: Caused by: (省略...)/voicevox/0.vvmの読み込みに失敗しました: モデルデータを読むことができませんでした

ERROR voicevox_core::helpers: Caused by: Failed to create session: Error calling ONNX Runtime C function: Failed to load model because protobuf parsing failed. モデルデータを読むことができませんでした

現状、どこかバージョンがズレてるのかなと考えて、もし、以下で問題になりそうな点があったら教えてください。 (問題なさそうなら別の原因を探ります)

特に疑問点は 1.voicevox_core: 0.15.0.preview.16で動いてる.vvmのファイルを使ってればOKか。 2.onnixruntimeは1.15.1をrevertすれば1.14.0が作成できるか。 の2点です。

現状の組み合わせは、 1.現状、以下で正常に動いてるアプリがあります。 voicevox_core: 0.15.0.preview.16 onnxruntime: 1.14.0 これを、今回作成のライブラリに入れ替えてテストしようとしています。

2.onnxruntime 今回の修正を入れた後、 Revert "onnxruntimeのバージョンを1.15.1に上げる" したもので、1.14.0とバージョンを指定して作成

3.voicevox_core 今回の修正を入れてライブラリ作成

sevenc-nanashi commented 7 months ago

3.voicevox_core 今回の修正を入れてライブラリ作成

実際に使われているキャラクターの声のモデルは暗号化されており、その復号コードはHiroshibaさんしかビルドできません。 自前ビルドの場合はこのリポジトリのmodel/sample.vvmのような暗号化されてないモデルのみ読み込めます。

ので、解決策としては:

だと思います。

nekomimimi commented 7 months ago

ありがとうございます。原因にたどり着けた気がします。とりあえずは、sample.vvmを使ってテストします。