Skip to content
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

AquesTalkライク記法によるTTS関数の追加とそれに伴うバグの修正 #101

Merged
merged 11 commits into from
Mar 19, 2022

Conversation

y-chan
Copy link
Member

@y-chan y-chan commented Mar 16, 2022

内容

題の通りです。
元々AquesTalkライク記法を解釈するための関数(parse_kana)を備えていましたが、それが盛大にバグを含んでいたので、同時に修正です。

こちらに動作確認用のテストコードを置いています。
https://gist.github.com/y-chan/91f180f525be2415f7785b545e5011c1

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Yosshi999 さん、 @Oyaki122 さん、 @qwerty2501 さん、もしよければレビューお願いできるととても嬉しいです・・・!

Copy link
Contributor

@qwerty2501 qwerty2501 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このPRでやることではないかもしれないですがテストコードがほしいですね
SuggestしてますがSuggestだけだとコンパイル通らなくなるかもなので適宜直していただければ

core/src/engine/kana_parser.cpp Outdated Show resolved Hide resolved
core/src/engine/kana_parser.cpp Outdated Show resolved Hide resolved
core/src/engine/kana_parser.cpp Outdated Show resolved Hide resolved
core/src/engine.cpp Show resolved Hide resolved
core/src/engine/kana_parser.cpp Outdated Show resolved Hide resolved
core/src/engine/kana_parser.h Outdated Show resolved Hide resolved
@y-chan
Copy link
Member Author

y-chan commented Mar 18, 2022

size_tの利用、ポインタ渡しから参照渡しへの変更等行ってみました。
個人的には型が明示されている方が良いので、ここではautoには書き換えずそのままにしておきました。

@qwerty2501
Copy link
Contributor

LGTM

core/src/core.h Outdated
* @param output_wav 音声データを出力する先のポインタ。使用が終わったらvoicevox_wav_freeで開放する必要がある
* @return 結果コード
*/
VOICEVOX_CORE_API VoicevoxResultCode voicevox_tts_from_aquestalk_notation(const char *text, int64_t speaker_id,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あ、念の為にaquestalkは関数名に含めない方針にしておくとトラブルが無くてよいのかなと感じました!
エンジンのときは kana 引数だったので、真似ると from_kana とか・・・?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確かにそうですね...!
変更しておきました!

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!(たぶん)

たしかにそろそろテストがほしいなと感じました!

Comment on lines +77 to +78
size_t char_size;
std::string letter = extract_one_character(phrase, base_index, char_size);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

char_sizeは返り値ですよね、一般的じゃないのかもですがstd::pairやtupleでreturnすれば左辺に書けるので見やすくなるのかもと思いました。
たぶんこう書けるはず

auto [letter, char_size] = extract_one_character(phrase, base_index)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

それをやるのであれば、専用のreturn用のstructや構造体を作ったほうがわかりやすいのではないですか?
tupleなどは型情報しか示せるものがないので何番目のfieldが何を示しているかがわかりにくいと思います。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

変数名になるかフィールド名になるかの違いなので、実装されてさえいればまあどっちでもいいのかなと思いました。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

変数名になるかフィールド名になるかの違いなので、まあどっちでもいいのかなと思いました。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

結構違いはあります。
tupleで返して変数で受け取る場合、呼び出し側が適切に意味を理解して明示的に変数名をつけなくてはなりません。
対してstructで返す場合field名をつけるのは関数実装者のためその関数を呼び出す側はfield名を見るだけでそれがどういった意味を持っているか知ることができます。
これは例えば新規で開発に携わる人が何も知らない状態で extract_one_character を呼び出す場合にその戻り値がどういった意味を持っているか理解する手助けにはなります。
もちろんtupleで返す実装の方が extract_one_character を実装する側は楽だとは思いますが

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

私見なので私の意見を採用するかはおまかせといった感じです! 👍

Copy link
Contributor

@qwerty2501 qwerty2501 Mar 19, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ちなみにC++の場合参照を渡すほうが適切な場合もあります。戻り値のサイズが大きすぎる場合。
今回はそこまでサイズは大きくないのでその必要はないと思いますが

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ちなみに理由は、 Hoge hoge = hogeFunc() だとコピーが発生するためでしょうか?
初期化の際はstd::moveになるのかなと思っていたのですが、もしかして関数の戻り値は初期化の際もコピー・・・?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ちょっと説明がややこしいんですが、結論から言うとコピーが発生するためですね。

初期化の際はstd::moveになるのかなと思っていたのですが、もしかして関数の戻り値は初期化の際もコピー・・・?

正確にはstd::moveになるではなくて右辺値になるですね。まあmoveされた結果右辺値になるので概ね解釈としてはあってると思います。これは関数の戻り値も同様です。
上記の例だと例えばHoge classにstringやvectorのフィールドがあったとしてもその各フィールドで確保されてるheap領域についてはmoveされるのでコピーは発生しません。
しかしスタックメモリの実装上関数が終わるとその関数のスタック領域は破棄されてしまうので hogeFunc の戻り値の型が ポインタや参照でもなく Hoge そのものを返すものだった場合どうしても hogeFunc のスタック領域から呼び出し側のスタック領域へのコピーは発生してしまいます。そのため Hoge classのフィールドがint64のものを沢山持っているなどclassのサイズが大きな場合はC++でも出力用の引数を参照で受け取るような実装はありえます。
もちろん hogeFunc の戻り値の型を unique_ptr<Hoge> といった風にheap領域で確保した状態でreturnするという回避方法もあります。(このプロジェクトだとこっちのほうがあってるかも)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

おお、なるほどです。
最近のコンパイラだとスタック領域の移動がなくなるようにコンパイルしてくれたり・・・?
だとしてもコンパイラ依存になっちゃうので、明示的にunique_ptr使ったりしたほうが良さそうに感じます。
勉強になりました。

後から見る方のメモとして、結論としては、実装者に依存してpairで返すのも構造体で返すのもどっちでも良いという感じです!

@Hiroshiba Hiroshiba merged commit beee7ca into VOICEVOX:cpp-library Mar 19, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants