Windows TTS

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Ответить
Flammeus_Felis
Сообщения: 1
Зарегистрирован: Пн апр 07, 2025 5:15 pm
Благодарил (а): 0
Поблагодарили: 0

Windows TTS

Сообщение Flammeus_Felis » Пн апр 07, 2025 6:06 pm

Расскажу про свой опыт озвучки через этот модуль. Думаю поможет всем кого бесит косноязычные ирина и давид.

Начнем с того что в 11 вин есть такое явление как natural voice. Это те же встроенные sapi, но обработка происходит онлайн.
Изначально была идея подтянуть озвучку через Balabolka, а точнее через её консольную версию balcon, но позднее разобрался как припаять возможность использования дополнительных sapi через этот модуль.
Добавить в систем дополнительные голоса можно по инструкции той же балаболки: https://www.cross-plus-a.com/ru/balabolka.html Там все банально: две кнопки и редактор списка голосов.
Однако наш модуль подтягивает только голос выбранный в системе, а система не выводит ничего кроме своих родимых голосов. Через реестр это не решается т.к. токены натуральных голосов и стандартных отличаются.
В коде модуля видим что он подтягивает три файла скрипта из папки: .\majordomo\htdocs\rc исходя из условий генерации: sapi_cach_only.js , sapi_cachd.js , sapi.js
Во всех файлах ищем строчку

Код: Выделить всё

var sv = WScript.CreateObject("SAPI.SpVoice"); 
Ниже дописываем код чтобы получилось :

Код: Выделить всё

    var sv = WScript.CreateObject("SAPI.SpVoice");
	var voices = sv.GetVoices();
	for (var i = 0; i < voices.Count; i++) {
    WScript.Echo(voices.Item(i).GetDescription());
	}
	sv.Voice = voices.Item(0);
В последней строчке Item(0) и есть наш индекс голоса в списке. Чтобы получить индекс, придумал немного кривой способ: ставим AutoHotkey, выполняем скрипт :

Код: Выделить всё

SpVoice := ComObjCreate("SAPI.SpVoice")
Voices := SpVoice.GetVoices()
outputFile := "VoiceList.txt"

; Очищаем файл перед записью
if FileExist(outputFile)
    FileDelete, %outputFile%

Loop, % Voices.Count() {
    index := A_Index - 1  ; Индексы начинаются с 0
    voiceName := Voices.Item(index).GetDescription()
    FileAppend, %index%: %voiceName%`n, %outputFile%
}

MsgBox, Список голосов сохранен в файл "%outputFile%"!

В папке со скриптом появится текстовый файл вида:

Код: Выделить всё

0: Microsoft Irina Desktop - Russian
1: Microsoft Zira Desktop - English (United States)
2: Microsoft David Desktop - English (United States)
3: Microsoft Adri Online (Natural) - Afrikaans (South Africa)
4: Microsoft Willem Online (Natural) - Afrikaans (South Africa)
5: Microsoft Ameha Online (Natural) - Amharic (Ethiopia)
6: Microsoft Mekdes Online (Natural) - Amharic (Ethiopia)
7: Microsoft Fatima Online (Natural) - Arabic (United Arab Emirates)
8: Microsoft Hamdan Online (Natural) - Arabic (United Arab Emirates)
9: Microsoft Ali Online (Natural) - Arabic (Bahrain)
10: Microsoft Laila Online (Natural) - Arabic (Bahrain)
...
цифра в списке и есть наш индекс. Меняем в последней строке нолик на наше число и готово! Все в целом работает, из минусов при пропаже интернета он замолкает.
В текст можно еще добавить параметры типа sv.Volume и sv.Rate.

По моем лучший способ получить пригодную озвучку без без api и танцев с бубнами. Кстати устанавливать голоса от того же Rhvoice тоже можно, только обновите список индексов.
Из замеченных приколов: если фраза была произнесена одним голосом, то при смене индекса он будет из кэша тянуть старю запись, старым голосом.
Ответить