From 6570c0d5ca4974aa6891f2a6396ffec97b255dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=97=E3=81=94=E3=81=B6?= <32050537+shigobu@users.noreply.github.com> Date: Fri, 29 Jul 2022 01:23:33 +0900 Subject: [PATCH] =?UTF-8?q?[Rust]C++=20Windows=E5=90=91=E3=81=91=E3=81=AEe?= =?UTF-8?q?xample=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=97=E3=81=BE=E3=81=99=20?= =?UTF-8?q?(#208)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * rustのAPIに追従するように変更 * README.md修正 * GetOpenJTalkDictの戻り値をUTF-8に変更。 wide_to_multi_capi関数が不要になったので削除。 Co-authored-by: shigobu Co-authored-by: kasamatsu --- example/cpp/windows/README.md | 19 +++++--- .../cpp/windows/simple_tts/packages.config | 4 -- example/cpp/windows/simple_tts/simple_tts.cpp | 48 +++++++++++-------- example/cpp/windows/simple_tts/simple_tts.h | 6 ++- .../cpp/windows/simple_tts/simple_tts.vcxproj | 15 +----- .../simple_tts/simple_tts.vcxproj.filters | 5 -- 6 files changed, 45 insertions(+), 52 deletions(-) delete mode 100644 example/cpp/windows/simple_tts/packages.config diff --git a/example/cpp/windows/README.md b/example/cpp/windows/README.md index 499880ac5..6a087792a 100644 --- a/example/cpp/windows/README.md +++ b/example/cpp/windows/README.md @@ -10,16 +10,23 @@ Visual Studio Installerを使用しインストールしてください。 ### 環境構築・ビルド方法 -ビルドして実行するには、「core.dll」「core.lib」「Open JTalk辞書フォルダ」が必要です。 以下はDebug x64でビルドする場合です。他の構成・プラットフォーム向けにビルドする場合は、適宜読み替えてください。 -Releasesから「voicevox_core-windows-x64-cpu-{バージョン名}.zip」をダウンロードします。 -zipファイルを展開し、展開されたフォルダに含まれているdllファイルを「core.dll」にリネームします。 出力フォルダを作成するために、一度ビルドします。「windows_example.sln」をVisual Studioで開き、メニューの「ビルド」→「ソリューションのビルド」を押します。 この段階では、ビルドは失敗します。「bin」フォルダと「lib」フォルダが生成されていればOKです。 +Releasesから「voicevox_core-windows-x64-cpu-{バージョン名}.zip」をダウンロードし、展開します。 +展開してできたファイルをそれぞれ下記のフォルダへ配置します。 -「core.lib」を「simple_tts\lib\x64」に配置します。 -「core.dll」を「simple_tts\bin\x64\Debug」に配置します。 +- simple_tts に配置 + - core.h + +- simple_tts\bin\x64\Debug に配置 + - core.dll + - onnxruntime.dll + - onnxruntime_providers_shared.dll + +- simple_tts\lib\x64 に配置 + - core.lib もう一度ビルドします。今度は成功するはずです。失敗した場合は、「core.lib」の場所を確認してください。 @@ -31,7 +38,7 @@ http://open-jtalk.sourceforge.net/ を開き、Dictionary for Open JTalk 欄の 最終的には以下のようなフォルダ構成になっているはずです。 ``` simple_tts -│ packages.config +│ core.h │ simple_tts.cpp │ simple_tts.h │ simple_tts.vcxproj diff --git a/example/cpp/windows/simple_tts/packages.config b/example/cpp/windows/simple_tts/packages.config deleted file mode 100644 index 07a94bc06..000000000 --- a/example/cpp/windows/simple_tts/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/example/cpp/windows/simple_tts/simple_tts.cpp b/example/cpp/windows/simple_tts/simple_tts.cpp index 3fd6f2fc4..48a6c1251 100644 --- a/example/cpp/windows/simple_tts/simple_tts.cpp +++ b/example/cpp/windows/simple_tts/simple_tts.cpp @@ -14,7 +14,7 @@ #include #include -#include "..\..\..\core\src\core.h" +#include "core.h" #define OPENJTALK_DICT_NAME L"open_jtalk_dic_utf_8-1.11" @@ -28,14 +28,17 @@ int main() { std::wcin >> speak_words; std::wcout << L"coreの初期化中" << std::endl; - initialize(false); + if (!initialize(false, 0, true)) { + std::wcout << L"coreの初期化に失敗しました" << std::endl; + return 0; + } VoicevoxResultCode result = VoicevoxResultCode::VOICEVOX_RESULT_SUCCEED; std::wcout << L"openjtalk辞書の読み込み" << std::endl; result = voicevox_load_openjtalk_dict(GetOpenJTalkDict().c_str()); if (result != VoicevoxResultCode::VOICEVOX_RESULT_SUCCEED) { - std::cout << voicevox_error_result_to_message(result) << std::endl; + OutErrorMessage(result); return 0; } @@ -45,7 +48,7 @@ int main() { uint8_t* output_wav = nullptr; result = voicevox_tts(wide_to_utf8_cppapi(speak_words).c_str(), speaker_id, &output_binary_size, &output_wav); if (result != VoicevoxResultCode::VOICEVOX_RESULT_SUCCEED) { - std::cout << voicevox_error_result_to_message(result) << std::endl; + OutErrorMessage(result); return 0; } @@ -71,7 +74,7 @@ int main() { std::string GetOpenJTalkDict() { wchar_t buff[MAX_PATH] = {0}; PathCchCombine(buff, MAX_PATH, GetExeDirectory().c_str(), OPENJTALK_DICT_NAME); - std::string retVal = wide_to_multi_capi(buff); + std::string retVal = wide_to_utf8_cppapi(buff); return retVal; } @@ -108,23 +111,13 @@ std::wstring GetExeDirectory() { } /// -/// ワイド文字列をShift_JISに変換します。 +/// コンソール画面にエラーメッセージを出力します。 /// -/// ワイド文字列 -/// Shift_JIS文字列 -/// -/// https://nekko1119.hatenablog.com/entry/2017/01/02/054629 から引用 -/// -std::string wide_to_multi_capi(std::wstring const& src) { - std::size_t converted{}; - std::vector dest(src.size() * sizeof(wchar_t) + 1, '\0'); - if (::_wcstombs_s_l(&converted, dest.data(), dest.size(), src.data(), _TRUNCATE, ::_create_locale(LC_ALL, "jpn")) != - 0) { - throw std::system_error{errno, std::system_category()}; - } - dest.resize(std::char_traits::length(dest.data())); - dest.shrink_to_fit(); - return std::string(dest.begin(), dest.end()); +/// メッセージコード +void OutErrorMessage(VoicevoxResultCode messageCode) { + const char* utf8Str = voicevox_error_result_to_message(messageCode); + std::wstring wideStr = utf8_to_wide_cppapi(utf8Str); + std::wcout << wideStr << std::endl; } /// @@ -139,3 +132,16 @@ std::string wide_to_utf8_cppapi(std::wstring const& src) { std::wstring_convert> converter; return converter.to_bytes(src); } + +/// +/// UTF8をワイド文字に変換します。 +/// +/// UTF8文字列 +/// ワイド文字列 +/// +/// https://nekko1119.hatenablog.com/entry/2017/01/02/054629 から引用 +/// +std::wstring utf8_to_wide_cppapi(std::string const& src) { + std::wstring_convert> converter; + return converter.from_bytes(src); +} diff --git a/example/cpp/windows/simple_tts/simple_tts.h b/example/cpp/windows/simple_tts/simple_tts.h index 14e2316bb..d47db255f 100644 --- a/example/cpp/windows/simple_tts/simple_tts.h +++ b/example/cpp/windows/simple_tts/simple_tts.h @@ -1,9 +1,11 @@ #pragma once #include +#include "core.h" std::string GetOpenJTalkDict(); std::wstring GetWaveFileName(); std::wstring GetExePath(); std::wstring GetExeDirectory(); -std::string wide_to_multi_capi(std::wstring const& src); -std::string wide_to_utf8_cppapi(std::wstring const& src); \ No newline at end of file +void OutErrorMessage(VoicevoxResultCode messageCode); +std::string wide_to_utf8_cppapi(std::wstring const& src); +std::wstring utf8_to_wide_cppapi(std::string const& src); \ No newline at end of file diff --git a/example/cpp/windows/simple_tts/simple_tts.vcxproj b/example/cpp/windows/simple_tts/simple_tts.vcxproj index 1a48276fa..36d3fe45d 100644 --- a/example/cpp/windows/simple_tts/simple_tts.vcxproj +++ b/example/cpp/windows/simple_tts/simple_tts.vcxproj @@ -1,6 +1,5 @@ - Debug @@ -165,18 +164,6 @@ - - - - - - - - - このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。 - - - - + \ No newline at end of file diff --git a/example/cpp/windows/simple_tts/simple_tts.vcxproj.filters b/example/cpp/windows/simple_tts/simple_tts.vcxproj.filters index a96485cbb..e4e6173bf 100644 --- a/example/cpp/windows/simple_tts/simple_tts.vcxproj.filters +++ b/example/cpp/windows/simple_tts/simple_tts.vcxproj.filters @@ -24,9 +24,4 @@ ヘッダー ファイル - - - - - \ No newline at end of file