4

如何逐字生成与文本转语音 ( TTS ) 同步的定时文本(例如字幕) ?

我想使用高质量的SAPI5声音(例如,这里的 IVONA 提供的声音)以及我在 Windows 10 上使用过的声音来做到这一点。

在 Windows 上,我们已经有一些不错的免费 TTS 程序:

  1. Read4Me - 开源
  2. Balabolka - 闭源
  3. TTSApp Microsoft 自己的非常基本的 GUI - 目前可在此处获得- 似乎可以追溯到 2001 年。

TTSApp 可以生成 WAV 格式的音频文件。Balabolka 创建 MP3 文件以及同步的定时文本作为卡拉 OK 中使用的 LRC 文件 - 但仅逐行而不是逐字。
然而,当他们在屏幕上大声说话时,两者都显示逐字突出显示 - 实时。

如果我有一些 TTS/SAPI5 源代码,我可以简单地在每次开始生成新单词时检查时钟并将时间和该单词写入文件。有谁知道任何公开该级别编程的项目 - 所以我可以从那里开始?

2016 年 9 月更新

从那以后,我发现 TTSApp 是在 2012 年由某个jballi使用 AutoHotKey重新实现的。

每次 onWord 事件处理程序触发时,我已经修改了该代码以将时间附加到文本文件(以毫秒为单位)。我仍然需要通过两次:

  1. 快速自动通过以保存 WAV 文件和
  2. 创建计时文件的慢速(实时)通道。

我仍然希望找到一种方法来加速第 2 步。

顺便说一句,VisualBasic 源似乎存档在这里

4

1 回答 1

0

所有这些都可以离线完成!

您在指定时使用 SAPI 生成 WAV 文件DoEvents-在此处记录。

每个事件的二进制表示(例如音素/单词/句子)被附加到 WAV 文件的末尾。某位Hans在这里记录了 2009 年的 WAV/SAPI 格式。

这一切都可以通过简单修改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)
于 2016-09-20T16:33:17.260 回答