Сгенерировать синхронизированный текст, синхронизированный с преобразованием текста в речь слово за словом?

Как я могу сгенерировать синхронизированный текст (например, для субтитров), синхронизированный с преобразованием текста в речь (TTS) пословно?

Я хотел бы сделать это, используя высококачественные голоса SAPI5 (например, доступные на IVONA здесь), который я использовал в Windows 10.

В Windows у нас уже есть несколько хороших бесплатных программ TTS:

  1. Read4Me - открытый исходный код
  2. Balabolka - закрытый код
  3. TTSApp Собственный очень простой графический интерфейс Microsoft - в настоящее время доступно здесь - похоже, датируется 2001 годом.

TTSApp может создавать аудиофайлы в формате WAV. Balabolka создает файлы MP3 вместе с синхронизированным синхронизированным текстом как файлы LRC, используемые в караоке - НО только построчно, НЕ пословно.
Однако оба показывают пословное выделение, когда говорят вслух на экране - в реальном времени.

Если бы у меня был исходный код TTS / SAPI5, я мог бы просто проверять часы каждый раз, когда начинает генерироваться новое слово, и записывать время и это слово в файл. Кто-нибудь знает какой-нибудь проект, предлагающий такой уровень программирования - так что я могу начать с него?

ОБНОВЛЕНИЕ СЕНТЯБРЬ 2016 г.

С тех пор я обнаружил, что приложение TTSApp было повторно реализовано с использованием AutoHotKey некоего jballi в 2012 году.

Я адаптировал этот код для добавления в текстовый файл времени в миллисекундах каждый раз, когда срабатывает обработчик события onWord. Тем не менее мне нужно сделать два прохода:

  1. быстрый автоматический проход для сохранения файла WAV и
  2. медленный (в реальном времени) проход, который создает файл синхронизации.

Я все еще надеюсь найти способ ускорить шаг 2.

BTW Исходный код VisualBasic, похоже, заархивирован здесь .


person GavinBrelstaff    schedule 15.03.2016    source источник
comment
Я осмотрелся и нашел это, которое могло бы помочь. Вам обязательно нужно вызвать ISpRecoResult :: GetResultTimes, если вам нужна более высокая точность, чем SPEI_SOUND_START и SPEI_SOUND_END.   -  person Lesley Gushurst    schedule 16.03.2016
comment
Спасибо, Лесли Гушерст - я проверю, что SAPI 5.1 Lipsynccode от Annosoft.   -  person GavinBrelstaff    schedule 16.03.2016
comment
Теперь я вижу - программа Lipsync решает несколько другую проблему. Да, он выдает синхронизированный текст, но при этом не синтезирует голосовой звук.   -  person GavinBrelstaff    schedule 16.03.2016
comment
Хммм ... Хорошо, если вы уже используете вызов Speak в TTS, вы вообще изучали SPEI_WORD_BOUNDARY?   -  person Lesley Gushurst    schedule 16.03.2016


Ответы (1)


Все это можно делать офлайн!

Вы создаете файл WAV с помощью SAPI, указав DoEvents - задокументировано здесь.

Двоичное представление каждого события (например, фонема / слово / предложение) добавляется в конец файла WAV. Некий Ханс задокументировал формат WAV / SAPI в 2009 г. здесь.

Все это можно сделать путем простой модификации jballi 2012 AutoHotkey версия TTSApp

Обычно вы заменяете эти строки кода в Example1GUI.ahk

SpFileStream.Open(SaveToFileName,SSFMCreateForWrite,False)

;-- Set the output stream to the file stream
SpVoice.AllowAudioOutputFormatChangesOnNextSet:=False
SpVoice.AudioOutputStream:=SpFileStream

;-- Speak using the given flags
SpVoice.Speak(Text,SpeakFlags)

со следующим:

SpFileStream.Open(SaveToFileName,SSFMCreateForWrite,True) ;-- DoEvents 

;-- Set the output stream to the file stream
SpVoice.AllowAudioOutputFormatChangesOnNextSet:=False
SpVoice.AudioOutputStream:=SpFileStream

if not Sink ;-- DoEvents label
  {
    ComObjConnect(SpVoice, "On")
    Sink:=True
  }

;-- Speak using the given flags
SpVoice.Speak(Text,SpeakFlags|SVSFlagsAsync|SVSFPurgeBeforeSpeak)
person GavinBrelstaff    schedule 20.09.2016