一、准备工作
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/