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

VoiceModelVoiceModelFileにし、ファイルディスクリプタを保持する #829

Closed
3 tasks done
qryxip opened this issue Sep 7, 2024 · 0 comments · Fixed by #832
Closed
3 tasks done

Comments

@qryxip
Copy link
Member

qryxip commented Sep 7, 2024

内容

#545 (comment)の案2.です。

VoiceModelVoiceModelFileにリネームし、またVVMファイルのファイルディスクリプタを(排他ロック付きで)持つようにします。

Pros 良くなる点

APIとして、誤解無く理解されることが期待できる。

Cons 悪くなる点

実現方法

#746#828 の後にでも実装する。

VOICEVOXのバージョン

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

  • Windows
  • macOS
  • Linux

その他

qryxip added a commit that referenced this issue Sep 19, 2024
現在の`VoiceModel`は、コンストラクトされるときに`id`, `manifest`,
`metas`の情報だけ取得してそれらと`path`だけ保持し、モデル本体は要求され
てから`path`を開いて読むという形になっている。このような責務になっている
ことをユーザーが今のAPIのシグネチャから察するのは困難である。このことか
ら、次の変更を行う。

1. `VoiceModel` → `VoiceModelFile`にリネーム
    * C APIの`voicevox_voice_model_…`は`voicevox_voice_model_file_…`に
2. `VoiceModel::from_path` → `VoiceModelFile::open`にリネーム
    * C APIも同様
3. Python APIには`__{,a}{enter,exit}__`、Java APIには`Closable`の実装
    * `id`と`metas`はクローズ後にもgetできるようにする
    * Rust APIの`blocking`のものを除き、`.close()`で閉じられるように
    * C APIの`delete`は`close`にリネーム

Python APIとJava APIで`Synthesizer::load_voice_model`中に
`VoiceModelFile::close`を行うときの挙動としては、`load_voice_model`がす
べて終わるのを待ってからクローズ処理を行う。実装には`RwLock`を用いる。
```py
    async with await VoiceModelFile.open(vvm_path) as model:
        _ = synthesizer.load_voice_model(model) # awaitしない
```
```console
[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`が無事完了している
```

ただしC APIでは`load_voice_model`中の`close`は現行のままUBとする。
`RwLock`でロックすることで安全なAPIにすることはfuture workとする。

実装の都合上、Python APIの`voicevox_core.asyncio.Synthesizer`も
`__{enter,exit}__`ではなく`__a{enter,exit}__`を持つようして、
`VoiceModelFile`同様に`RwLock`でロック管理を行うようにする。

Resolves #829.
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.

1 participant