如何在VB中创建备用文本到语音功能

时间:2013-06-16 22:09:01

标签: vb.net visual-studio text-to-speech wav

我正在尝试在我的vb应用程序中创建一个文本到语音功能。

创建文本到语音的默认方法:

Dim SAPI

SAPI = CreateObject("SAPI.spvoice")

SAPI.Speak(TextBox1.Text)

这种方法不适合我正在做的事情。

假设我有4个音频片段,片段的名称是:

  1. ba.wav ba sound

  2. a.wav a sound

  3. ka.waav ka sound

  4. ja.wav ja sound

  5. 我们说我现在有4个字符,这些字符是:

    1. μto represent the ba sound

    2. öto represent the a sound

    3. ߧto represent the ka sound

    4. ◊◊to represent the ja sound

    5. 我有RichTextBox RichTextBox1

      可以输入四个字符μ,ö,ߧ,◊◊RichTextBox1

      我现在有了这个

      Private Sub SpeakButton_Click(sender As Object, e As EventArgs) Handles SpeakButton.Click
      
      ' how do i get each character in RichTextBox1 to play when this button is clicked
      
      End Sub
      

      我不确定,但我相信应该将wav音频文件分配给相应的角色

      我知道我可以使用此方法播放wav文件

      My.Computer.Audio.Play(My.Resources.WAV-NAME, AudioPlayMode.Background)

      因此,如果RichTextBox1中的文字为◊◊ߧµ,则生成的语音输出应为JAKABA

2 个答案:

答案 0 :(得分:0)

您可以使用Dictionary轻松完成此操作,其中键是字符,值是关联的WAV文件。然后,您可以简单地遍历每个字符,在字典中查找其值,然后播放它。这被称为“连接语音合成”。它速度快,结果相对容易理解,但是用这种方法你永远不会得到准确的语音。多年的研究已经进入语音合成领域,它需要的不仅仅是简单地将WAV文件拼接在一起。

如果您需要准确的语音,您应该尝试查看可能支持您所需语言或易于扩展的其他TTS引擎。 Festival可能是个不错的选择。

答案 1 :(得分:0)

试试这个......

Dim s as String = RichTextBox1.Text
Dim fWav as String
Dim myWav As New List(Of Byte)

For x as Integer = 0 to s.Length -1
    fwav = "" 
    Select Case s.Substring(x,1)
       case "µ" : fWav = "ba.wav"
       case "ö" : fWav = "a.wav"
       case "ߧ" : fWav = "ka.wav"
       case "◊"
         If x < s.Length - 1 Then
           If s.Substring(x + 1, 1) = "◊" Then
             fWav = "ja.wav"
             x += 1
           End if  
         End if  
    End Select
    if fWav.Length > 0 Then
      if myWav.Count = 0 Then
        myWav = IO.File.ReadAllBytes(fWav).ToList
      else
        myWav = Join(myWav, IO.File.ReadAllBytes(fwav).ToList)   
      endif
    endif

Next

Dim NewWav As New System.IO.FileStream("new.wav", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write)

NewWav.WriteAllBytes("new.wav", myWav.ToArray)

NewWav.Close()

Dim snd As New System.Media.SoundPlayer("new.wav")
snd.Play()    

这是Join()函数

Private Function Join(ByVal wavBytes As List(Of Byte), ByVal wav2 As List(Of Byte)) As List(Of Byte)

    '   add on the second file excluding its header bytes
    wavBytes.AddRange(wav2.Skip(44).Take(wav2.Count - 44))


    '   rewrite the ChunkSize and Subchunk2Size fields of the Header
    Dim chunkSize As Integer = wavBytes.Count - 8
    Dim subChunk2Size As Integer = wavBytes.Count - 44

    Dim chunkSizeBytes() As Byte = BitConverter.GetBytes(chunkSize)
    Dim subChunk2SizeBytes() As Byte = BitConverter.GetBytes(subChunk2Size)
    For i = 0 To 3
        wavBytes(4 + i) = chunkSizeBytes(i)
        wavBytes(40 + i) = subChunk2SizeBytes(i)
    Next

    Return wavBytes
End Function

来自http://www.vbforums.com/showthread.php?714827-RESOLVED-Concatenate-wav-files-via-byte-array