Как заставить наше .NET приложение говорить или работа с TTS.
Первое что нужно, это установить на компьютер голосовой модуль, так как речь Microsoft SAM уж больно не профессиональная. Мне на работе пришлось столкнуться с модулем Loquendo, и поверьте, так красиво на русском даже не говорят дикторы из тв).
Устанавливаем:
Loquendo_TTS_7-Win32_Engine_Full_Distribution_7.5.2
Loquendo_TTS_7-Win32_Olga_Multimedia_High_Quality_Distribution_7.3.0
Loquendo_TTS_7-Win32_Russian_Distribution_7.3.1
Loquendo_TTS_7-Win32_SDK_Distribution_7.4.0
Эти файлы вам придется искать самостоятельно.
Далее, в проект нужно подключить библиотеки:
Imports LTTS7Lib
imports LTTS7SAPI4Lib
и написать не большой код:
Dim spch As New LTTS7Lib.LTTS7()
spch.Voice = "OLGA"
spch.Language = "RUSSIAN"
spch.ReadFile("c:\test.txt") 'возможно проблемы с кодировками
'или так
spch.Read("Текст")
Список голосов получаем так:
Dim s As String
'voice list loading
s = AxLTTS71.EnumFirstVoice("")
Do While s <> ""
cbVoices.Items.Add(s)
s = AxLTTS71.EnumNextVoice
Loop
'language list loading
s = AxLTTS71.EnumFirstLanguage("")
Do While s <> ""
cbLanguages.Items.Add(s)
s = AxLTTS71.EnumNextLanguage
Loop
Все бы хорошо, но я столкнулся с проблемой. Мне нужно было создать модуль, который произносит текст и закрывается. Создал консольное приложение, текст не произносился. Дело в том, что поток консольный не ждал окончания произношения, который в свою очередь тоже запускается в новом потоке, а заставить ожидать поток определенное время тоже нельзя, так, как не известно, сколько текста придется произносить. Есть событие окончание речи:
Handles AxLTTS71.EndOfSpeech
Но в консольном режиме оно не срабатывает (не знаю почему)
Тогда я решил найти другой способ. Дело в том что Loquendo дружит с Windows Speech, а значит мы можем использовать Sytem.Speech. После установки наша Ольга доступна из панели управления Windows/Control Panel/ Speech
Выбираем Ольгу.
И пишем не большой код:
Imports System.Speech.Synthesis
Module Module1
Dim WithEvents speaker As New SpeechSynthesizer()
Dim isBusy As Boolean = False
Sub Main(ByVal args() As String)
If args.Length > 0 Then
Try
speaker.Rate = 0
speaker.Volume = 100
speaker.SpeakAsync(args(0).ToString)
isBusy = True
While isBusy
Threading.Thread.Sleep(1000)
End While
Catch ex As Exception
End Try
End If
End Sub
Private Sub speaker_SpeakCompleted(ByVal sender As Object, ByVal e As System.Speech.Synthesis.SpeakCompletedEventArgs) Handles speaker.SpeakCompleted
isBusy = False
End Sub
End Module
Для информации:
System.Speech.Synthesis
Доступен начиная с FrameWork 3.5
Удачи!