您好,登錄后才能下訂單哦!
上篇博文說了一些Microsoft Speech Platform的知識點,這篇博文用一個例子來實踐一下。
例子是實現一段文字的朗讀,朗讀到那一句文字,文字就變紅色。就這么簡單。
先看窗體布局。
實現代碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.Speech.Synthesis; using System.Threading; namespace SpeechPro { public partial class PlayForm : Form { public PlayForm() { InitializeComponent(); } /// <summary> /// TTS對象 /// </summary> SpeechSynthesizer speech; /// <summary> /// 分隔文本內容成數組 /// </summary> /// <param name="content">文本內容</param> /// <returns>字符數組</returns> string[] GetArr(string content) { char[] charArr = new char[] { '。', ',', ';' };//分隔字符數組 string[] arr = content.Split(charArr, StringSplitOptions.RemoveEmptyEntries);//分隔 int sumcount = 0;//字符總數變量 for (int i = 0; i < arr.Length; i++) { sumcount += arr[i].Length;//累加變量總數 arr[i] += content.Substring(sumcount, 1);//獲取分隔標點符號 sumcount += 1;//加標點符號的長度 } return arr; } string[] arr; /// <summary> /// 播放內容 /// </summary> void Play() { arr = GetArr(Play_TB.Text); //設計TTS對象,并設置對象 speech = new SpeechSynthesizer(); speech.SetOutputToDefaultAudioDevice(); speech.Volume = 100; speech.Rate = 0; speech.SpeakStarted += speech_SpeakStarted; //異步誦讀語音 for (int i = 0; i < arr.Length; i++) { PromptBuilder pb = new PromptBuilder(); pb.AppendText(arr[i], PromptRate.Medium); Prompt p = new Prompt(pb); speech.SpeakAsync(p); } } int index = 0;//朗讀索引值 int sum = 0;//朗讀總長度 /// <summary> /// 朗讀Prompt開始時事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void speech_SpeakStarted(object sender, SpeakStartedEventArgs e) { if (index > 0) { //使上一條記錄恢復原來的樣式 Play_TB.Select(sum - arr[index - 1].Length, arr[index - 1].Length); Play_TB.SelectionColor = Color.Black; } //設置現在朗讀記錄的樣式 Play_TB.Select(sum, arr[index].Length); Play_TB.SelectionColor = Color.Red; //增加長度和朗讀索引 sum += arr[index].Length; index++; this.Text = "正在朗讀第" + index + "句"; } /// <summary> /// 朗讀按鈕 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Play_But_Click(object sender, EventArgs e) { Play(); } } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。