Open nekomimimi opened 7 months ago
以下のように回避できましたので、ご参考まで。
xcframeworkの中に、ios-arm64-simulatorとios-arm64のframworkをぞれぞれ作りその中にダイナミックライブラリを入れる。
空のframeworkを作りダイナミックライブラリを上書きし、それをxcframework化します。
onnixrunntimeなどの名前で空のframeworkのprojectを作って、TargetのGeneralのMinimum Deploymentをonnixruntimeでは16.0、voicevox_coreでは16.2とする。 ios-arm64-simulatorとios-arm64の2つをBuild。
libonnxruntime.1.14.0.dylibの名前を1.に合わせてonnxruntimeとしたいので、
lipo -create libonnxruntime.1.14.0.dylib -output onnxruntime
としてframeworkを上書き。
ios-arm64-simulatorとios-arm64をくっつける。
xcodebuild \
-create-xcframework \
-framework Release-iphoneos/onnxruntime.framework \
-framework Release-iphonesimulator/onnxruntime.framework \
-output outuput/onnixruntime.xcframework
などとする。
今の自分自身の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と同様にする。
加えて、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
詳細な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
見た感じの雰囲気的に、ちょっとコードを足せばよさそう・・・・・・・・・・? (ちゃんと精査できてないですが。。。)
workflowが何一つわからないので、年内、直せそうかを試してみて、無理そうだったらgive upします〜。
おお!!チャレンジしてくださるの嬉しいです!!
とりあえずworkflowを回してビルドチェックするのは、Forkしたリポジトリ内で、Actionsを許可した後、Actionsタブへ行き、左からbuild and deploy workflow
を選んで、右のRun workflow
を押して、ブランチを選べばできると思います!
不明な点があればなんでも聞いていただければ!
大体上の説明で理解しました。ありがとうございます! 作成してみたいと思います。
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の雛形ファイルを入れて大丈夫ですか?
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をした時にファイルが見つからずに通らなくならないかを心配しました。
こちらですが、もしよかったらどういう例を懸念されているかお聞きしてもよろしいでしょうか 🙇
↓の感じで、バージョン3.12未満のPythonをインストールすると良さそうです!
動きました。ありがとうございます!
こちらですが、もしよかったらどういう例を懸念されているかお聞きしてもよろしいでしょうか 🙇
自分が相当勘違いしてたようなので忘れてください🙇
すみません、一点、躓いていまして。
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かも
https://github.com/nekomimimi/voicevox_core/actions/runs/7394339408
原因は#の716?
@nekomimimi すみません遅くなりました!! 調べてるのですが、ちょっと原因まだわかりません。。
とりあえずの応急処置ですが、download_test
は落ちていてもiOSのビルドのとこまでは大丈夫です!
(全部のビルドが終わってからdownload_test
が始まる設計なのと、iOSのxcframework周りはダウンロードテストしていないので。。)
ちょっと原因は引き続き調査中です。キャッシュ周りが悪さしてそうな予感・・・?
とりあえずの応急処置ですが、download_testは落ちていてもiOSのビルドのとこまでは大丈夫です!
はい。気にせず作業を進めます!
(試したところでは #716 から発生しているようでしたが、原因わからずでした。)
@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 今回の修正を入れてライブラリ作成
3.voicevox_core 今回の修正を入れてライブラリ作成
実際に使われているキャラクターの声のモデルは暗号化されており、その復号コードはHiroshibaさんしかビルドできません。 自前ビルドの場合はこのリポジトリのmodel/sample.vvmのような暗号化されてないモデルのみ読み込めます。
ので、解決策としては:
だと思います。
ありがとうございます。原因にたどり着けた気がします。とりあえずは、sample.vvmを使ってテストします。
不具合の内容
手元で動いてる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
現象・ログ
再現手順
新規プロジェクトを作り正常にサブミットできることを試した後に再度サブミットし、上記エラーを受ける手順となります。 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