Closed qryxip closed 10 months ago
ひとまず
voicevox_core.blocking.OpenJtalk
voicevox_core.blocking.UserDict
だけ実装しました。次のように使えるはずです。
from voicevox_core.blocking import OpenJtalk
open_jtalk = OpenJtalk("…")
import voicevox_core
open_jtalk = voicevox_core.blocking.OpenJtalk("…")
voicevox_core.{OpenJtalk,Synthesizer,UserDict,VoiceModel}
をvoicevox_core.asyncio
に移動。blocking
とasyncio
は実装し終えました。
example/pythonとテストをどうしようか考えています。
exampleの方はブロッキング版に統一するというのもよいですが、run-blocking.pyとrun-asyncio.pyに分けるという手もあると思います。
テストの方ですが、ブロッキング版classをasyncに包むラッパーを作り、ABC
を定義してasyncio版と同等に扱うといった感じで両方のAPIのテストをできないかと考えています。
楽しみです!!!
example/pythonとテストをどうしようか考えています。 exampleの方はブロッキング版に統一するというのもよいですが、run-blocking.pyとrun-asyncio.pyに分けるという手もあると思います。
サンプルの目的的には、簡単な方のブロッキング版はマストで用意してあげたいなと感じました! asyncio版の方はあった方が良いなと感じました! けどまあ時間の都合などで難しかったりしたらなしでもいいのかなと・・・!
テストの方ですが、ブロッキング版classをasyncに包むラッパーを作り、ABCを定義してasyncio版と同等に扱うといった感じで両方のAPIのテストをできないかと考えています。
良さそう!
exampleの方はrun.pyとrun-asyncio.pyに分けました。
テストの方は...ABC
は難しいことがわかりました。型制約の記述がPythonでは無理。
もう一つ考えている方法として、こういうのを振り回すことを考えています。
# `blocking`と`asyncio`に同じ引数を与え続け、出力が同じかどうかをassertし続ける
@dataclasses.dataclass
class Pair(Generic[B, A]):
blocking: B
asyncio: A
なるほどです! ちょっとそちらの方法が具体的にどんな感じかイメージは湧いてないのですが、もしくは片方だけのテストにするというのもありなのかなと思いました!!
https://github.com/VOICEVOX/voicevox_core/pull/706/commits/9c99edced272827b4de441c58667acf59ff55b6d
ブロッキング版のテストをコピペで用意しました。各ファイルには対(blocking <-> asyncio)になるファイルについてコメントするようにしています。
Python API内のRustコード自体が結構重んでいることを考えると、これが無難であると結論付けた方がよいのかなと思いました。
内容
702 で実装したブロッキングAPIをPython APIで使い、PyO3で提供するclassを次の二つに分けて提供するようにします。
-
voicevox_core.blocking.{Synthesizer,…}
-voicevox_core.asyncio.{Synthesizer,…}
関連 Issue
662
702
その他