Windows 10.我已经在“设置”中安装了日语TTS语音。现在,当我在Speech API 5.4 OneCore中使用语音枚举时(虽然在5.4中不是正确的),我得到6种语音:
“语音设置”页面还显示了这6个。但是注册表中的Sayaka(HKLM\SOFTWARE\WOW6432Node\Microsoft\Speech_OneCore\Voices\Tokens\MSTTS_V110_jaJP_SayakaM
)显然是第七个。其文件位于C:\windows\Speech_OneCore\Engines\TTS\ja-JP
下。与其余的相比,有一个额外的文件.heq
。为什么不枚举?
枚举代码为:
#import "libid:E6DA930B-BBA5-44DF-AC6F-FE60C1EDDEC8" rename_namespace("SAPI") //v5.4 OneCore
HRESULT hr;
SAPI::ISpVoicePtr v;
v.CreateInstance(__uuidof(SAPI::SpVoice));
SAPI::ISpObjectTokenPtr tok;
hr = v->GetVoice(&tok); //Retrieve the default voice
SAPI::ISpObjectTokenCategoryPtr cat;
hr = tok->GetCategory(&cat); //Retrieve the voices category
SAPI::IEnumSpObjectTokensPtr toks;
hr = cat->EnumTokens(0, 0, &toks);
//And enumerate
unsigned long i, n;
hr = toks->GetCount(&n);
LPWSTR ws;
for (i = 0; i < n; i++)
{
hr = toks->Item(i, &tok);
hr = tok->GetId(&ws);
CoTaskMemFree(ws);
}
我唯一能找到的在线Sayaka就是here
编辑:通过Reset()/ Next()进行枚举将得到相同的6。尝试直接在注册表路径周围创建令牌将产生错误0x8004503a(SPERR_NOT_FOUND
)。 [在使用Process Monitor观看时这样做揭示了一个有趣的事实:该过程而不是HKLM下的Sayaka,而是询问以下密钥:
HKCU \ Software \ Microsoft \ Speech_OneCore \ Isolated \ 7WUiMB20NMV5Y7TgZ2WJXbUw32iGZQSvSkeaf0AevtQ \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Speech_OneCore \ Voices \ Tokens \ MSTTS_Vka_ja>
[在HKCU中确实有一个键,它包含HKLM和HKCU的SAPI设置的副本,并且该键中的Voices下确实没有Sayaka。我刚才提到的六个。
所以正在进行某种隔离,将SAPI设置复制到多个副本中。 Isolated
下有7个不同的子键,而这些下的音色集也不同。其中两个包含与我们所知道的声音没有共同点的声音,而这些声音与Cortana有关。很难说出隔离的单位是什么-也许是用户,也许是应用程序包(就UWP而言)。
编辑:就像我怀疑的那样,正在进行基于应用程序包的隔离。我用相同的代码创建了一个全新的项目,运行它,并获得了另一个隔离键-F2yLLxINh6S1e3y3MkJo4ilfh036RB_9pHLEVL88yL0
。看起来每次您运行启用了SAPI的应用程序时,它都会创建一个全新的隔离配置文件。不久之前,该隔离配置文件不存在,现在已经存在。因此它是由SAPI即时创建的。我不认为声音是硬编码的,因此它从主列表的某个位置复制了声音在隔离配置文件中。问题-主列表在哪里?不是HKLM\...\Speech_OneCore
,因为可以看到Sayaka在那儿。可能是tokens_TTS_ja-JP.xml
下的C:\Windows\SysWOW64\Speech_OneCore\Common\ja-JP
,因为此处列出了Ayumi / Ichiro / Haruka,但Sayaka并未列出。不过,该文件的安全性非常严格,即使拥有管理员权限,我也无法编辑该文件。另外,这是C:\Windows\WinSxS\wow64_microsoft-windows-t..peech-ja-jp-onecore_31bf3856ad364e35_10.0.18362.1_none_46741f8a666da90a
的第二个硬链接。
SysWOW64\Speech_OneCore
文件夹允许管理员写入,但SysWOW64\Speech_OneCore\Common
不允许。只有TrustedInstaller可以编写它。
Windows 10.我已经在“设置”中安装了日语TTS语音。现在,当我在Speech API 5.4 OneCore中使用语音枚举时(虽然不是在5.4中正确使用),我会收到6种声音:David Zira Ayumi Haruka ...
不是解决方案,而是解决方法。