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

Add windows cpp sample #112

Merged
merged 24 commits into from
Apr 14, 2022
Merged

Conversation

shigobu
Copy link
Contributor

@shigobu shigobu commented Apr 1, 2022

内容

Windowsで動くC++用のサンプルコードを追加します。
Microsoft Visual Studio Community 2022 で作成しています。

core.dllを暗黙的リンクするために、core.libが必要です。
自分のリポジトリでbuild.ymlを編集してlibファイルを作成するようにして使っています。後でPR出します。

出力ディレクトリにcore.dllとOpen JTalk辞書フォルダの配置が必要です。
lib\x64(or Win32)にcore.libを配置する必要があります。
出力ディレクトリとlibディレクトリはビルドすると生成されます。

OnnxRuntimeはNuGetで取得します。

関連 Issue

VOICEVOX/voicevox_project#1

その他

@shigobu shigobu marked this pull request as ready for review April 2, 2022 03:32
@shigobu
Copy link
Contributor Author

shigobu commented Apr 4, 2022

完成したので、レビューをお願いします。

@Yosshi999 Yosshi999 self-requested a review April 5, 2022 12:33
@Yosshi999
Copy link
Contributor

いまVS2022が手元にないのでとりあえずVS2019 (v142)でビルドしてみましたが、core.dllの序数5が見つからないといわれて実行できませんでした。多分こっちのローカル環境がごちゃごちゃしてるせいなのでもうちょっと調べてみますが、@shigobuさんなにか心当たりありますか?

Copy link
Contributor

@Yosshi999 Yosshi999 left a comment

Choose a reason for hiding this comment

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

[SHOULD] 実行までの手順をまとめたREADME(具体的にはこのPRの冒頭の内容)をexample/cpp/windows/のところに欲しいです。

[QUESTION] あとcore.libについてはどうしましょうか。releasesに含めるべき(cc. @Hiroshiba )か dllからlibを生成するバッチファイル を復活させるか...
動的なロードならlibファイルは要らないんでしたっけ?この選択肢はこういったVC++プロジェクトでもアリなんでしょうか


すみません。詳しいレビューはもう少し待ってください 🙇

@Oyaki122
Copy link
Member

Oyaki122 commented Apr 5, 2022

[QUESTION] あとcore.libについてはどうしましょうか。releasesに含めるべき(cc. @Hiroshiba )か dllからlibを生成するバッチファイル を復活させるか... 動的なロードならlibファイルは要らないんでしたっけ?この選択肢はこういったVC++プロジェクトでもアリなんでしょうか

.libに関しては #111 でRelease対象に含まれるようになったため問題ないと思います

@shigobu
Copy link
Contributor Author

shigobu commented Apr 6, 2022

いまVS2022が手元にないのでとりあえずVS2019 (v142)でビルドしてみましたが、core.dllの序数5が見つからないといわれて実行できませんでした。多分こっちのローカル環境がごちゃごちゃしてるせいなのでもうちょっと調べてみますが、@shigobuさんなにか心当たりありますか?

initialize関数の定義がRelease(0.12.0-preview.1)に上がっているものから変更になっています。
DLLにモデルファイルを埋め込んだのでパスを指定する引数が削除されています。
ActionsのArtifactsからダウンロードしたものを使用してください。
https://github.com/VOICEVOX/voicevox_core/actions/runs/2082324805

心当たりがあるといえばこのくらいです。
すでに、Actionsからダウンロードしたものを使用していたらすみません。

@shigobu
Copy link
Contributor Author

shigobu commented Apr 6, 2022

README追加しました。

@Yosshi999
Copy link
Contributor

core.dllの序数5が見つからないといわれて実行できませんでした

この件解決しました。core.dllのビルドに使っていたonnxruntimeとsimple_ttsが読み込んでいたonnxruntimeのバージョンが一致していませんでした。

確認ですが、

  • 出力ディレクトリに現れるonnxruntime.dllとonnxruntime_providers_shared.dllはNuGetでダウンロードしてきたMicrosoft.ML.OnnxRuntime.1.11.0 であるという認識であってますか?
  • 今のvoicevox_coreリポジトリを見る限りcore.dllがリンクするonnxruntimeは1.10.0のはずですが、@shigobuさんの環境ではbin/x64/Debug (or Release) にあるonnxruntime.dllの出所はどうなっていますか?

