TTS语音

DotNetSpeech.dll 引用

using DotNetSpeech;

 public class SpVoiceUtil
    {
        //SpVoice voice = new SpVoice ();
        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(null ,null );
            int count = obj.Count;//获取语音库总数  
            for (int i = 0; i < count; i++)
            {
                string desc = obj.Item(i).GetDescription(i); //遍历语音库  
                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(null ,null );
            int count = obj.Count;//获取语音库总数  
            bool result = false;
            for (int i = 0; i < count; i++)
            {
                string desc = obj.Item(i).GetDescription(i); //遍历语音库  
                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);
        }
    }
View Code

Interop.SpeechLib.dll   引用

 using SpeechLib;

 public class SpVoiceUtil2
    {
        SpVoice voice = new SpVoice();
        //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>();
            ISpeechObjectTokens obj = voice.GetVoices (null ,null );
            int count = obj.Count;//获取语音库总数  
            for (int i = 0; i < count; i++)
            {
                string desc = obj.Item(i).GetDescription (i); //遍历语音库  
                list.Add(desc);
            }
            return list;
        }

        /// <summary>  
        /// 设置当前使用语音库  
        /// </summary>  
        /// <returns>bool</returns>  
        public bool setDescription(string name)
        {
            List<string> list = new List<string>();
            ISpeechObjectTokens obj = voice.GetVoices(null, null);
            int count = obj.Count;//获取语音库总数  
            bool result = false;
            for (int i = 0; i < count; i++)
            {
                string desc = obj.Item(i).GetDescription(i); //遍历语音库  
                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 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);
        }
    }
View Code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Data.SqlClient;
using SpeechLib;
using System.Collections;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        SpVoiceClass voic = new SpVoiceClass();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = getDescription();
            comboBox2.DataSource = getAutoDescription();

        }
        public void CallBack(bool b, int InputWordPosition, int InputWordLength)
        {
            
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Speak(textBox1.Text); return;

            //SpVoiceUtil2 sp = new SpVoiceUtil2();
            //sp.setVolume(trackBar2.Value);
            //sp.setRate(trackBar1.Value);
            //sp.setDescription(comboBox1.Text);

            //SpVoiceUtil2.CallBack calback = new SpVoiceUtil2.CallBack(CallBack);
            //sp.Speak(textBox1.Text, calback); return;
            try
            {
                
                //voic.Voice = voic.GetVoices(null, null).Item(comboBox1.SelectedIndex);
                voic.Voice = voic.GetVoices(null, null).Item(get("VW Lily"));
                voic.AudioOutput = voic.GetAudioOutputs(null, null).Item(comboBox2.SelectedIndex);
                voic.Rate = trackBar1.Value;
                voic.Volume = 100;// trackBar2.Value;
                voic.Speak(textBox1.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>  
        /// 获取语音库  
        /// </summary>  
        /// <returns>List<string></returns>  
        public List<string> getDescription()
        {
            List<string> list = new List<string>();
            ISpeechObjectTokens obj = voic.GetVoices(null, null);
            int count = obj.Count;//获取语音库总数  
            for (int i = 0; i < count; i++)
            {
                string desc = obj.Item(i).GetDescription(i); //遍历语音库  
                list.Add(desc);
            }
            return list;
        }

        public List<string> getAutoDescription()
        {
            List<string> list = new List<string>();
            ISpeechObjectTokens obj = voic.GetAudioOutputs(null, null);
            int count = obj.Count; 
            for (int i = 0; i < count; i++)
            {
                string desc = obj.Item(i).GetDescription(i);  
                list.Add(desc);
            }
            return list;
        }


        public void Speak(string strValue)
        {
            try
            {
                
                voic.Voice = voic.GetVoices(null, null).Item(2);
                voic.AudioOutput = voic.GetAudioOutputs(null, null).Item(0);
                voic.Rate = 0;
                voic.Volume = 100;
                voic.Speak(strValue, SpeechVoiceSpeakFlags.SVSFDefault);
            }
            catch
            {
            }
        }
        public int get(string strName)
        {
            voic = new SpVoiceClass();
            int k = 0;
            ISpeechObjectTokens obj = voic.GetVoices(null, null);
            int count = obj.Count;
            for (int i = 0; i < count; i++)
            {
                if (strName == obj.Item(i).GetDescription(i))
                {
                    k = i;
                    break;
                }
            }
            return k;
        }
    }
}
View Code
原文地址:https://www.cnblogs.com/zlcom/p/3490808.html