因為挑戰杯的項目和語音有關,所以在網上找了一些這方面的資料。發現微軟的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 System.Threading;
using DotNetSpeech; //這個是要用tlbimp命令生成的。
/**//*PS:發現這樣更簡單:項目->添加引用->COM 選擇Microsoft Speech Object Library,就添加了SpeechLib(和生成的DotNetSpeech一樣)*/
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 );
}
Windows 窗體設計器生成的代碼#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 = "中文 ";
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);
}
}
}
}