.Net使用百度语音SDK实现语音播放

一、准备工作

 1、百度语音应用appid以及key

 首先进入百度AI官网 https://ai.baidu.com/

官网首页中的菜单栏中,找到“控制台”,点击进入,使用百度账号登录

 

 

登陆后,在右侧的菜单栏中点击“语音技术”

 点击“应用列表”菜单,然后再点击“创建应用”

 应用创建 信息填写

应用创建完成后,在应用列表中会看到创建的应用,会看到需要的AppID、APIKey以及SecretKey信息

 

 二、创建项目

 1、VS2017创建winform项目

 2、Nuget 中搜索baidu.ai并安装 AipSDK

3、Nuget中搜索NAudio并安装 

4、代码实现语音播放功能

        /// <summary>
        /// 语音播放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSound_Click(object sender, EventArgs e)
        {
            //百度语音 Nuget中搜索并添加 Baidu.AI和NAudio 两个包
            string aPIKey = "";//百度语音 apikey 此处应写入自己撞见的应用apikey
            string secretKey = "";//百度语音 secretKey 此处应写入自己撞见的应用secretKey
            var client = new Baidu.Aip.Speech.Tts(aPIKey, secretKey);//语音合成                       
            var option = new Dictionary<string, object>
            {
                {"spd",5},//语速 取值0-9,默认为5中语速
                {"vol",9},//音量 取值0-9,默认为5中语调
                {"per",0}//发音人 发音人选择, 0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女
            };
            //合成文本长度必须小于1024字节,如果本文长度较长,可以采用多次请求的方式。文本长度不可超过限制
            Baidu.Aip.Speech.TtsResponse res = client.Synthesis(txtSound.Text.Trim(), option);// 调用接口,合成语音文件
            if (res.ErrorCode == 0)//成功 或者res.Success
            {
                byte[] data = res.Data;
                try
                {
                    Stream stream = new MemoryStream(data);
                    using (NAudio.Wave.Mp3FileReader mp3FileReader = new NAudio.Wave.Mp3FileReader(stream))
                    {
                        using (NAudio.Wave.WaveStream waveStream = NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(mp3FileReader))
                        {
                            MemoryWaveStream memoryWaveStream = new MemoryWaveStream(StreamToBytes(waveStream), waveStream.WaveFormat);
                            Stream stream2 = memoryWaveStream.get();
                            MemoryStream memoryStream = new MemoryStream(StreamToBytes(stream2));
                            System.Media.SoundPlayer soundPlayer = new System.Media.SoundPlayer(memoryStream);
                            soundPlayer.PlaySync();
                            memoryWaveStream.Close();
                            stream2.Close();
                            memoryStream.Close();
                            soundPlayer.Dispose();
                        }
                    }
                    stream.Close();
                }
                catch(Exception ex)
                {
                }
            }
            else
            {
                MessageBox.Show("百度语音失败!");
            }
    }

        private static byte[] StreamToBytes(Stream stream)
        {
            byte[] array = new byte[stream.Length];
            stream.Read(array, 0, array.Length);
            stream.Seek(0L, SeekOrigin.Begin);
            return array;
        }
using System;
using System.IO;
using NAudio.Wave;

namespace CommonUtils
{
    public class MemoryWaveStream : Stream
    {
        private MemoryStream _waveStream;

        public override bool CanSeek
        {
            get
            {
                return false;
            }
        }
        
        public override bool CanWrite
        {
            get
            {
                return false;
            }
        }
        
        public override bool CanRead
        {
            get
            {
                return true;
            }
        }
        
        public override long Length
        {
            get
            {
                return this._waveStream.Length;
            }
        }
        
        public override long Position
        {
            get
            {
                return this._waveStream.Position;
            }
            set
            {
                this._waveStream.Position = value;
            }
        }
        
        public MemoryWaveStream(byte[] sampleData, WaveFormat waveFormat)
        {
            this._waveStream = new MemoryStream();
            BinaryWriter binaryWriter = new BinaryWriter(this._waveStream);
            binaryWriter.Write(new char[]
            {
                'R',
                'I',
                'F',
                'F'
            });
            int value = 36 + sampleData.Length;
            binaryWriter.Write(value);
            binaryWriter.Write(new char[]
            {
                'W',
                'A',
                'V',
                'E',
                'f',
                'm',
                't',
                ' '
            });
            waveFormat.Serialize(binaryWriter);
            binaryWriter.Write(new char[]
            {
                'd',
                'a',
                't',
                'a'
            });
            binaryWriter.Write(sampleData.Length);
            binaryWriter.Write(sampleData, 0, sampleData.Length);
            this._waveStream.Position = 0L;
        }
        
        public override int Read(byte[] buffer, int offset, int count)
        {
            return this._waveStream.Read(buffer, offset, count);
        }

        public Stream get()
        {
            return this._waveStream;
        }

        public override void Flush()
        {
            this._waveStream.Flush();
        }

        public override long Seek(long offset, SeekOrigin origin)
        {
            return this._waveStream.Seek(offset, origin);
        }

        public override void SetLength(long value)
        {
            throw new NotImplementedException();
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            throw new NotImplementedException();
        }        
    }
}

 

 更多的语音使用学习参照百度官网教程:https://ai.baidu.com/ai-doc/

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值