• 文本转换成音频流


    1.生成声音文件

    DotNetSpeech.SpeechVoiceSpeakFlags SSF = DotNetSpeech.SpeechVoiceSpeakFlags.SVSFlagsAsync;
    DotNetSpeech.SpVoice vo = new SpVoiceClass();
    System.Windows.Forms.SaveFileDialog SFD = new System.Windows.Forms.SaveFileDialog();
    SFD.Filter = "All files (*.*)|*.*|wav files (*.wav)|*.wav";
    SFD.Title = "Save to a wav file";
    SFD.FilterIndex = 2;
    SFD.RestoreDirectory = true;
    if(SFD.ShowDialog()==System.Windows.Forms.DialogResult.OK)
    {
    DotNetSpeech.SpeechStreamFileMode SSFM = DotNetSpeech.SpeechStreamFileMode.SSFMCreateForWrite;
    DotNetSpeech.SpFileStream SFS = new DotNetSpeech.SpFileStreamClass();
    SFS.Open(SFD.FileName,SSFM,false);
    vo.AudioOutputStream = SFS;
    vo.Speak(this.textBox1.Text,SSF);
    vo.WaitUntilDone(System.Threading.Timeout.Infinite);
    SFS.Close();

    2.朗读

    DotNetSpeech.SpeechVoiceSpeakFlags SSF = DotNetSpeech.SpeechVoiceSpeakFlags.SVSFlagsAsync;
    DotNetSpeech.SpVoice vo = new SpVoiceClass();
    vo.Speak(this.textBox1.Text,SSF);

    3.

    /// 
    /// 朗读
    /// 
    
    /// 要朗读的文本
    private void Read(string text)
    {
        SpVoice sv = new SpVoice();
        sv.Rate = 0;//设置朗读速度
        SpeechVoiceSpeakFlags SSF = SpeechVoiceSpeakFlags.SVSFlagsAsync;
        sv.Speak(text, SSF);
    }
    /// 
    /// 生成声音文件
    /// 
    /// 要朗读的文本
    /// 生成声音文件的路径
    /// 生成声音文件的名称
    private void CreateFile(string text, string filePath,string fileName)
    {
        if (!Directory.Exists(filePath))
            Directory.CreateDirectory(filePath);
        SpVoice sv = new SpVoice();
        SpeechVoiceSpeakFlags SVSF = SpeechVoiceSpeakFlags.SVSFlagsAsync;
        SpeechStreamFileMode SSFM = SpeechStreamFileMode.SSFMCreateForWrite;
        SpFileStream SFS = new SpFileStream();
        SFS.Open(filePath+fileName, SSFM, false);
        sv.AudioOutputStream = SFS;
        sv.Speak(text, SVSF);
        sv.WaitUntilDone(System.Threading.Timeout.Infinite);
        SFS.Close();
    }
    2、 使用System.Speech
    SpeechSynthesizer ss = new SpeechSynthesizer();
    //播放
    if (ss != null)
    {
        ss.Dispose();
        ss.SpeakAsync("朗读的文本");
    }
    //暂停
    if (ss.State == SynthesizerState.Speaking)
    {
        ss.Pause();
    }
    //继续
    if (reader.State == SynthesizerState.Paused)
    {
        ss.Resume();
    }
    //停止
    if (ss != null)
    {
        ss.Dispose();
    } 

    4.

    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);
            }
        }
    }
  • 相关阅读:
    golang的select典型用法
    vscode配置git和提交代码到github教程
    VsCode中好用的git源代码管理插件GitLens
    GoMock框架使用指南
    golang对结构体排序,重写sort
    Go语言开发Prometheus Exporter示例
    golang 字符串拼接性能比较
    golang中的strings.Compare
    各大厂分布式链路跟踪系统架构对比
    NV triton启动方式说明
  • 原文地址:https://www.cnblogs.com/ChineseMoonGod/p/3700762.html
Copyright © 2020-2023  润新知