Closed qryxip closed 9 months ago
struct OpenJtalkをSynthesizer<OpenJtalk> | Synthesizer<()>として持つようにします。 (Rust APIはパブリックではないので暫定)
struct OpenJtalk
Synthesizer<OpenJtalk> | Synthesizer<()>
これにより、OpenJtalkは必ずシステム辞書を読み込んでいる状態になります。
OpenJtalk
変更しているpublic APIはRust APIのみです。C(compatible_engineを除く)もPythonもJavaも現状Open JTalkが必須となっているのですが、もし必須ではなくするとしたら、設計については議論の余地があると思っています。
compatible_engine
考慮すべきはこんな感じだと思っていて、
Synthesizer<()>
Synthesizer<OpenJtalk>
void*
これをもとにしても、私が今思い付くだけでこれくらいの選択肢はあると思います。
class Synthesizer (OpenJtalkはオプショナルなオブジェクトとして持ち、null(相当)であるときにメソッドを呼ぶと実行時エラー)
class SynthesizerWithoutOpenjtalk (互いに親子関係には無い) class Synthesizer (〃)
class Synthesizer └── class SynthesisEngine (`Synthesizer::engine`として所有)
interface SynthesisEngine (存在型か、動的ディスパッチでコンストラクトする) └── class Synthesizer
interface SynthesisEngine (引数のみに登場し、返り値としては登場しない) ├── class SynthesizerWithoutOpenjtalk └── class Synthesizer
内容
struct OpenJtalk
をSynthesizer<OpenJtalk> | Synthesizer<()>
として持つようにします。 (Rust APIはパブリックではないので暫定)これにより、
OpenJtalk
は必ずシステム辞書を読み込んでいる状態になります。変更しているpublic APIはRust APIのみです。C(
compatible_engine
を除く)もPythonもJavaも現状Open JTalkが必須となっているのですが、もし必須ではなくするとしたら、設計については議論の余地があると思っています。考慮すべきはこんな感じだと思っていて、
Synthesizer<()>
からはメソッドが生えなくて、Synthesizer<OpenJtalk>
からは生えてくる)があると仮定しない関数の引数や戻り値に動的ディスパッチされるinterfaceが使えると仮定しないvoid*
で扱って実行時チェックとするしかないはずこれをもとにしても、私が今思い付くだけでこれくらいの選択肢はあると思います。
関連 Issue
545
その他