-
Notifications
You must be signed in to change notification settings - Fork 118
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
C APIの改善を行う #217
C APIの改善を行う #217
Conversation
引数のoptionをstruct化したら |
C APIの改善に関して、なるべく網羅的に意見を伺いたいのでメンションを飛ばさせて頂きます! |
from_kanaはたしかに消せそうに思いました。(実際エンジン側は同じAPI) load_openjtalk_dictは辞書更新のたびに何度も呼ぶので、initializeに混ぜると不都合かもです。 |
現状そうなる未来がちょっと見えてこないです。
とりあえずttsできるまでに呼び出す関数の数を減らしたいと思ってて、現状 しかし辞書更新って一度起動してから何度も行われるものなんでしょうか? |
たしかにfrom_kanaはオプションでもいいかなと思いました。
辞書登録をすると更新が必要になります。 |
あまり詳しくないのですが、辞書登録ってユーザー定義辞書とは別物ですか? |
辞書登録という言葉がいまいちでした。。「辞書登録後にユーザー定義辞書を作る」という流れをイメージしていました。 csvに単語を追加→create_user_dict実行(ユーザー定義辞書生成)→set_user_dict |
なるほど。現状 |
あ!なるほどです。 |
ではいったん |
… feature/improve-c-api
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
まだコンパイル通らない状態なのですが、とりあえず定義だけ変えてみました。主にやったことは以下です
- load_openjtalk_dictを削除
- last_error_messageを削除
- optionsで表現できるものはoptionsに変更
- voicevox_core/publish.rsにある関数について voicevox prefixを削除(これについてはちゃんと名前空間で保護されている関数であり、prefixは不要であるため)
- 成否の戻り値をboolからVoicevoxResultCodeに変更
ちょっときになってるのがoptionsを加えたことによりttsする手間が若干増えてしまってることです
例えば最小限の呼び出しでもいかのようになります
VoicevoxTtsOptions options = voicevox_default_tts_options();
int output_binary_size;
uint8_t* output_wav;
voicevox_tts("テキスト",${speaker_id},options,&output_binary_size,&output_wav);
これを避けるためにoptionsを受け取る版と受け取らない版を定義したほうが良いかもと思いました。
たとえばvoicevox_ttsであるならこんな感じにして普段は voicevox_tts
を呼び出してoptionsはdefaultのものが自動的に内部で適用されるようにするなどしたほうがよいかも
pub extern "C" fn voicevox_tts(
text: *const c_char,
speaker_id: i64,
output_binary_size: *mut c_int,
output_wav: *mut *mut u8,
) -> VoicevoxResultCode;
pub extern "C" fn voicevox_tts_with_options(
text: *const c_char,
speaker_id: i64,
options: VoicevoxTtsOptions,
output_binary_size: *mut c_int,
output_wav: *mut *mut u8,
) -> VoicevoxResultCode;
crates/voicevox_core/src/publish.rs
Outdated
} | ||
pub struct InitializeOptions { | ||
use_cuda: bool, | ||
cpu_num_threads: u32, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
負数を入れる余地を作りたくなかったのでu32にしたがそれでよかったか? usizeだとちょっと大きすぎる気がしたので
内部的には c_intを使ってるので絶対に桁落ちさせないといういみではu16のほうがよかったかもしれない
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
usize
どうなんでしょう? Python越しにせいぜい数回やりとりするデータなのでサイズはあまり問題ではないとは思うのですが、桁落ちも確かにありますね。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
内部的にはc_intなので usize -> c_intへの変更の際に桁落ちはありえますね。変換前にチェックして値が大きすぎたらエラーにする方法もまあなくはないですが、そもそもCPUの数でそこまで大きな値を指定することはないと考えるとusizeは冗長かもですね。
変換前に桁落ちしないかチェックが必要なのはu32も同じなので、そういう意味だとu16がベストかも?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
話はずれますがrepr(Rust)な方の構造体ではOption<NonZeroU32>
のように持つのもいいかもしれません。プリミティブな整数型に一対一で対応しますし。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ですね。u16
がいいかも。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Optionについてはどうでしょうね。 onnxruntimeではcpu_num_threads:0も意味のある値ではあるのでそのままu16としても良いかもしれませんが、onnxruntimeに依存しないという意味では Option<NonZeroU16>
としてもいいかもしれないですが。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あーそうでしたね。onnxruntimeにしか渡さないのならあまり意味はないかも。DLLを使うユーザーに提示できるならともかく。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cpu_num_threadsをu16に変更しました
voicevox_c_apiのlib.rsが結構大きくなってきたので、 公開しない補助関数については helper.rsといったファイルを作って移動させたほうがいいかもです |
これどうしましょうか? |
あ、見逃していました! どちらも良さそうなのですが、一旦voicevox_tts(options)だけにしておいて、リリースまでにやっぱほしいなってなったら増やす感じで・・・! |
#[no_mangle]
pub static voicevox_default_tts_options: VoicevoxTtsOptions = VoicevoxTtsOptions::DEFAULT;
impl VoicevoxTtsOptions {
const DEFAULT: Self = Self { kana: false };
}
// あるいは直接
// #[no_mangle]
//pub static voicevox_default_tts_options: VoicevoxTtsOptions = VoicevoxTtsOptions { kana: false }; こうしてしまえば多分cbindgenもグローバル定数( -VoicevoxTtsOptions options = voicevox_default_tts_options();
int output_binary_size;
uint8_t* output_wav;
-voicevox_tts("テキスト",${speaker_id},options,&output_binary_size,&output_wav);
+voicevox_tts("テキスト",${speaker_id},voicevox_default_tts_options,&output_binary_size,&output_wav); (edit) いや |
内部にもttsのdefaultオプションを作る関数を作るつもりなので他のAPIと挙動を合わせるという意味でも関数にしたほうが良さそうに感じました。直近ではpythonですかね |
うーんRustの実装の都合が理由であれば impl InitializeOptions {
pub const DEFAULT: Self = Self {
use_cuda: false,
cpu_num_threads: 0,
load_all_models: false,
open_jtalk_dict_dir: None,
};
} |
|
ただ削減できるのが2文字ということを考えるとメンテしやすい方にしたほうが良いと思いました。ぱっと見はどっちもあまり対して変わらないようには見えますが・・・ |
static変数でデフォルトのオプションを持つ場合、そのstatic変数の中身を変えられてしまいそう・・・? 👀 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
いくつかコメントしたのでRequest changesにしていますが、気持ち的にはapproveです!!
#217 (comment) |
9ccb69d
to
4da20dd
Compare
4da20dd
to
a9c2cee
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!!
調整が必要な、大きめのタスクだったと思います。ありがとうございます!!
exampleに関しては、まあ次のprebuild版リリースが出るまでに修正できていれば良いのかなと少し思いました。
なのでこのPRはちゃちゃっとマージし、exampleの修正を追加でするか、issueを作るのが良いのかなと思いました!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
@Hiroshiba LGTMもらってますが、usize_is_size_tを使うか使わないかの判断がくだされてないようです。 |
text: *const c_char, | ||
speaker_id: i64, | ||
speaker_id: usize, | ||
options: VoicevoxTtsOptions, | ||
output_binary_size: *mut c_int, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
今見返していたらoutput_binary_sizeは *mut usize
としたほうが良さそう
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
output_binary_size-> output_wav_sizeに名前変更してusizeに変更しました
追記: |
|
length・output_binary_sizeはsize_tで良いと思います! speaker_idは難しくて、互換性考えると(このCOREをforkしているかもしれない人を考えると)i64のままにするのが一番望ましいと思います。 i64かu32で・・・! |
今確認したのですが、inviteのままになっていそうです! |
@Hiroshiba i64かu32を使用するかについてですが、idは負数をとらないことからu32のほうが望ましいと考えてます。 |
とりあえずspeaker_idをu32にしちゃいましたが、もしこっちのほうが良いというのがあれば教えてください |
u32で良いと思います! 意図としてはこのライブラリのユーザーではなく、このライブラリをforkして自作コアを作っている人向けの配慮です。 |
確かに型として負数を取れていたので負数がidなspeakerを作ってる人がいる可能性はゼロではないですね。 |
良いと思います! |
merged! |
内容
以前から上がっていた C APIの改善案を実装する
そこまで急ぐものではないので議論を進めつつ進めていきたい
API定義を変えてしまうとライブラリユーザーがコードを書き換える必要があるので可能ならこの変更をもってしばらくは変える必要のない形にしたほうが良さそう
APIの変更観点としては以下にしたい(追加でこういう観点もほしいとかあったらどうぞ)
今現在変えようと思ってるもの
voicevox_error_result_to_message
でメッセージとれるため)関連 Issue
refs #125