VOICEVOX / voicevox_core

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

`OpenJtalk`を`Synthesizer<OpenJtalk> | Synthesizer<()>`として持つ #694

Closed qryxip closed 9 months ago

qryxip commented 9 months ago

内容

struct OpenJtalkSynthesizer<OpenJtalk> | Synthesizer<()>として持つようにします。 (Rust APIはパブリックではないので暫定)

これにより、OpenJtalkは必ずシステム辞書を読み込んでいる状態になります。

変更しているpublic APIはRust APIのみです。C(compatible_engineを除く)もPythonもJavaも現状Open JTalkが必須となっているのですが、もし必須ではなくするとしたら、設計については議論の余地があると思っています。

考慮すべきはこんな感じだと思っていて、

これをもとにしても、私が今思い付くだけでこれくらいの選択肢はあると思います。

class Synthesizer (OpenJtalkはオプショナルなオブジェクトとして持ち、null(相当)であるときにメソッドを呼ぶと実行時エラー)
class SynthesizerWithoutOpenjtalk (互いに親子関係には無い)
class Synthesizer                 (〃)
class Synthesizer
└── class SynthesisEngine (`Synthesizer::engine`として所有)
interface SynthesisEngine (存在型か、動的ディスパッチでコンストラクトする)
└── class Synthesizer
interface SynthesisEngine            (引数のみに登場し、返り値としては登場しない)
├── class SynthesizerWithoutOpenjtalk
└── class Synthesizer

関連 Issue

545

その他