@shigobu
Copy link
Contributor Author

shigobu commented Apr 6, 2022

  • 出力ディレクトリに現れるonnxruntime.dllとonnxruntime_providers_shared.dllはNuGetでダウンロードしてきたMicrosoft.ML.OnnxRuntime.1.11.0 であるという認識であってますか?

あっています。

  • 今のvoicevox_coreリポジトリを見る限りcore.dllがリンクするonnxruntimeは1.10.0のはずですが、@shigobuさんの環境ではbin/x64/Debug (or Release) にあるonnxruntime.dllの出所はどうなっていますか?

NuGetでダウンロードしたMicrosoft.ML.OnnxRuntime.1.11.0です。
製品版からコピーしたかもと思って、ファイルバージョンを比較してみました。
製品版は1.10で、bin/x64/Debugにあるのは1.11でした。

@shigobu
Copy link
Contributor Author

shigobu commented Apr 6, 2022

私の環境では正常にダミー音声が再生されたので、そのままにしてたのですが、
Microsoft.ML.OnnxRuntimeのバージョンは、1.10.0にしたほうが良さそうですね。

@Yosshi999
Copy link
Contributor

Yosshi999 commented Apr 6, 2022

Microsoft.ML.OnnxRuntimeのバージョンは、1.10.0に

お願いします 🙇

将来にわたってこのexampleのバージョンを揃える必要があるので出来ればこのNuGetなしで完結するのがいいんですが、その作業は製品版にDirectMLが同梱されてからでよさそうですかね

@shigobu
Copy link
Contributor Author

shigobu commented Apr 6, 2022

OnnxRuntimeのバージョンを1.10.0に変更しました。

@Yosshi999
Copy link
Contributor

すみません。対応してもらって申し訳ないのですが、versionを揃えてもまだ序数のエラーが出てしまいました。

いまonnxruntime.dllのexportsを確認したところ、python configure.pyで拾ってくるものとNuGetが拾ってくるものが違っているようでした。もう少し調べてみます。

dumpbin /exports の結果
Dump of file example\cpp\windows\packages\Microsoft.ML.OnnxRuntime.1.10.0\runtimes\win-x64\native\onnxruntime.dll

File Type: DLL

  Section contains the following exports for onnxruntime.dll

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 00018740 OrtGetApiBase = OrtGetApiBase
          2    1 00101630 OrtSessionOptionsAppendExecutionProvider_CPU = OrtSessionOptionsAppendExecutionProvider_CPU

  Summary

       11000 .data
       31000 .pdata
       F8000 .rdata
        7000 .reloc
        1000 .rsrc
      5CB000 .text
        1000 _RDATA

-----------------------------------------------------------------------------
Dump of file onnxruntime\runtimes\win-x64\native\onnxruntime.dll

File Type: DLL

  Section contains the following exports for onnxruntime.dll

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
           5 number of functions
           5 number of names

    ordinal hint RVA      name

          1    0 00018BC0 OrtGetApiBase = OrtGetApiBase
          2    1 00133560 OrtGetWinMLAdapter = ?OrtGetWinMLAdapter@@YAPEBUWinmlAdapterApi@@I@Z (struct WinmlAdapterApi const * __cdecl OrtGetWinMLAdapter(unsigned int))
          3    2 0007A8A0 OrtSessionOptionsAppendExecutionProviderEx_DML = OrtSessionOptionsAppendExecutionProviderEx_DML
          4    3 001CE670 OrtSessionOptionsAppendExecutionProvider_CPU = OrtSessionOptionsAppendExecutionProvider_CPU
          5    4 0007A810 OrtSessionOptionsAppendExecutionProvider_DML = OrtSessionOptionsAppendExecutionProvider_DML

  Summary

       49000 .data
        1000 .didat
       39000 .pdata
      17C000 .rdata
        C000 .reloc
        1000 .rsrc
      6A3000 .text
        1000 _RDATA

</details>

@Yosshi999
Copy link
Contributor

すみませんずっと勘違いしていてDirectML版のcore.dllを使っていました。
cpu版のcore.dllにしたところちゃんと動作することを確認しました

Copy link
Contributor

@Yosshi999 Yosshi999 left a comment

Choose a reason for hiding this comment

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

