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

iOSビルドのサポート #459

Closed
5 of 6 tasks
HyodaKazuaki opened this issue Mar 31, 2023 · 14 comments · Fixed by #471
Closed
5 of 6 tasks

iOSビルドのサポート #459

HyodaKazuaki opened this issue Mar 31, 2023 · 14 comments · Fixed by #471

Comments

@HyodaKazuaki
Copy link
Contributor

HyodaKazuaki commented Mar 31, 2023

内容

Androidビルドがついにできたようですので、iOSビルドも追加されると嬉しいです。

Pros 良くなる点

  • iPadやiPhone単体でVOICEVOXキャラクターの音声合成ができる

Cons 悪くなる点

  • 後述するがonnxruntimeのiOS向けprebuildがないため、onnxruntimeのビルドも行う必要がある

実現方法

  • onnxruntimeのiOS向けビルドを用意する support iOS onnxruntime-rs#19
    • cocoapodsなどを見ましたが、iOS向けのprebuildはありませんでした。ですので、VOICEVOX側(この場合はonnxruntime-rs内)でビルドする必要があります。
  • onnxruntime-rsをiOSに対応させる support iOS onnxruntime-rs#19
    • onnxruntimeのiOS向けビルドを用意して、それを利用できるよう対応する必要があります。
  • open_jtalk-rsをiOSに対応させる Support iOS open_jtalk-rs#9
    • Open JTalkをiOSで利用できるようにビルドする必要があります。
  • process_pathをiOSに対応させる Add iOS support wesleywiser/process_path#16
    • Android版でもそうでしたが、process_pathがiOSも対応していません。ですので、iOSに対応してもらえるようPRを出すもしくはVOICEVOX側でforkして追加する必要があります。
  • VOICEVOXへforkしたprocess_pathをiOSに対応させる Support iOS process_path#1
    • 上記のPRがマージされないため、forkされたprocess_pathへPRを出します。
  • コアをiOSに対応させる 816ad87
    • iOS向けのビルドをGitHub Actionsに登録する必要があります。

その他

すでに手元でiOS向けビルドを生成済みです。 https://twitter.com/HyodaKazuaki/status/1641263474511843328
まだ実際に生成できるかは確認できていません。

加えて、iOS向けビルドではiphoneosとiphonesimulatorというSDKがあり、例えばSDKにiphoneosを指定してビルドしたライブラリはXcodeのシミュレータで動かすとエラーが出ます。ですので両方のSDKでビルドしたものを含むライブラリを作るか、更にFrameworkにしてしまう必要がありそうです。

iOSアプリを開発した経験がほとんどないので誤っている点などあるかもしれませんが、ご指摘いただけると幸いです。

@PickledChair
Copy link
Member

PickledChair commented Mar 31, 2023

Issue 作成ありがとうございます! ぜひ進めていきたいですね……!

cocoapodsなどを見ましたが、iOS向けのprebuildはありませんでした。ですので、VOICEVOX側(この場合はonnxruntime-rs内)でビルドする必要があります。

こちらなのですが、私も cocoapods が使えるのではないかとちょっと期待していたのですが、これが本当なのであれば当てが外れましたね…….。

cocoapods として配布されているバイナリは Specs に記載されているリンクからダウンロードできることを個人的に確認していました。その中に含まれている onnxruntime.xcframework は以下のような構造になっていました。

onnxruntime.xcframework
├── Info.plist
├── ios-arm64
│   └── onnxruntime.framework
│       ├── Headers
│       │   ├── coreml_provider_factory.h
│       │   ├── cpu_provider_factory.h
│       │   ├── onnxruntime_c_api.h
│       │   ├── onnxruntime_cxx_api.h
│       │   └── onnxruntime_cxx_inline.h
│       ├── Info.plist
│       └── onnxruntime
└── ios-arm64_x86_64-simulator
    └── onnxruntime.framework
        ├── Headers
        │   ├── coreml_provider_factory.h
        │   ├── cpu_provider_factory.h
        │   ├── onnxruntime_c_api.h
        │   ├── onnxruntime_cxx_api.h
        │   └── onnxruntime_cxx_inline.h
        ├── Info.plist
        └── onnxruntime

