-
Notifications
You must be signed in to change notification settings - Fork 128
Closed
Description
内容
(以下の記述は必要に応じてアップデートしていきます。改善すべき点があればご指摘ください。)
現在、コアライブラリは C++ で記述されています。C++ は優れた言語ですが、ビルドツールなどを含め現代的でない部分が存在し、それにより開発の難しさを感じることがあります。ここで、開発言語として新たに Rust を採用することによって、開発体験が向上することが期待されるため、Rust による実装への移行を模索する意義があると考えられます。
この Issue では Rust による実装を段階的に進めるに当たって、実装の進め方や方針の議論、進捗の整理等を行うことができればと思います。
Pros 良くなる点
- 基本的にメモリ安全・型安全になる
- 非同期処理が書きやすくなる
- C++20 と比較すると違いがないかも?
- ビルド・パッケージ管理・テスト等が容易になる
Cons 悪くなる点
- 学習コストの高い言語であることから、保守のための開発者を安定的に確保できるかどうか未知数な部分がある
- Rust が言語的にフォーカスしている領域は C++ でも同様に難しい、ということはある
- 今後の Rust 普及に伴って開発者増が期待できるかもしれない
その他、より詳しい Pros/Cons:
#128 (comment)
実現方法
作業は当面 rust branch で行われる予定です。
考えられる作業一覧:
- onnuruntime wrapper の実装(既存 wrapper (https://github.com/nbigaouette/onnxruntime-rs) を改造する)
- 暫定的に fork されたリポジトリ (https://github.com/qwerty2501/onnxruntime-rs) に必要なAPIを追加する
- 不具合の解決
-
⚠️ onnx モデルファイルの読み込みに失敗する問題を解決 -
⚠️ Windows で onnxruntime.dll をロードできずテストを実行できない問題を解決- [Rust]load_metas,metasを実装した #140 (comment)
- [Rust] windows-2022 でテストできないことに対する回避策を追加 #173 で姑息的に解決(できればより良い解決策があれば……!)
-
- 機能の追加
VOICEVOX org 下に管理を移すか、あるいはオリジナルのリポジトリへの PR を目指すかは未定当面は VOICEVOX org 下で管理する (https://github.com/VOICEVOX/onnxruntime-rs) 。
- 現段階のエンジン側で必要なAPI(TTS機能以外)の実装
- API 一覧
-
initialize
[Rust]onnxruntimeをrust版voicevox_coreに導入 #135 -
finalize
[Rust]internalのfinalizeを実装した #160 -
load_model
[Rust]internal.rsに load_modelを実装した #150 -
is_load_model
[Rust]is_model_loadedを実装した #151 -
metas
[Rust]load_metas,metasを実装した #140 -
supported_devices
[Rust] supported_devices を実装した #149 -
yukarin_s_forward
[Rust] yukarin_s_forward を実装した #157 -
yukarin_sa_forward
[Rust] yukarin_sa_forward と decode_forward を実装(yukarin_s_forward の再実装含む) #158 -
decode_forward
-
last_error_message
Rustへの移行 #126 - GPU 対応 [Rust] GPUを使う場合、初期化時にメモリ確保する。また、イントネーションの推論を常にCPUで行うようにする #168
-
- API 一覧
- TTS 機能の実装
- 雑に実装したものが既にある (https://github.com/PickledChair/voicevox-tts-rs) ので、これをベースに実装できそう
- C++ 実装を参考に実装したもの
- エラー処理や OpenJTalk とのグルーコード周りが特に雑なので要修正
- OpenJTalk の wrapper の実装 [Rust]OpenJtalkのbindingsを実装した #162 OpenJtalkを実装した #165
- 上記実装は
kana_parser
を含まないので、新規に実装する必要がある kana_parser 実装 #155
- API 一覧
-
VoicevoxResultCode
-
voicevox_load_openjtalk_dict
[Rust] voicevox_load_openjtalk_dict を実装した #184 -
voicevox_tts
-
voicevox_tts_from_kana
[Rust] voicevox_tts_from_kana の実装 #193 -
voicevox_wav_free
[Rust] voicevox_tts と voicevox_wav_free の実装 #186 -
voicevox_error_result_to_message
-
- 雑に実装したものが既にある (https://github.com/PickledChair/voicevox-tts-rs) ので、これをベースに実装できそう
- ビルド方法等に関して README を書き直す [Rust]Rust開発環境用のREADMEに更新する #202
- example を書き直す
- python [Rust]pythonのexampleを新しい形に変更した #207
- cpp (windows) [Rust]C++ Windows向けのexampleを修正します #208
- cpp (unix) [Rust]C++ unix向けのexampleを修正する #197
また、並行して自動ビルド・テストも整備する:
- CI の整備
- テスト
- Ubuntu 18.04 でのテストが落ちる問題の解決
- リリースビルド [Rust]release用のbuildとdeployのCI設定を作った #191
- デプロイ [Rust]デプロイ処理を実装した #196
- テスト
最後に、新しいコアが期待通りに動くか確認して、移行作業完了としたいです(main branch へのマージ後に確認?)。
- コアの動作確認(特に GPU を期待通りに使えるか)
その他
ビルド可能な最初の貢献は @qwerty2501 さんによって行われています (#126) ありがとうございます!
Hiroshiba, phenylshima, maekawatoshiki and GenbuchanGenbuchan