c++ - 让 Sapi 说出一个字符串

标签 c++ string sapi

我有一个程序要求一个人将他们想要翻译成 Al Bhed 的文本,这只是一种将字母四处移动的密码,并让 SAPI 说出来。字符串翻译得很好,但是这段代码:

hr = pVoice->Speak(sTranslated, 0, NULL);

将不起作用,因为它表示“不存在从‘std::string’到‘const WCHAR*’的合适转换函数。 我只想让声音说出翻译后的字符串。我该怎么做?

最佳答案

首先,您需要将使用 char 类型的 std::string 内容转换为 std::wstring,它使用输入 wchar_t。这是因为 ISpVoice::Speak() 函数要求第一个参数是 LPCWSTR 类型,IOW 是“指向宽字符串的常量指针” .以下功能可能对您有所帮助。

inline std::wstring s2w(const std::string &s, const std::locale &loc = std::locale())
{
    typedef std::ctype<wchar_t> wchar_facet;
    std::wstring return_value;
    if (s.empty())
    {
        return return_value;
    }
    if (std::has_facet<wchar_facet>(loc))
    {
        std::vector<wchar_t> to(s.size() + 2, 0);
        std::vector<wchar_t>::pointer toPtr = &to[0];
        const wchar_facet &facet = std::use_facet<wchar_facet>(loc);
        if (0 != facet.widen(s.c_str(), s.c_str() + s.size(), toPtr))
        {
            return_value = to.data();
        }
    }
    return return_value;
}

然后将代码行更改为以下内容。

hr = pVoice->Speak(s2w(sTranslated).c_str(), 0, NULL);

c_str() 方法返回指向 std::wstring 对象的“等效 C 字符串”的指针。 IOW,它返回一个指向以 null 结尾的宽字符串的指针。

关于c++ - 让 Sapi 说出一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26132995/

相关文章:

c++ - 关于sizeof的一个疑问

c++ - 使用 netbeans 调试由脚本加载的 C++ 动态库

.net - 如何在 .NET 中通过索引有效地覆盖字符串的一部分?

java - 在 Android 的 java 中使用 Microsoft Speech API 文本转语音?

c++ - ## 运算符是什么?

c++ - 使用 getline 读取文件/输入时出现段错误

java - PHP数组输出

windows-server-2008 - Windows Server 2008 : Speech Runtime - What am I missing?

vbscript - 如何在 VBScript 中将 SAPI 文本保存为语音文件?

c++ - 我的功能有什么问题