この中で、実機やシミュレータ向けの onnxruntime.framework に入っている onnxruntime ファイルが static library であるように見えたので、こちらが使えたら……と思っていたのですが、実際には使えなかったということでしょうか?(dynamic library の配布は確かにありませんね……。私も iOS 向けの開発の経験はほぼありませんが、少し調べた限り、サードパーティのライブラリの配布は static library が一般的のようでした。)

@HyodaKazuaki
Copy link
Contributor Author

この中で、実機やシミュレータ向けの onnxruntime.framework に入っている onnxruntime ファイルが static library であるように見えたので、こちらが使えたら……と思っていたのですが、実際には使えなかったということでしょうか?

静的ライブラリでのビルドは試せていません。
cocoapodsの静的ライブラリを使ったonnxruntime-rsのビルドまでは問題なさそうです
しかし、VOICEVOXコア側でこれをリンクする部分を見つけられていません。
ここを見つけて変更することができればビルドできるかもしれません。

よろしければリンクの設定などをどこで行えばいいか教えていただけると嬉しいです。

@HyodaKazuaki
Copy link
Contributor Author

先程iPad実機上で動作を確認しました(dylibの方です)ので追記しておきます。
https://twitter.com/HyodaKazuaki/status/1641887882091847680

@Hiroshiba
Copy link
Member

横槍すみません!
staticかdynamicどちらを使うかですが、OSごとに処理を合わせられそうなのでdynamicルートを通るのも悪くないかもと思いました!
あと将来的なタスクとしてonnxruntimeをリビルドできると嬉しいのですが、これを考えると既存のcocoapodsを使わない方法を通るモチベーションになりえるかもと思いました!

@PickledChair
Copy link
Member

PickledChair commented Mar 31, 2023

staticかdynamicどちらを使うかですが、OSごとに処理を合わせられそうなのでdynamicルートを通るのも悪くないかもと思いました!
あと将来的なタスクとしてonnxruntimeをリビルドできると嬉しいのですが、これを考えると既存のcocoapodsを使わない方法を通るモチベーションになりえるかもと思いました!

これはどちらも同意です! なので話が変わってしまって申し訳ないのですが、static library をリンクすることを考えるのはやめて、まずは自前で iOS 向けの dylib をビルドするのを考えるのが良さそうですね。

また、最初の Issue コメントに

加えて、iOS向けビルドではiphoneosとiphonesimulatorというSDKがあり、例えばSDKにiphoneosを指定してビルドしたライブラリはXcodeのシミュレータで動かすとエラーが出ます。ですので両方のSDKでビルドしたものを含むライブラリを作るか、更にFrameworkにしてしまう必要がありそうです。

とあるように、シミュレータ向けの dylib もビルドすると尚良いですね。その場合、シミュレータ向けビルドにはさらに x86_64 向けと arm64 向けの違いがあるはずなので、全部で3種類のターゲットに対応することになりそうです。

@qryxip
Copy link
Member

qryxip commented Apr 1, 2023

VOICEVOX/onnxruntime#3を見越してonnxruntime-builderの対象を1.14.1に上げちゃってたと思うのですが、これどうしましょうかね?

まあ現行のCOREに1.14.1をリンクしてももしかしたら動くかもしれないし、v1.13.1のリリースに手元でビルドしたやつを突っ込んでしまうという手もありますが。

@PickledChair
Copy link
Member

PickledChair commented Apr 1, 2023

onnxruntime-builderの対象を1.14.1に上げちゃってた

なるほどです、確かに対応が必要ですね。

現行のCOREに1.14.1をリンクしてももしかしたら動くかもしれない

そうかもしれないですが、iOS 版だけ v1.14.1 対応にしてしまうとビルド手順が一時的に複雑になりそうですね。今しばらくはとりあえずmicrosoft本家(Rust 版の正式リリースはまだ)ではなくフォークした VOICEVOX/onnxruntime-rs を使い続けることになっていると思いますが、これを(他のプラットフォーム向けも含めて)とりあえず v1.14.1 に対応してしまうのが綺麗かもしれない、と思いました。その上で VOICEOX/onnxruntime-builder に iOS ビルドの手順を加え、v1.14.1 のリリースをやり直し、そこから dylib をとってくるように実装、という感じです。

