Windows 10. Я установил японские голоса TTS в настройках. Теперь, когда я использую перечисление голоса в Speech API 5.4 OneCore (но не в версии 5.4), я получаю 6 голосов:
- David
- Zira
- Ayumi
- Харука
- Марка
- Ичиро
На странице настроек речи также показаны эти 6. Но в реестре явно седьмой, Саяка ( 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);
}
Единственное упоминание о Саяке онлайн, которое я могу найти, это здесь
Edit
Перечисление с помощью Reset () / Next () дает то же самое 6. Попытка создать токен непосредственно вокруг пути реестра выдает ошибку 0x8004503a (SPERR_NOT_FOUND
). Во время просмотра с помощью Process Monitor обнаруживается интересный факт: вместо Sayaka под HKLM процесс запрашивает следующий ключ :
HKCU \ Software \ Microsoft \ Speech_OneCore \ Isolated \ 7WUiMB20NMV5Y7TgZ2WJXbUw32iGZQSvSkeaf0AevtQ \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Speech_OneCore \ Голос \ Лексема \ MSTTS_V110_jaJP_SayakaM
там это действительно ключ, как, что в HKCU, и она не содержит копию HKLM и HKCU настройки для SAPI, и есть на самом деле нет Саяка под Голоса в этом ключе. Только шесть я упомянул.
Так что происходит какая-то изоляция с настройками SAPI в нескольких экземплярах. Под Isolated
есть 7 разных подключей, а для них разные голосовые наборы. Два содержат голоса, которые не имеют ничего общего с теми, которые мы знаем, и те имеют отношение к Кортане. Трудно сказать, что такое единица изоляции - может быть, пользователь, может быть, пакет приложения (в смысле UWP).
Редактировать
Как я и подозревал, происходит изоляция на основе пакета приложения. Я создал новый проект с тем же кодом, запустил его и получил другой ключ изоляции - F2yLLxINh6S1e3y3MkJo4ilfh036RB_9pHLEVL88yL0
. Похоже, что каждый раз, когда вы запускаете приложение с поддержкой SAPI, оно выводит профиль изоляции из текущего исполняемого файла. Мгновение go, этого профиля изоляции не было, теперь оно есть. Так что он был создан SAPI на лету. Я не думаю, что голоса жестко запрограммированы, поэтому он скопировал голоса из профиля изоляции откуда-то из основного списка.
Где находится главный список? Это не HKLM\...\Speech_OneCore
, так как можно увидеть Саяку там. Это может быть tokens_TTS_ja-JP.xml
под C:\Windows\SysWOW64\Speech_OneCore\Common\ja-JP
, так как там есть Аюми / Ичиро / Харука, а Саяка - нет. Безопасность этого файла довольно сурова, но у меня проблемы с редактированием этого файла даже с правами администратора. Кроме того, это вторая жесткая ссылка на 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 может написать это.
Кстати, логика изоляции c указана c для OneCore. SetId()
в SAPI 5.4 правильно просматривает ключ, соответствующий предоставленному Id
.
Альтернативный подход: в документах SAPI 5.4 упоминается интерфейс ISpRegDataKey, который позволяет инициализировать токен непосредственно из HKEY , Это не в typelib.