c#学习笔记-----------试着调用百度TTS语言合成API

发布时间 2023-06-18 01:41:03作者: 三流程序媛

首先要求百度这个网站注册一个账号,申请TTS的使用权限:https://ai.baidu.com/tech/speech/tts

点击立即使用,一系列操作之后可以领取免费试用的资格

创建相关应用就可以获取到程序里面要用的key了

 最后程序里还要引用两个nuget包,一个是百度的AI包另外一个是NAudio包(相关介绍可以看:https://blog.csdn.net/u011614610/article/details/103718563)

 最后懒得记录了:

     #region 播放代码

        /// <summary>
        /// 音频播放接口
        /// </summary>
        IWavePlayer iPlayer = new WaveOutEvent();

        /// <summary>
        /// 音频读取器
        /// </summary>
        AudioFileReader AudioFileReader = null;
        /// <summary>
        /// Mp3读取器,支持文件和内存流
        /// </summary>
        Mp3FileReader Mp3FileReader = null;
        /// <summary>
        /// 内存流操作对象
        /// </summary>
        MemoryStream memoryStream = null;
        /// <summary>
        /// 构造函数,音频处理帮助对象
        /// </summary>
        public NAduioHelper()
        {
            ///为Player增加一个播放完成事件,释放占用资源
            iPlayer.PlaybackStopped += (sender, e) =>
            {
                if (AudioFileReader != null) { AudioFileReader.Close(); }
                if (Mp3FileReader != null) { Mp3FileReader.Close(); }
                if (memoryStream != null) { memoryStream.Close(); }
            };
        }
        /// <summary>
        /// 播放音乐的功能
        /// </summary>
        /// <param name="filename">需要播放的文件名</param>
        public void Play(string filename)
        {
            //首先停止之前的播放,确保播放器空闲
            iPlayer.Stop();
            //创建音频文件读取对象
            AudioFileReader = new AudioFileReader(filename);
            //把音频文件读取对象加载到播放设备
            iPlayer.Init(AudioFileReader);
            //对音量进行调节
            iPlayer.Volume = 1f;
            //开始播放
            iPlayer.Play();
        }

        /// <summary>
        /// 播放流媒体音频功能
        /// </summary>
        /// <param name="mp3data"></param>
        public void Play(byte[] mp3data)
        {
            //首先停止之前的播放,确保播放器空闲
            iPlayer.Stop();
            //用字节数组设置mp3内存流
            memoryStream = new MemoryStream(mp3data);
            //使用内存流创建一个MP3读取器
            Mp3FileReader = new Mp3FileReader(memoryStream);

            //把MP3读取器加载到播放设备
            iPlayer.Init(Mp3FileReader);
            //开始播放
            iPlayer.Play();
        }
        /// <summary>
        /// 停止播放
        /// </summary>
        public void Stop()
        {
            iPlayer.Stop();
        }

        #endregion

 

  百度TTS的调用:

 public class TTSHelper
    {
        /// <summary>
        /// 百度AI文本转语音客户端对象
        /// </summary>
        Baidu.Aip.Speech.Tts client;

        /// <summary>
        /// 语音合成参数设置
        /// </summary>
        Dictionary<string, object> option;

        /// <summary>
        /// 构造函数--对百度TTS进行实例化
        /// </summary>
        public TTSHelper(string API_KEY,string SECRET_KEY)
        {
            //构造函数中对百度文本转语音客户端进行实例化,KEY是应用列表的API Key,SECRET是Secret Key
            client = new Baidu.Aip.Speech.Tts(API_KEY, SECRET_KEY);
            //设置超时时间
            client.Timeout = 60000;
            //对语言信息进行配置
            option = new Dictionary<string, object>()
            {
                {"spd",5 },//语速,取值0-15
                {"pit",5 },//音调,取值0-15
                {"vol",7 },//音量,取值0-15
                {"per",0 },//角色,度小美0,度小宇1,度逍遥3,丫丫4
                {"aue",3 }//输出格式3为MP3,4为pcm-16k,5为pcm-8k,6为wav
            };
        }

        /// <summary>
        /// 使用存储为临时文件的方法播放
        /// </summary>
        /// <param name="txt"></param>
        /// <param name="filename"></param>
        /// <param name="playon"></param>
        /// <exception cref="Exception"></exception>
        public void TtsPlay(string txt,string filename="",bool playon = true)
        {
            //是否有指定文件名
            if (string.IsNullOrEmpty(filename))
            {
                //没有就创建一个临时文件
                filename = Path.GetTempFileName().Replace(".tmp", ".mp3");
            }
            //调用客户端API获取结果
            var result = client.Synthesis(txt, option);
            //判断是否成功
            if (result.ErrorCode == 0)
            {
                //将比特数组形式的音频文件存储到指定文件内
                File.WriteAllBytes(filename, result.Data);
                if (playon)
                {
                    //播放
                    new NAduioHelper().Play(filename);
                }
            }
            else
            {
                throw new Exception(result.ErrorMsg);
            }
        }
        /// <summary>
        /// 使用音频文件流形式播放
        /// </summary>
        /// <param name="txt"></param>
        /// <exception cref="Exception"></exception>
        public void TtsPlayMemory(string txt)
        {
            //调用客户端API获取结果
            var result = client.Synthesis(txt, option);
            //判断是否成功
            if (result.ErrorCode == 0)
            {
                //直接调用方法将比特数组传参进去
                new NAduioHelper().Play(result.Data);
            }
            else
            {
                throw new Exception(result.ErrorMsg);
            }
        }
    }

调用方法也很简单:

     private void button3_Click(object sender, EventArgs e)
        {
            TTSHelper tts = new TTSHelper("CEFAdyHh9psS6suNgKx0NYHU", "MM5GA51nH1lD3XfpxYBvHILAXyGSVzB5");
            string readtext = this.textBox1.Text;
            tts.TtsPlay(readtext, "", true);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            TTSHelper tts = new TTSHelper("CEFAdyHh9psS6suNgKx0NYHU", "MM5GA51nH1lD3XfpxYBvHILAXyGSVzB5");
            string readtext = this.textBox1.Text;
            tts.TtsPlay(readtext);

        }