- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近刚刚下载了 Visual Studio 2015(社区),以便我可以使用 Microsoft SAPI TTS 开发应用程序。我已经安装了 5.1 SDK,随后安装了 5.4 SDK for Speech,并安装了 Runtime Languages for SAPI。
到目前为止,我可以通过使用我希望 SAPI 通过直接参数和读取 SSML .XML 文件来表达的短语来设法让应用程序正常工作。 SAPI 和 SSML 的所有功能都可以工作,除了与更改语音 token 有关的任何事情。 (例如,<voice xml:lang="pl-PL">
... <voice required="Gender:Female">
... 等)
我阅读了一些关于如何设置语言/语音 token 的论坛,并且我尝试了以下代码:
if(FAILED(::CoInitialized(NULL))
return false;
HRESULT hr = S_OK;
CComPtr<ISpVoice> cpVoice;
CComPtr<ISpObjectTokenCategory> cpObjectCat;
CComPtr<ISpObjectToken> cpObjectToken;
CComPtr<IEnumSpObjectTokens> cpEnum;
hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&cpVoice);
if(SUCCEEDED(hr))
{
hr = SpGetDefaultTokenFromCategoryId(SPCAT_VOICES, &cpObjectToken);
}
if(SUCCEEDED(hr))
{
hr = SpGetCategoryFromId(SPCAT_VOICES, &cpObjectCat);
}
if(SUCCEEDED(hr))
{
hr = cpObjectCat->EnumTokens(NULL, NULL, &cpEnum);
}
if(SUCCEEDED(hr))
{
hr = cpEnum->Next(1, &cpObjectToken, NULL);
//Currently only concerned with making 1 token assign without
//throwing exception
}
if(SUCCEEDED(hr))
{
hr = cpVoice->SetVoice(cpObjectToken);
}
if(SUCCEEDED(hr))
{
hr = cpVoice->Speak(L"Hello There!", NULL, NULL);
}
//... lots of commented-out code here ...
cpVoice.Release();
::CoUninitialize();
return true; // <-- Throws Exception Here
程序构建没有错误,但在最终返回语句中抛出错误 0xC0000005(内存访问冲突)。
我确实必须修改头文件 <sphelper.h>
由于不推荐使用的方法::GetVersionExW() ...我设法使用此链接中的方法使其工作:http://www.codeproject.com/Articles/678606/Part-Overcoming-Windows-s-deprecation-of-GetVe .奇迹般地(并且对系统源代码进行了一些调整,这可能是个坏主意),它成功了。
我不知道为什么程序会在最后抛出错误,因为问题一定出在访问注册表 token 的程序中。我知道问题通常出在指针上,那么我需要做什么才能完成这项工作?
请注意,我正在尝试制作 cpVoice
对象使用波兰语标记“Paulina”。有没有办法以某种方式手动将注册表 token 值分配给对象?
最佳答案
这就是您检查每个已安装声音的方式。 pszCurTokenId 将是您所听到的声音的描述。您可能会将其打印到控制台或其他东西,或者只查看调试器中的值。
您不必编辑 sphelper.h 即可正确选择语音。有时 SAPI 可能需要几秒钟才能改变声音,所以如果感觉它挂了,我会耐心等待。我刚刚在 Windows 7 上运行了以下代码,并验证了它适用于该平台。
HRESULT hr = S_OK;
CComPtr<ISpObjectToken> cpVoiceToken;
CComPtr<ISpVoice> cpVoice;
::CoInitialize(NULL);
if(SUCCEEDED(hr))
hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
ULONG ulCount = 0;
CComPtr<IEnumSpObjectTokens> cpEnum;
if(SUCCEEDED(hr))
hr = SpEnumTokens(SPCAT_VOICES, NULL, NULL, &cpEnum);
//Get the number of voices
if(SUCCEEDED(hr))
hr = cpEnum->GetCount(&ulCount);
for(ULONG i = 0; i < ulCount; ++i) {
CSpDynamicString* szDescription;
CComPtr<ISpObjectToken> cpTempVoiceToken;
cpEnum->Item(i, &cpTempVoiceToken);
WCHAR* pszCurTokenId = NULL;
SpGetDescription(cpTempVoiceToken, &pszCurTokenId);
cpVoice->SetVoice(cpTempVoiceToken);
cpVoice->Speak(L"This is a test phrase.", SPF_DEFAULT, NULL);
cpTempVoiceToken.Release();
}
cpVoice.Release();
cpEnum.Release();
::CoUninitialize();
关于c++ - 基于 SAPI 的应用程序在枚举 token 时抛出内存访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35925377/
我的任务是将不是来自人类直接语音的音频文件转换为文本。 例如,如果我将“Hello there”存储在 wav 文件中,它将把它转录成文本并在屏幕上显示“Hello there”字符串。 首选任何语言
我在 C# 中为 win 7 编写了一个应用程序,它通过在 System.Speech 中使用 SharedRecognizer 使用 .NET 4.0 和 SAPI 5.4。一切都在那个环境中工作,
好的,我已经在 Windows 桌面开发论坛中提出了这个问题,但仍然没有得到答案。所以我会在这里尝试。 Microsoft Sapi 5.4 和 Microsoft Speech Platform S
首先:这不是 Delphi and SAPI 的重复项。我对“SAPI in Delphi”主题有一个具体问题。 我使用了 Delphi 2009 中出色的导入类型库指南来在组件选项板中获取 TspV
我安装了新的 SAPI5 语音。在语音程序的计算机设置中,新语音可见并可供使用。但是我的程序找不到它。为了找到它,我正在使用这部分代码,我使用 System.Speech.Synthesis 命名空间
我已经创建了一个计算机语音,我想正确对待 rate 命令。 Microsoft 白皮书对费率 (https://msdn.microsoft.com/en-us/library/ms717037(v=
请看下面的代码 main.cpp #define _ATL_APARTMENT_THREADED #include //You may derive a class from CComMod
场景: 我有 2 个命令。 1) 在谷歌上搜索“这里有任何词” 2) 打开应用程序“这里有任何单词” 问题: 既然“Search Google for”后面的词可以是任何东西,我怎么知道我要为我的 I
我是 SAPI 的新手,如果你们中的任何人能给我一个演讲来用 SAPI 文本 Hello World 示例,我将不胜感激。我知道 MS 有一些例子,如“听写”等,但我想从一个非常小的例子开始。很高兴能
我正在尝试使用 Microsoft SAPI 编写文本转语音程序。为此,我有以下代码: ISpVoice * pVoice = NULL; int main(int argc, char* argv[
我已经通过以下代码成功地在 Delphi/Lazarus 中使用 SAPI 文本转语音: procedure TForm1.Button1Click(Sender: TObject); var S
每当我尝试在我的笔记本电脑上编写任何语音识别程序时,我总是会收到如下所述的相同消息。我总是可以编译我的代码并让 Windows 窗体应用程序运行。但问题是,该程序将检测不到我的声音..程序无法运行..
我想学习 C# 的 SAPI api 来进行语音到文本识别。 我找不到任何教程。任何人都可以告诉我示例在哪里或可以在此处显示吗? 它需要支持从网络摄像头麦克风获取语音。 谢谢。 最佳答案 API 文档
有没有人知道如何使用 Microsoft 的 Windows 窗体应用程序语音识别 API 进行 STT? 最佳答案 .NET 包含一个用于语音识别的程序集。您需要添加对 的引用 System.Spe
有人能帮帮我吗?我使用 SAPI 语音文本,但我不能设置女声,这是代码,它用男声说话,但我想改变它,我想要女声 #include "stdafx.h" using namespace std; voi
我正在网上搜索如何通过 javascript 使用 SAPI 语音识别。更具体地说,我想创建一个可以在本地服务器(可能无法访问互联网)上运行的 Web 应用程序,它将文本转换为语音。 我找到了一些例子
我有一个程序要求一个人将他们想要翻译成 Al Bhed 的文本,这只是一种将字母四处移动的密码,并让 SAPI 说出来。字符串翻译得很好,但是这段代码: hr = pVoice->Speak(sTra
我正在探索在 Windows 7 Embedded 平台上同时运行的两个独立 Win32 应用程序的选项,以将它们的音频输出到音频输出设备的相应 channel (即应用程序“A”使用左声道,应用程序
当我在 C# 中使用 SpeechSynthesizer 类时,我在系统中安装了所有语音。当我在 C++ 中使用基于 COM 对象的 SAPI 时,我只得到其中的 4 个(Microsoft Anna
我真正想要实现的是这个-->假设我播放一个音频文件(使用我的应用程序),它可以从互联网流式传输/或直接从本地存储访问。现在我想将 SAPI 配置为收听此源而不是麦克风,并像往常一样将语音从音频转换为文
我是一名优秀的程序员,十分优秀!