日本語パスでも動作を確認しました!
いくつかコメント残したので対応お願いします。

int64_t speaker_id = 0;
int output_binary_size = 0;
uint8_t* output_wav = nullptr;
result = voicevox_tts(wide_to_utf8_cppapi(speak_words).c_str(), speaker_id, &output_binary_size, &output_wav);
Copy link
Contributor

Choose a reason for hiding this comment

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

[SHOULD] 現在のcore.dll実装には voicevox_tts に長すぎる文字列を与えるとbuffer overflowでクラッシュするというバグが存在するので、入力する文字列のbyte数に制限を与えてほしいです。
VOICEVOX/voicevox_engine#384 ここの議論にあるように2560文字くらいにするのがよさそうです。

[MAY] voicevox_ttsstd::runtime 例外が飛びうる(あと多分bad_allocも)のでcatchしてほしいです。

Copy link
Contributor

Choose a reason for hiding this comment

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

これ思ったんですがどっちもcore実装の方を直すべきですかね...

Copy link
Member

Choose a reason for hiding this comment

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

これ思ったんですがどっちもcore実装の方を直すべきですかね...

そうだと思います! #93 の時点で自分も #93 (comment) のように質問したことがあったのですが、例外処理を core 内で完結させる作業は別 PR に分けたほうが良さそうという意見に落ち着き、それ以来これについて特に進捗はない、というステートにある感じな気がします。なのでサンプル側で catch する必要はなくて、今後 core 側での作業が必要そうです。

Copy link
Contributor Author

Choose a reason for hiding this comment

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

とりあえず、現状維持しときます。

example/cpp/windows/simple_tts/simple_tts.cpp Show resolved Hide resolved
example/cpp/windows/README.md Outdated Show resolved Hide resolved
Copy link
Contributor

@Yosshi999 Yosshi999 left a comment

Choose a reason for hiding this comment

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

LGTM!

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.

あ、もし余力があれば、サンプルコードがビルドできるかのテストCIをGithub Actionsで回しておくと良いかもとちょっと思いました!
たぶんcd example/cpp/windows/simple_ttsしてmsbuildをいい感じに実行すればOKかなと・・・!

Copy link
Member

@Oyaki122 Oyaki122 left a comment

Choose a reason for hiding this comment

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

実装いただきありがとうございます
遅れましたが確認させていただきました

こちらの方で再生に関して問題がありましたが、それ以外に関しては問題ないと思います

再生の件についてはよくわかりませんでした…
とりあえず一旦Request changesにしますが、他の方で同様の事例がなさそうであればApproveします

example/cpp/windows/simple_tts/simple_tts.cpp Show resolved Hide resolved
@shigobu
Copy link
Contributor Author

shigobu commented Apr 11, 2022

あ、もし余力があれば、サンプルコードがビルドできるかのテストCIをGithub Actionsで回しておくと良いかもとちょっと思いました! たぶんcd example/cpp/windows/simple_ttsしてmsbuildをいい感じに実行すればOKかなと・・・!

build.ymlにjobを追加する形で良いでしょうか?
ビルドする時にcore.libが必要なので、どこからか持ってくる必要があります。build.ymlの中でcore.dllのビルド後に実行するのが簡単だと思いました。

私のリポジトリでブランチ分けて試しに作ってみたところ、ビルドに成功しました。

@Hiroshiba
Copy link
Member

build.ymlにjobを追加する形で良いでしょうか?

良いと思います!!
releaseにuploadする前にエラーになるとリリース作業に支障が出てしまうので、そのあとに実行される形だと利便性が損なわれず嬉しそうです!

@shigobu
Copy link
Contributor Author

shigobu commented Apr 12, 2022

build.ymlに、サンプルコードをビルドするjobを追加しました。
needs: [build-cpp-shared]を指定しているので、リリースにアップロードするjobと並列で動くはずです。

Copy link
Member

@Oyaki122 Oyaki122 left a comment

Choose a reason for hiding this comment

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

LGTM!

@Oyaki122 Oyaki122 merged commit 67de47c into VOICEVOX:main Apr 14, 2022
@Yosshi999 Yosshi999 mentioned this pull request Apr 21, 2022
y-chan pushed a commit to SHAREVOX/sharevox_core that referenced this pull request Sep 1, 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.

5 participants