语音和文本互转
安装Baidu.AI
Install-Package Baidu.AI
将文本合成语音
将文本合成为语音文件主要使用百度云API中的Tts类,该类是语音合成的交互类,为使用语音合成的开发人员提供了一系列的交互方法。
Tts 类中提供了一个Synthnesis 方法,哟过来将文本合成语音,其语法如下:
参数 |
类型 |
描述 |
text |
String |
合成的文本,使用UTF-8编码,请注意文本长度必须小于1024字节 |
option |
Dictionary |
可选参数,用来指定合成语音的一些信息,如语速,男声、女生、音量 |
spd |
String |
语速,0-9,默认为5,中语速 |
pit |
String |
语调,取值0-9,默认5 中语调 |
vol |
String |
音量,取值0-15,默认为5 中音量 |
per |
string |
发音人选择,0为女声 1为男声 3为情感合成 度逍遥 4 为情感合成 度YY |
guid |
string |
用户唯一标识,用来区分用户,用来设置机器MAC地址或IMEI码,长度为60以内 |
语音识别
将语音识别为文本主要使用百度云API中的Asr类,该类是语音识别的交互类,为使用语音识别的开发人员提供了一系列的交互方法。
Asr 类中提供了一个Recognize方法,用来向远程服务上传整段语音进行识别,其语法如下:
参数 |
类型 |
描述 |
data |
byte[] |
语音二进制数据,语音文件的格式,pcm或者wav或者amr, 不区分大小写 |
format |
string |
语音文件的格式,pcm或者wav或者amr 不区分大小写,推荐pcm文件 |
rate |
int |
采样率,16000,固定值 |
Recognize方法返回值
参数 |
类型 |
是否一定输出 |
描述 |
err_no |
int |
是 |
错误码 |
err_msg |
int |
是 |
错误描述 |
sn |
int |
是 |
语音数据唯一标识,系统内部产生,用于debug |
result |
int |
是 |
识别结果数组,提供1~5个候选结果,string 类型为识别的字符串 UTF-8编码 |
Code
using Baidu.Aip.Speech;
using Sunny.UI;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
namespace VoiceToWord
{
public partial class Form1 : UIForm
{
private readonly Tts _ttsClient; //声明TTS对象,该对象用来对语音进行操作
private readonly Asr _asrClient; //声明Asr对象,该对象用来识别语言文件
string APPID = "11079594"; //自己在百度云中创建的应用的ID
string API_KEY = "fMA2S0U0dGPHbdbn3EmtRGfz";
string SECRET_KEY = "2d9bbfc2a45bde1056d0c1fd272fd5f2";//设置自己申请百度云账号时的SecretKey
public Form1()
{
_ttsClient = new Tts(API_KEY, SECRET_KEY);
_asrClient = new Asr(APPID, API_KEY, SECRET_KEY);
CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void btnYuYinHeCheng_Click(object sender, EventArgs e)
{
var option = new Dictionary<string, object>();
if (rbtnGirl.Checked)
{ //女生
option = new Dictionary<string, object>() {
{"spd",5 }, //语速
{ "vol",7}, //音量
{ "per",0} /*0为女声 1为男声 3为情感合成-度逍遥 4为情感合成 度YY*/
};
}
else if (rBtnBoy.Checked)
{
option = new Dictionary<string, object>()
{
{"spd",5 },
{ "vol",7},
{ "per",1}
};
}
else if (rbtnD1.Checked)
{
option = new Dictionary<string, object>() {
{"spd",5 },
{ "vol",7},
{"per",3 }
};
}
else if (rbtnD2.Checked) {
option = new Dictionary<string, object>() {
{ "spd",5},
{"vol",7 },
{ "per",4}
};
}
//支持格式:pcm(不压缩) wav(不压缩) amr 压缩格式 mp3 等
var result = _ttsClient.Synthesis(txtContent.Text, option);
string filename = DateTime.Now.ToLongDateString()+ ".mp3";
if (result.Success) {
File.WriteAllBytes(filename, result.Data); //保存语音文件
}
System.Diagnostics.Process.Start(filename); //打开播放语音文件
}
private void btnSelectFile_Click(object sender, EventArgs e)
{
txtNeiRong.Text = "";
OpenFileDialog file = new OpenFileDialog();
file.Filter = "音频文件|*.pcm;*.wav;*.amr;*.mp3";
if (file.ShowDialog() == DialogResult.OK) {
txtVoiceFile.Text = file.FileName;
System.Threading.ThreadPool.QueueUserWorkItem(
(p_temp) => {
//定义使用ffmpeg 转换视频命令,将格式转换为采用16k采样频率的wav文件
string cmd=@"ffmpeg-i"+txtVoiceFile.Text+" -ar 16000 ac 1 -f wav temp.wav";
Process p = new Process(); //创建一个进程
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false; //是否使用操作系统的Shell 启动
p.StartInfo.RedirectStandardInput = true;//接收来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
p.StartInfo.CreateNoWindow = true; //不显示程序窗体
p.Start(); //启动程序
//向cmd窗口发送输入信息
p.StandardInput.WriteLine(cmd+"&exit");
p.StandardInput.AutoFlush = true; //等待程序执行完退出进程
p.WaitForExit();
p.Close();
System.Threading.Thread.Sleep(1000);
var data = File.ReadAllBytes(txtVoiceFile.Text);//将文本内容保存为字节数组,按指定码率识别字节数组内容
var result = _asrClient.Recognize(data, "pcm", 16000);
txtNeiRong.Text = "识别内容:" + Environment.NewLine + result + Environment.NewLine + "\n\n提取的文字" +
Environment.NewLine;
if (result["err_msg"].ToString() == "success.") {
txtNeiRong.Text += result["result"];//显示内容
//File.Delete(txtVoiceFile.Text);
}
}
);
}
}
}
}
运行效果: