VOICEVOX / voicevox_core

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

PythonのブロッキングAPIを実装 #706

Closed qryxip closed 10 months ago

qryxip commented 10 months ago

内容

702 で実装したブロッキングAPIをPython APIで使い、PyO3で提供するclassを次の二つに分けて提供するようにします。

-voicevox_core.blocking.{Synthesizer,…} -voicevox_core.asyncio.{Synthesizer,…}

関連 Issue

662

702

その他

qryxip commented 10 months ago

ひとまず

だけ実装しました。次のように使えるはずです。

from voicevox_core.blocking import OpenJtalk

open_jtalk = OpenJtalk("…")
import voicevox_core

open_jtalk = voicevox_core.blocking.OpenJtalk("…")
qryxip commented 10 months ago
qryxip commented 10 months ago

blockingasyncioは実装し終えました。

example/pythonとテストをどうしようか考えています。

exampleの方はブロッキング版に統一するというのもよいですが、run-blocking.pyとrun-asyncio.pyに分けるという手もあると思います。

テストの方ですが、ブロッキング版classをasyncに包むラッパーを作り、ABCを定義してasyncio版と同等に扱うといった感じで両方のAPIのテストをできないかと考えています。

Hiroshiba commented 10 months ago

楽しみです!!!

example/pythonとテストをどうしようか考えています。 exampleの方はブロッキング版に統一するというのもよいですが、run-blocking.pyとrun-asyncio.pyに分けるという手もあると思います。

サンプルの目的的には、簡単な方のブロッキング版はマストで用意してあげたいなと感じました! asyncio版の方はあった方が良いなと感じました! けどまあ時間の都合などで難しかったりしたらなしでもいいのかなと・・・!

テストの方ですが、ブロッキング版classをasyncに包むラッパーを作り、ABCを定義してasyncio版と同等に扱うといった感じで両方のAPIのテストをできないかと考えています。

良さそう!

qryxip commented 10 months ago

exampleの方はrun.pyとrun-asyncio.pyに分けました。

テストの方は...ABCは難しいことがわかりました。型制約の記述がPythonでは無理。

もう一つ考えている方法として、こういうのを振り回すことを考えています。

# `blocking`と`asyncio`に同じ引数を与え続け、出力が同じかどうかをassertし続ける
@dataclasses.dataclass
class Pair(Generic[B, A]):
    blocking: B
    asyncio: A
Hiroshiba commented 10 months ago

なるほどです! ちょっとそちらの方法が具体的にどんな感じかイメージは湧いてないのですが、もしくは片方だけのテストにするというのもありなのかなと思いました!!

qryxip commented 10 months ago

https://github.com/VOICEVOX/voicevox_core/pull/706/commits/9c99edced272827b4de441c58667acf59ff55b6d

ブロッキング版のテストをコピペで用意しました。各ファイルには対(blocking <-> asyncio)になるファイルについてコメントするようにしています。

Python API内のRustコード自体が結構重んでいることを考えると、これが無難であると結論付けた方がよいのかなと思いました。