TOC

This article has been localized into Russian by the community.

Аудио и Видео:

Синтез речи

В сборке System.Speech находятся две полезных библиотеки: Speech Synthesis, дающая возможность синтезировать речь, и Speech Recognition, дающая возможность речь распознавать и конвертировать в текст. В этой статье будет рассмотрен синтез речи, а в следующей - её распознавание.

Для преобразования текста в речь используется класс SpeechSynthesizer. Этот класс находится в сборке System.Speech, ссылку на которую необходимо добавить в наш проект. В зависимости от используемой версии Visual Studio процедура добавления следующая:

После добавления ссылки на сборку мы можем использовать класс SpeechSynthesizer из пространства имен System.Speech.Synthesis. Теперь напишем простой пример приложения "Hello, world!", но с использованием синтеза речи.

<Window x:Class="WpfTutorialSamples.Audio_and_Video.SpeechSynthesisSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SpeechSynthesisSample" Height="150" Width="150">
    <Grid>
        <Button Name="btnSayIt" Click="btnSayHello_Click" VerticalAlignment="Center" HorizontalAlignment="Center">Say hello!</Button>
    </Grid>
</Window>
using System;
using System.Speech.Synthesis;
using System.Windows;

namespace WpfTutorialSamples.Audio_and_Video
{
	public partial class SpeechSynthesisSample : Window
	{
		public SpeechSynthesisSample()
		{
			InitializeComponent();
		}

		private void btnSayHello_Click(object sender, RoutedEventArgs e)
		{
			SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
			speechSynthesizer.Speak("Hello, world!");
		}
	}
}

Этот пример весьма прост. Однако, скриншот совершенно не помогает отобразить работу синтезатора речи, поэтому рекомендуется реализовать этот пример самостоятельно.

Управление произношением

Возможности класса SpeechSynthesizer не ограничиваются простым произнесением текста. С помощью класса PromptBuilder можно изменять способ произношения слов. Это демонстрируется в следующем примере, который дополняет предыдущий:

<Window x:Class="WpfTutorialSamples.Audio_and_Video.SpeechSynthesisPromptBuilderSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SpeechSynthesisPromptBuilderSample" Height="150" Width="150">
    <Grid>
        <Button Name="btnSayIt" Click="btnSayHello_Click" VerticalAlignment="Center" HorizontalAlignment="Center">Say hello!</Button>
    </Grid>
</Window>
using System;
using System.Speech.Synthesis;
using System.Windows;

namespace WpfTutorialSamples.Audio_and_Video
{
	public partial class SpeechSynthesisPromptBuilderSample : Window
	{
		public SpeechSynthesisPromptBuilderSample()
		{
			InitializeComponent();
		}

		private void btnSayHello_Click(object sender, RoutedEventArgs e)
		{
			PromptBuilder promptBuilder = new PromptBuilder();
			promptBuilder.AppendText("Hello world");

			PromptStyle promptStyle = new PromptStyle();
			promptStyle.Volume = PromptVolume.Soft;
			promptStyle.Rate = PromptRate.Slow;
			promptBuilder.StartStyle(promptStyle);
			promptBuilder.AppendText("and hello to the universe too.");
			promptBuilder.EndStyle();

			promptBuilder.AppendText("On this day, ");
			promptBuilder.AppendTextWithHint(DateTime.Now.ToShortDateString(), SayAs.Date);

			promptBuilder.AppendText(", we're gathered here to learn");
			promptBuilder.AppendText("all", PromptEmphasis.Strong);
			promptBuilder.AppendText("about");
			promptBuilder.AppendTextWithHint("WPF", SayAs.SpellOut);

			SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
			speechSynthesizer.Speak(promptBuilder);
		}
	}
}

Программа становится интереснее. Запустите пример и проверьте, как он работает. Предоставляя классу SpeechSynthesizer не только простую строку текста, мы получаем возможность изменять произношение отдельных частей предложения. В данном случае наше приложение произнесет следующее:

Hello world and hello to the universe too. On this day, <сегодняшняя дата>, we're gathered here to learn all about WPF.

Теперь попробуйте передать эту строку непосредственно классу SpeechSynthesizer. Скорее всего, результат вас рассмешит. Теперь дадим методу Speak() описание того, как должны произноситься различные части предложения. Для начала укажем, что фраза "and hello to the universe too" должна произноситься медленно и с пониженной громкостью, т.е. как будто шепотом.

Ещё одной частью предложения, которой требуется особый способ произношения, является дата. Для того, чтобы дата была озвучена именно как дата, а не просто последовательность цифр и спецсимволов, используется перечисление SayAs.

Также, для придания большей динамичности предложению, укажем, что слово "all" должно выделяться ударением. И, наконец, укажем, что "WPF" следует произносить по буквам, а не как одно слово.

Теперь намного легче понять то, что говорит SpeechSynthesizer .

Заключение

Сделать так, чтобы приложение WPF заговорило, предельно просто. А класс PromptBuilder предоставляет большие возможности для управления произношением. Синтез речи - очень мощная функция WPF, хотя она может применяться редко в современных приложениях. Однако это не делает её менее выдающейся.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!