(余談ですが、VOICEVOX/onnxruntime-builder の linux arm64 向けのリリースは、今後は使われなさそう? armhf のビルド済みバイナリは公式には提供されていないので今後の対応のためにビルドする意味がありますが、arm64 版の方は現在は microsoft/onnxruntime からとってきているので……)

とはいえ、

v1.13.1のリリースに手元でビルドしたやつを突っ込んでしまうという手もありますが。

これが一番手っ取り早そうでもあります( @HyodaKazuaki さんがビルドしたものを使うのも良いですし、ビルド手順を教えていただければこちらでビルドすることもできそうです)。

@HyodaKazuaki
Copy link
Contributor Author

iOS向け動的ライブラリのビルド、そして他のprebuildと同じような扱いができるようにファイル移動などを行った処理は以下の部分にあります。

https://github.com/HyodaKazuaki/onnxruntime-rs/blob/feature/support-aarch64-apple-ios/onnxruntime-sys/build.rs#L663-L776

microsoft/onnxruntime のRustコードのコンパイル方法にはiOS向けビルドに必要なオプションがないので./build.shが呼び出すPythonファイルに乗っかるような形でビルドを行っています。

@Hiroshiba
Copy link
Member

onnxruntime-builderの対象を1.14.1に上げちゃってた

コアは全体的に1.14.1を使っていく方針にするのが良いのかなと思いました!
iOS版のonnxruntimeの1.14.1のプレビューができるくらいまでに、1.14.1で動くかどうか試しておこうと思います。
(遅そうだったら突っついていただけると・・・ 🙇‍♂️ )

VOICEVOX/onnxruntime-builder の linux arm64 向けのリリース

あ、ビルドしてましたっけ。
なんかのPRとかでついでに省いちゃいたいですね!


他に判断が必要なとことかあればいつでもお呼びください! 🙏

@PickledChair
Copy link
Member

VOICEVOX/onnxruntime-builder#15 に書いたような問題 (v1.14.1 向けの Android バイナリが利用できない)がわかったため、今のところ onnxruntime は v1.14.0 を使うように変更する見込みになったことをメモしておきます

@HyodaKazuaki
Copy link
Contributor Author

皆さんのご協力のお陰で、このIssueの残りタスクはprocess_pathのiOSサポートとvoicevox_coreへのiOSビルドのアクション追加のみとなりました。

process_pathについては、先日からPRを送っているものの、リポジトリオーナーから特にアクションがなかったのでリマインドを行いました。もしこのまま反応がなかったり、iOSサポートが必要ないなどの判断によってPRがマージされない場合はVOICEVOX側でprocess_pathをforkする必要があるかと思います。

voicevox_coreへのiOSビルドのアクション追加については、近いうちにDraftとして公開したいと思います。

@PickledChair
Copy link
Member

PickledChair commented Apr 15, 2023

こちらこそ作業ありがとうございます!

process_pathについて
PRがマージされない場合はVOICEVOX側でprocess_pathをforkする必要がある

そうですね! スマホ版 VOICEVOX の開発をどんなスピード感で進めるかによりますが、もう fork を検討してもよいかもしれません( @Hiroshiba さんの判断次第ですね)。本家で iOS 対応が追加されたらそちらに切り替える感じで良さそうでしょうか。

@Hiroshiba
Copy link
Member

forkでもcoreにsubmodleとして追加するでも良いと思います!!
とりあえずVOICEVOX orgにforkしてみました!
https://github.com/VOICEVOX/process_path

@HyodaKazuaki
Copy link
Contributor Author

forkでもcoreにsubmodleとして追加するでも良いと思います!! とりあえずVOICEVOX orgにforkしてみました! https://github.com/VOICEVOX/process_path

では同じPRをそちらにも出しておきます。

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.

4 participants