C#WPF 语音开发教程 TTS中文语音朗读 一步一步 教你制作语音软件
附图和源代码
效果展示
一 项目准备
1.vs2012开发平台
2.微软的语音软件库
下载:http://download.csdn.net/detail/wyx100/8431269 (含实例项目源代码)
二.开发目标
制作一个语音软件,可以朗读文字;
多个语音库:男音和女音、支持英文和中文朗读;
支持选择播放设备
支持朗读语速选择
支持音量选择
三 开发过程
1.新建WpfSpeechDemo工程
文件(vs开发平台左上角)----新建(快捷方式 Ctrl+Shift+New)
2.导入微软语音库
3.建立软件界面
见开始 效果展示
4.软件功能开发
支持语音库选择
支持选择播放设备
支持朗读语速选择
支持音量选择
四 软件代码
1.界面代码
<Window x:Class="WpfSpeechDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WpfSpeechDemo" Height="350" Width="525"> <Grid> <ComboBox x:Name="cmbVoices" HorizontalAlignment="Left" Margin="86,23,0,0" VerticalAlignment="Top" Width="222" SelectionChanged="cmbVoices_SelectionChanged"/> <ComboBox x:Name="cmbAudioOut" HorizontalAlignment="Left" Margin="86,69,0,0" VerticalAlignment="Top" Width="222" SelectionChanged="cmbAudioOut_SelectionChanged"/> <Label Content="语音库(引擎): " HorizontalAlignment="Left" Margin="0,23,0,0" VerticalAlignment="Top" Width="81"/> <Label Content="语音输出方式: " HorizontalAlignment="Left" Margin="0,65,0,0" VerticalAlignment="Top" Width="81"/> <Button Content="朗读|Speek" HorizontalAlignment="Left" Margin="33,119,0,0" VerticalAlignment="Top" Width="104" Click="bt_speek_Click"/> <Button Content="停止|Stop" HorizontalAlignment="Left" Margin="170,119,0,0" VerticalAlignment="Top" Width="93" RenderTransformOrigin="2.042,0.064" Click="bt_stop_Click"/> <TextBox Name="tbspeech" HorizontalAlignment="Left" Height="125" Margin="20,172,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="484" BorderThickness="3" Text="Wpf语音,hello world!"> <TextBox.BorderBrush> <LinearGradientBrush EndPoint="0,20" MappingMode="Absolute" StartPoint="0,0"> <GradientStop Color="#FFABADB3" Offset="0.05"/> <GradientStop Color="#FFE2E3EA" Offset="0.07"/> <GradientStop Color="#FF1A72C9" Offset="1"/> </LinearGradientBrush> </TextBox.BorderBrush> </TextBox> <Slider x:Name="tbarRate" Orientation="Vertical" Minimum="0" Maximum="10" IsMoveToPointEnabled="True" AutoToolTipPrecision="2" AutoToolTipPlacement="BottomRight" TickPlacement="BottomRight" Ticks="1, 2, 3, 4, 5, 6, 7, 8, 9,10" IsSelectionRangeEnabled="true" SelectionStart="1" SelectionEnd="9" HorizontalAlignment="Left" Margin="357,51,0,0" VerticalAlignment="Top" Height="103" ValueChanged="tbarRate_ValueChanged" Background="#FFEFEBF0"/> <Slider x:Name="trbVolume" Orientation="Vertical" Minimum="0" Maximum="10" IsMoveToPointEnabled="True" AutoToolTipPrecision="2" AutoToolTipPlacement="BottomRight" TickPlacement="BottomRight" Ticks="1, 2, 3, 4, 5, 6, 7, 8, 9,10" IsSelectionRangeEnabled="true" SelectionStart="1" SelectionEnd="9" HorizontalAlignment="Left" Margin="426,51,0,0" VerticalAlignment="Top" Height="103" ValueChanged="trbVolume_ValueChanged" Background="#FFF2EFF3"/> <Label Content="语速" HorizontalAlignment="Left" Margin="350,19,0,0" VerticalAlignment="Top" Width="35" /> <Label Content="音量" HorizontalAlignment="Left" Margin="418,19,0,0" VerticalAlignment="Top" Width="35"/> </Grid></Window>
2.功能代码
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using DotNetSpeech;//cs文件中引入库namespace WpfSpeechDemo{ /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { SpVoice speech = new SpVoice(); int speechRate = 0; int volume = 70; public MainWindow() { InitializeComponent(); init(); } private void init() { //初始化语音引擎列表 foreach (ISpeechObjectToken Token in speech.GetVoices(string.Empty, string.Empty)) { cmbVoices.Items.Add(Token.GetDescription(49)); } //取得音频输出列表 foreach (ISpeechObjectToken AudioOut in speech.GetAudioOutputs(string.Empty, string.Empty)) { cmbAudioOut.Items.Add(AudioOut.GetDescription(49)); } cmbVoices.SelectedIndex = 0; cmbAudioOut.SelectedIndex = 0; tbarRate.Value = speechRate; trbVolume.Value = volume; } private void tbarRate_Scroll(object sender, EventArgs e) { speech.Rate = (int)tbarRate.Value; } private void trbVolume_Scroll(object sender, EventArgs e) { speech.Volume = (int)trbVolume.Value; } private void cmbVoices_SelectionChanged(object sender, SelectionChangedEventArgs e) { speech.Voice = speech.GetVoices(string.Empty, string.Empty).Item(cmbVoices.SelectedIndex); } private void cmbAudioOut_SelectionChanged(object sender, SelectionChangedEventArgs e) { speech.AudioOutput = speech.GetAudioOutputs(string.Empty, string.Empty).Item(cmbAudioOut.SelectedIndex); } private void bt_speek_Click(object sender, EventArgs e) { //终止先前朗读,如果有 speech.Speak(" ", SpeechVoiceSpeakFlags.SVSFlagsAsync); speech.Speak(tbspeech.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync); } private void bt_stop_Click(object sender, EventArgs e) { speech.Speak("", SpeechVoiceSpeakFlags.SVSFlagsAsync); } private void tbarRate_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { speech.Rate = (int)e.NewValue; } private void trbVolume_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { speech.Volume = (int)e.NewValue; } }}