?
?
此文將介紹利用微軟 TTS 引擎,在錄入數據時進行即時語音校對的示例。
?
這是一項非常簡單且非常實用的技術,此功能在行業軟件中使用的話,將會使用戶的錄入準確率大幅提高,還可減少甚至取消后期核對工作。
?
你需要使用以下類庫來操作 TTS :
?
?
在文章末尾處提供的源代碼中將包含此類庫。
?
現在開始編寫這個示例程序:
?
新建一個 WinForm 項目,引入上述 dll ,在窗體后臺代碼中添加對其命名空間的引用:
?
?
?
?
由于我們還需要用到正則表達式,所以也將其所在命名空間一并引用:
?
?
?
?
然后來設計一個基本的用戶界面:
?
?
添加一個 B ackgroundWorker組件:
?
?
為其DoWork事件添加處理:
?
?
{
????????SpeechVoiceSpeakFlags?SpFlags? = ?SpeechVoiceSpeakFlags.SVSFlagsAsync;
????????SpVoice?Voice? = ? new ?SpVoice();
????????Voice.Rate? = ? - 3 ;
????????Voice.Speak(e.Argument.ToString(),?SpFlags);
}
?
?
Voice.Rate屬性是用來設置語速的修正值的,我希望它讀慢點,所以就設為了 -3 。
?
這個事件處理的功能就是在后臺將接收到的字符串通過 TTS 念出來。
?
我們再來編寫一個方法,來統一對backgroundWorker1進行調用:
?
?
{
???? try
????{
????????backgroundWorker1.RunWorkerAsync(內容);
????}
???? catch ?(Exception?er)
????{
????????MessageBox.Show(er.Message,? " 提示 " ,?MessageBoxButtons.OK,?MessageBoxIcon.Error);
????}
}
?
?
為了便于演示,加上我個人習慣,我將此方法名稱設為了中文。
?
由于語音處理需要一定時間,在此期間如果再度調用backgroundWorker1的RunWorkerAsync方法,將會引發異常,所以需要進行捕獲。
?
實際應用中如需要照顧較高速度的錄入,可以采用多個 B ackgroundWorker組件,輪流滾動處理。
?
接下來就是為每個輸入框定義朗讀方式了,我們會在用戶按下回車鍵時,進行語音處理,并將光標跳轉到下一個輸入框。
?
首先設置序號輸入框的事件處理:
?
?
{
???? if ?(e.KeyData? != ?Keys.Enter)? return ;
????朗讀(numericUpDown1.Value);
????textBox1.Select();
}
?
?
然后是品名的:
?
?
{
???? if ?(e.KeyData? != ?Keys.Enter)? return ;
????朗讀(textBox1.Text);
????numericUpDown2.Select();
}
?
?
這兩個都比較簡單,九十直接念出原文。
?
單價則有些不同:
?
?
{
???? if ?(e.KeyData? != ?Keys.Enter)? return ;
????朗讀( " ¥ " ? + ?numericUpDown2.Value);
????numericUpDown3.Select();
}
?
?
在其內容前加了人民幣符號,它閱讀時就會這樣讀:九百六十七元
?
數量與之類似:
?
?
{
???? if ?(e.KeyData? != ?Keys.Enter)? return ;
????朗讀(numericUpDown3.Value? + ? " 件 " );
????textBox2.Select();
}
?
?
內部編號有些特殊,我期望它能夠將每個字母或數字都單獨念出,這可以通過加注拼寫標記來實現:“<spell></spell>”
但是這樣還有一個問題,就是他讀數字的時候會將其讀作英文,這不是我們所希望的,這還需通過加注語言標記來修正:“<voice required=""Language=804""></voice>”
故此我們需要附屬一個方法來將源文本格式化:
?
?
{
???? if ?(e.KeyData? != ?Keys.Enter)? return ;
????朗讀(加注中文標記(textBox2.Text));
????button1.Select();
}
?
string ?加注中文標記( string ?原字符串)
{
???? return ? string .Format( " <spell>{0}</spell> " ,?Regex.Replace(原字符串,? @" (.) " ,? @" <voice?required=""Language=804"">$1</voice> " ));
}
?
?
好了,最后是提交按鈕的事件處理,我們也要讓他朗讀點東西:
?
?
{
????listBox1.Items.Add( new
????{
????????序號? = ?numericUpDown1.Value,
????????品名? = ?textBox1.Text,
????????價格? = ?numericUpDown2.Value,
????????數量? = ?numericUpDown3.Value,
????????內部編號? = ?textBox2.Text
????});
????朗讀(numericUpDown1.Value? + ? " 號,添加完畢 " );
????numericUpDown1.Value ++ ;
????numericUpDown2.Value? = ? 0 ;
????numericUpDown3.Value? = ? 1 ;
????textBox1.Text? = ?textBox2.Text? = ? "" ;
????numericUpDown1.Select();
}
?
?
至此這個示例就完成了,其使用效果見下面這段視頻:
?
?
?
?
插播個小喇叭廣播:
?
我的MailMail現已正式發布,現在開始到9月1日0時止舉辦免費贈送注冊碼活動,歡迎參與^^: http://www.cnblogs.com/SkyD/archive/2008/08/28/1278463.html
?
??
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
