0

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

私は今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

私は持ってRichTextBoxいますRichTextBox1

µ、ö、σ、◊◊ の 4 文字を入力できます。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

4

2 に答える 2

0

キーが文字で、値が関連する WAV ファイルであるディクショナリを使用すると、これを非常に簡単に行うことができます。次に、各文字を単純にループし、その値を辞書で調べて再生します。これを「連結音声合成」と呼びます。高速で、結果は比較的分かりやすいものですが、この方法では正確な発話に近づくことはできません。音声合成の分野では長年の研究が行われており、単純に WAV ファイルをつなぎ合わせるだけでは不十分です。

正確な音声が必要な場合は、目的の言語をサポートしている、または簡単に拡張できる他の TTS エンジンを検討してください。フェスティバルは良い選択かもしれません。

于 2013-06-17T01:09:49.670 に答える
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からこれを入手

于 2013-06-17T01:20:44.253 に答える