VOICEVOX / voicevox_core

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

change: `VoiceModel` → `VoiceModelFile` #832

Closed qryxip closed 2 months ago

qryxip commented 2 months ago

内容

829 を行います。変更は大体こんな感じです。

変更前 変更後
音声モデル。 音声モデルファイル。
VoiceModel (C以外) VoiceModelFile (C以外)
VoicevoxVoiceModel (C) VoicevoxVoiceModelFile (C)
変更前 変更後
VVMファイルからVoiceModelをコンストラクトする。 VVMファイルを開く。
VoiceModel::from_path (Rust, Python) VoiceModelFile::open (Rust, Python)
voicevox_voicemodelnew_from_path (C) voicevox_voice_modelfileopen (C)
変更前 変更後
N/A VVMファイルを閉じる。
N/A VoiceModelFile::close (Rust, Python, Java)
N/A VoiceModelFile.__a{enter,exit}__ (Python, Java)
voicevox_voicemodeldelete (C) voicevox_voice_modelfileclose (C)

Synthesizer::load_voice_model中にVoiceModelFile::closeしたときの挙動はこんな感じになっているはずです。ただしまだこれらについてのテストは書いてませんし手動での確認もやってません

言語 Synthesizer::load_voice_model中にcloseしたときの挙動
Rust (同期版 & 非同期版) そもそも起こり得ない
Python (同期版 & 非同期版) 例外(Exception)を発する Javaと同様にロックして待つ
Java load_voice_modelが終わるまでロックして待つ
C (ユーザーに課してる規約上)そもそも起こり得ない

[追記1] Python APIでload_voice_modelが終わるまでロックして待つのが面倒そうに感じたのでこうなってしまったのですが、よく考えたらそんなに難しくなかった。それよりもロックするようなデザインにするか例外を発するようなデザインにするかですね。

[追記2] ロックする方のデザインの方がいいかもですね。reader-writer lockが一つあれば実装できますし、C APIにもAPIをシンプルにしたまま仕込める。

[追記3] Python APIをロックするデザインにしてしまいました。こんな感じになります。

    async with await VoiceModelFile.open(vvm_path) as model:
        _ = synthesizer.load_voice_model(model) # awaitしない
[WARNING] voicevox_core_python_api: The `VoiceModelFile` is still in use. Waiting before closing
[DEBUG] voicevox_core_python_api: Closing a VoiceModelFile
# load_voice_modelが無事完了している

関連 Issue

Resolves #829.

その他

qryxip commented 2 months ago

現行実装と変わらず、特に問題無く並行実行できるはずです。close時に1箇所以上からのアクセスがまだ走ってるなら、そのすべてが終わるまでロックするという感じです。私がreader writer lockと言ったやつについては(呼び方は違いますが)以下リンクで解説されています。 共有/排他ミューテックス(Shared-Exclusive Mutex) - マルチスレッド・プログラミングの道具箱 - Zenn

(まあ並行実行のテストは無いです。が、並行実行のテストというのも難しいのでこういう感じのベンチのコードを管理して手軽に確認できるようにするという感じがよさそう) https://github.com/VOICEVOX/voicevox_core/issues/746#issuecomment-2002471106

Hiroshiba commented 2 months ago

おおなるほどです!!問題なさそう! レビュー始めたいと思います🙏

qryxip commented 2 months ago