因为挑战杯的项目和语音有关,所以在网上找了一些这方面的资料。发现微软的SAPI是一个不错的东西。
下面的程序大部分都是从MSDN中得到的,自己都还没有把SDK的文档看明白:(
有兴趣的可以参见:http://www.microsoft.com/china/community/program/originalarticles/techdoc/Cnspeech.mspx
如果找不到tlbimp命令,可以参见:http://blog.csdn.net/wayne92/archive/2006/04/08/655420.aspx
程序如下:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using DotNetSpeech; //这个是要自己用tlbimp命令生成的dll文件
using System.Threading;
namespace 中文语音应用程序
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Button buttonSynthes;
private System.Windows.Forms.Button buttonTTStoWave;
private System.Windows.Forms.TextBox textBox1;
private RadioButton radioButtonChina;
private RadioButton radioButtonEnglish;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.textBox1 = new System.Windows.Forms.TextBox();
this.buttonSynthes = new System.Windows.Forms.Button();
this.buttonTTStoWave = new System.Windows.Forms.Button();
this.radioButtonChina = new System.Windows.Forms.RadioButton();
this.radioButtonEnglish = new System.Windows.Forms.RadioButton();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// groupBox1
//
this.groupBox1.Controls.Add(this.textBox1);
this.groupBox1.Location = new System.Drawing.Point(32, 16);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(360, 200);
this.groupBox1.TabIndex = 1;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "请输入要合成的文本";
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(8, 24);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(336, 160);
this.textBox1.TabIndex = 0;
//
// buttonSynthes
//
this.buttonSynthes.Location = new System.Drawing.Point(40, 232);
this.buttonSynthes.Name = "buttonSynthes";
this.buttonSynthes.Size = new System.Drawing.Size(75, 23);
this.buttonSynthes.TabIndex = 2;
this.buttonSynthes.Text = "朗读";
this.buttonSynthes.Click += new System.EventHandler(this.buttonSynthes_Click);
//
// buttonTTStoWave
//
this.buttonTTStoWave.Location = new System.Drawing.Point(256, 232);
this.buttonTTStoWave.Name = "buttonTTStoWave";
this.buttonTTStoWave.Size = new System.Drawing.Size(120, 23);
this.buttonTTStoWave.TabIndex = 3;
this.buttonTTStoWave.Text = "生成声音文件(wav)";
this.buttonTTStoWave.Click += new System.EventHandler(this.buttonTTStoWave_Click);
//
// radioButtonChina
//
this.radioButtonChina.AutoSize = true;
this.radioButtonChina.Checked = true;
this.radioButtonChina.Location = new System.Drawing.Point(137, 232);
this.radioButtonChina.Name = "radioButtonChina";
this.radioButtonChina.Size = new System.Drawing.Size(47, 16);
this.radioButtonChina.TabIndex = 4;
this.radioButtonChina.TabStop = true;
this.radioButtonChina.Text = "中文\r\n";
this.radioButtonChina.UseVisualStyleBackColor = true;
//
// radioButtonEnglish
//
this.radioButtonEnglish.AutoSize = true;
this.radioButtonEnglish.Location = new System.Drawing.Point(137, 254);
this.radioButtonEnglish.Name = "radioButtonEnglish";
this.radioButtonEnglish.Size = new System.Drawing.Size(47, 16);
this.radioButtonEnglish.TabIndex = 5;
this.radioButtonEnglish.Text = "英文";
this.radioButtonEnglish.UseVisualStyleBackColor = true;
//
// Form1
//
this.AcceptButton = this.buttonSynthes;
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(416, 278);
this.Controls.Add(this.radioButtonEnglish);
this.Controls.Add(this.radioButtonChina);
this.Controls.Add(this.buttonTTStoWave);
this.Controls.Add(this.buttonSynthes);
this.Controls.Add(this.groupBox1);
this.Name = "Form1";
this.Text = "中文TTS in .net Framework";
this.Load += new System.EventHandler(this.Form1_Load);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void Form1_Load(object sender, System.EventArgs e)
{
}
private void buttonSynthes_Click(object sender, System.EventArgs e)
{
try
{
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpVoice voice = new SpVoiceClass();
if ( radioButtonEnglish.Checked == true )
voice.Voice = voice.GetVoices("language=409",string.Empty).Item(0);//英文
else
voice.Voice = voice.GetVoices("language=804",string.Empty).Item(0);//中文
voice.Speak(this.textBox1.Text,SpFlags); //朗读
}
catch(Exception er )
{
MessageBox.Show("An Error Occured!","SpeechApp", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonTTStoWave_Click(object sender, System.EventArgs e)
{
try
{
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpVoice Voice = new SpVoiceClass();
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "All files (*.*)|*.*|wav files (*.wav)|*.wav";
sfd.Title = "Save to a wave file";
sfd.FilterIndex = 2;
if( sfd.ShowDialog() == DialogResult.OK)
{
SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite;
SpFileStream SpFileStream = new SpFileStreamClass();
SpFileStream.Open(sfd.FileName, SpFileMode, false);
Voice.AudioOutputStream = SpFileStream;
Voice.Speak(this.textBox1.Text,SpFlags);
Voice.WaitUntilDone(Timeout.Infinite);
SpFileStream.Close();
}
}
catch(Exception er)
{
MessageBox.Show("An Error Occured!","SpeechApp", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}