говорящее .NET приложение или работа с TTS

Как заставить наше .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
Loquendo панель управления

Выбираем Ольгу.
И пишем не большой код:

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
Удачи!

Добавить комментарий

Loading