首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

微软 SAPI.SpVoice C# 使用方法 + 范例

2013-02-04 
微软 SAPI.SpVoice C# 使用方法 + 实例 网上找了好多资料也没找到多少支持返回当前朗读的位置 用到了C#的

微软 SAPI.SpVoice C# 使用方法 + 实例

微软 SAPI.SpVoice C# 使用方法 + 范例

 

网上找了好多资料也没找到多少  支持返回当前朗读的位置 用到了C#的回调函数

 

然后为了方便使用 我多此一举的封装了下

 

没什么技术含量 大牛直接飞过

using System;using System.Collections.Generic;using System.Text;using DotNetSpeech;using System.Threading;using System.IO;namespace SpVoiceDemo{    class SpVoiceUtil    {        SpVoice voice = new DotNetSpeech.SpVoiceClass();        public delegate void CallBack(bool b,int InputWordPosition, int InputWordLength);         /// <summary>        /// 朗读文本        /// </summary>        /// <param name="str">要朗读的文本</param>        /// <param name="CallBack">回调地址</param>        /// <returns>返回bool</returns>        public bool Speak(string str, CallBack CallBack)        {            int n = voice.Speak(str, SpeechVoiceSpeakFlags.SVSFlagsAsync);            Thread thread = new Thread(new ParameterizedThreadStart(Call));            thread.IsBackground = true;            thread.Start((Object)CallBack);            return !(n!=1);        }        /// <summary>        /// 回调函数线程子程序        /// </summary>        /// <param name="callBack"></param>        private void Call(Object callBack)        {            int InputWordLength = 0;    //局部_朗读长度            int InputWordPosition = 0; //局部_朗读位置            CallBack CallBack = (CallBack)callBack;            while ((int)voice.Status.RunningState != 1)            {                if (InputWordPosition != voice.Status.InputWordPosition || InputWordLength != voice.Status.InputWordLength)                {                    InputWordPosition = voice.Status.InputWordPosition;                    InputWordLength = voice.Status.InputWordLength;                    //回调                                      CallBack(false, InputWordPosition, InputWordLength);                }            }            CallBack(true, InputWordPosition, InputWordLength);        }        /// <summary>        /// 获取语音库        /// </summary>        /// <returns>List<string></returns>        public List<string> getDescription()        {            List<string> list = new List<string>();            DotNetSpeech.ISpeechObjectTokens obj = voice.GetVoices();            int count = obj.Count;//获取语音库总数            for (int i = 0; i < count; i++)            {               string desc = obj.Item(i).GetDescription(); //遍历语音库               list.Add(desc);            }            return list;        }        /// <summary>        /// 设置当前使用语音库        /// </summary>        /// <returns>bool</returns>        public bool setDescription(string name)        {            List<string> list = new List<string>();            DotNetSpeech.ISpeechObjectTokens obj = voice.GetVoices();            int count = obj.Count;//获取语音库总数            bool result = false;            for (int i = 0; i < count; i++)            {                string desc = obj.Item(i).GetDescription(); //遍历语音库                if (desc.Equals(name))                {                    voice.Voice = obj.Item(i);                    result = true;                }            }            return result;        }        /// <summary>        /// 设置语速        /// </summary>        /// <param name="n"></param>        public void setRate(int n)        {            voice.Rate = n;        }        /// <summary>        /// 设置声音大小        /// </summary>        /// <param name="n"></param>        public void setVolume(int n)        {            voice.Volume = n;        }        /// <summary>        /// 暂停        /// </summary>        public void Pause()        {            voice.Pause();        }        /// <summary>        /// 继续        /// </summary>        public void Resume()        {            voice.Resume();        }        /// <summary>        /// 停止        /// </summary>        public void Stop()        {            voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);        }        /// <summary>        /// 输出WAV        /// </summary>        /// <param name="path">保存路径</param>        /// <param name="str">要转换的文本内容</param>        /// <returns></returns>        public bool WreiteToWAV(string path,string str,SpeechAudioFormatType SpAudioType)        {            SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite;            SpFileStream SpFileStream = new SpFileStream();            SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;            SpAudioFormat SpAudio = new DotNetSpeech.SpAudioFormat();            SpAudio.Type = SpAudioType;            SpFileStream.Format = SpAudio;            SpFileStream.Open(path, SpFileMode, false);            voice.AudioOutputStream = SpFileStream;            voice.Speak(str, SpFlags);            voice.WaitUntilDone(Timeout.Infinite);            SpFileStream.Close();            return File.Exists(path);        }    }}

 


代码下载地址:http://download.csdn.net/detail/rootsuper/5039830

热点排行