Skip to content

Commit

Permalink
[Rust]C++ Windows向けのexampleを修正します (#208)
Browse files Browse the repository at this point in the history
* rustのAPIに追従するように変更

* README.md修正

* GetOpenJTalkDictの戻り値をUTF-8に変更。
wide_to_multi_capi関数が不要になったので削除。

Co-authored-by: shigobu <[email protected]>
Co-authored-by: kasamatsu <[email protected]>
  • Loading branch information
3 people authored Jul 28, 2022
1 parent 411a82e commit 6570c0d
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 52 deletions.
19 changes: 13 additions & 6 deletions example/cpp/windows/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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」の場所を確認してください。

Expand All @@ -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
Expand Down
4 changes: 0 additions & 4 deletions example/cpp/windows/simple_tts/packages.config

This file was deleted.

48 changes: 27 additions & 21 deletions example/cpp/windows/simple_tts/simple_tts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#include <vector>
#include <fstream>

#include "..\..\..\core\src\core.h"
#include "core.h"

#define OPENJTALK_DICT_NAME L"open_jtalk_dic_utf_8-1.11"

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -108,23 +111,13 @@ std::wstring GetExeDirectory() {
}

/// <summary>
/// ワイド文字列をShift_JISに変換します
/// コンソール画面にエラーメッセージを出力します
/// </summary>
/// <param name="src">ワイド文字列</param>
/// <returns>Shift_JIS文字列</returns>
/// <remarks>
/// https://nekko1119.hatenablog.com/entry/2017/01/02/054629 から引用
/// </remarks>
std::string wide_to_multi_capi(std::wstring const& src) {
std::size_t converted{};
std::vector<char> 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<char>::length(dest.data()));
dest.shrink_to_fit();
return std::string(dest.begin(), dest.end());
/// <param name="messageCode">メッセージコード</param>
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;
}

/// <summary>
Expand All @@ -139,3 +132,16 @@ std::string wide_to_utf8_cppapi(std::wstring const& src) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
return converter.to_bytes(src);
}

/// <summary>
/// UTF8をワイド文字に変換します。
/// </summary>
/// <param name="src">UTF8文字列</param>
/// <returns>ワイド文字列</returns>
/// <remarks>
/// https://nekko1119.hatenablog.com/entry/2017/01/02/054629 から引用
/// </remarks>
std::wstring utf8_to_wide_cppapi(std::string const& src) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
return converter.from_bytes(src);
}
6 changes: 4 additions & 2 deletions example/cpp/windows/simple_tts/simple_tts.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
#pragma once
#include <iostream>
#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);
void OutErrorMessage(VoicevoxResultCode messageCode);
std::string wide_to_utf8_cppapi(std::wstring const& src);
std::wstring utf8_to_wide_cppapi(std::string const& src);
15 changes: 1 addition & 14 deletions example/cpp/windows/simple_tts/simple_tts.vcxproj
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Microsoft.ML.OnnxRuntime.1.10.0\build\native\Microsoft.ML.OnnxRuntime.props" Condition="Exists('..\packages\Microsoft.ML.OnnxRuntime.1.10.0\build\native\Microsoft.ML.OnnxRuntime.props')" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
Expand Down Expand Up @@ -165,18 +164,6 @@
<ItemGroup>
<ClInclude Include="simple_tts.h" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
<Import Project="..\packages\Microsoft.ML.OnnxRuntime.1.10.0\build\native\Microsoft.ML.OnnxRuntime.targets" Condition="Exists('..\packages\Microsoft.ML.OnnxRuntime.1.10.0\build\native\Microsoft.ML.OnnxRuntime.targets')" />
</ImportGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Microsoft.ML.OnnxRuntime.1.10.0\build\native\Microsoft.ML.OnnxRuntime.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.ML.OnnxRuntime.1.10.0\build\native\Microsoft.ML.OnnxRuntime.props'))" />
<Error Condition="!Exists('..\packages\Microsoft.ML.OnnxRuntime.1.10.0\build\native\Microsoft.ML.OnnxRuntime.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.ML.OnnxRuntime.1.10.0\build\native\Microsoft.ML.OnnxRuntime.targets'))" />
</Target>
<ImportGroup Label="ExtensionTargets" />
</Project>
5 changes: 0 additions & 5 deletions example/cpp/windows/simple_tts/simple_tts.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,4 @@
<Filter>ヘッダー ファイル</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)..\..\runtimes\win-x64\native\onnxruntime_providers_shared.dll" />
<None Include="$(MSBuildThisFileDirectory)..\..\runtimes\win-x64\native\onnxruntime.dll" />
<None Include="packages.config" />
</ItemGroup>
</Project>

0 comments on commit 6570c0d

Please sign in to comment.