各位好呀,又是我勾勾啦
这次给大家带来 语音识别极速版的C#性能测试喔!
在上方可以看到,官宣的通用版与极速版近乎相差5倍的时长呢!如果在相同的文件下多次识别都是如此完美的话,那就太棒了!
那废话不多说,燥起来!
Step 1.首先要学习一下C#的极速版代码怎么写喔
【传送门】【百度大脑新品体验】语音识别极速版~C#开荒攻略
http://ai.baidu.com/forum/topic/show/942860
Step 2.快速的写一下C#录音的库和普通版的代码
首先是录音,语音识别的基本是语音文件
在17年我曾写过3篇有关C#在win下的录音、唤醒、VAD的文章,各位可以大可参考用到这里来喔~(代码中只含录音逻辑。唤醒和VAD各位可参考先前的文章尝试修改喔)
【传送门】
[语音技术]C#在windows平台的录音类封装
http://ai.baidu.com/forum/topic/show/492634
[语音技术]C#在win平台基于录音类试写唤醒
http://ai.baidu.com/forum/topic/show/492635
[语音技术]C#在win平台基于录音类试写打断
http://ai.baidu.com/forum/topic/show/492717
技能固然强大,自身职责不能忽略喔!一定要好好处理源数据,一定程度上也能提高准确率呢~
我这里自己录了一个正正好好5s的音,然后用他作为素材在普通版和极速版之间测试真实的识别时长。
以下是快速构建好的普通版语音识别代码
这里用了一个Stopwatch来精确考量请求开始到请求结束所使用到的时间,虽然其中会有一定的网络波动因素,但在数量面前它将毫无作用。
var client = new Aip.Speech.Asr(Global.GlobalConfig.APP_ID,Global.GlobalConfig.API_KEY, Global.GlobalConfig.SECRET_KEY);
client.Timeout = 60000; // 修改超时时间
Stopwatch sw = new Stopwatch();
var data = File.ReadAllBytes(@"I:\2019-04-12 百度4月\5srecord.pcm");
int i = 0;
while(i<20)
{
sw.Reset();
sw.Start();
var result = client.Recognize(data, "pcm", 16000);
sw.Stop();
Console.WriteLine(result);
Console.WriteLine(sw.ElapsedMilliseconds);
i++;
}
Console.ReadLine();
同理,我采集了20次普通版识别此文件所耗的时间,并用excel记录了下来
极速版json:
HttpClient HClient = new HttpClient();
string AKRequestURL = $"https://openapi.baidu.com/oauth/2.0/token";
string AsrInterfaceURL = $"https://vop.baidu.com/pro_api";
List> paraList = new List>
{
new KeyValuePair("grant_type", "client_credentials"),
new KeyValuePair("client_id", Global.GlobalConfig.API_KEY),
new KeyValuePair("client_secret", Global.GlobalConfig.SECRET_KEY)
};
HttpResponseMessage response = HClient.PostAsync(AKRequestURL, new FormUrlEncodedContent(paraList)).Result;
JObject res = JObject.Parse(response.Content.ReadAsStringAsync().Result);
string accessToken = res["access_token"].ToString();
i = 0;
while(i<20)
{
HClient = new HttpClient();
//client.MaxResponseContentBufferSize = 2147483647;
string base64 = Convert.ToBase64String(data);
JObject json = new JObject();
json["format"] = "pcm";
json["rate"] = 16000;
json["channel"] = 1;
json["cuid"] = GetMacAddress();
json["token"] = accessToken;
json["len"] = data.Length;
json["speech"] = base64;
json["dev_pid"] = 80001;
var content = new StringContent(json.ToString(), Encoding.UTF8, "application/json");
sw.Restart();
response = HClient.PostAsync(AsrInterfaceURL, content).Result;
sw.Stop();
JObject result = JObject.Parse(response.Content.ReadAsStringAsync().Result);
Console.WriteLine(result.ToString());
Console.WriteLine(sw.ElapsedMilliseconds);
i++;
}
极速版raw:
HttpClient HClient = new HttpClient();
string AKRequestURL = $"https://openapi.baidu.com/oauth/2.0/token";
string AsrInterfaceURL = $"https://vop.baidu.com/pro_api";
List> paraList = new List>
{
new KeyValuePair("grant_type", "client_credentials"),
new KeyValuePair("client_id", Global.GlobalConfig.API_KEY),
new KeyValuePair("client_secret", Global.GlobalConfig.SECRET_KEY)
};
HttpResponseMessage response = HClient.PostAsync(AKRequestURL, new FormUrlEncodedContent(paraList)).Result;
JObject res = JObject.Parse(response.Content.ReadAsStringAsync().Result);
string accessToken = res["access_token"].ToString();
Stopwatch sw = new Stopwatch();
var data = File.ReadAllBytes(@"I:\2019-04-12 百度4月\5srecord.pcm");
i = 0;
while(i<20)
{
HClient = new HttpClient();
//client.MaxResponseContentBufferSize = 2147483647;
string base64 = Convert.ToBase64String(data);
JObject json = new JObject();
json["format"] = "pcm";
json["rate"] = 16000;
json["channel"] = 1;
json["cuid"] = GetMacAddress();
json["token"] = accessToken;
json["len"] = data.Length;
json["speech"] = base64;
json["dev_pid"] = 80001;
var content = new StringContent(json.ToString(), Encoding.UTF8, "application/json");
sw.Restart();
response = HClient.PostAsync(AsrInterfaceURL, content).Result;
sw.Stop();
JObject result = JObject.Parse(response.Content.ReadAsStringAsync().Result);
Console.WriteLine(result.ToString());
Console.WriteLine(sw.ElapsedMilliseconds);
i++;
}
最后整理到excel的结果如下
单位都是毫秒喔~
最后可以看到,raw方式的极速版略胜于json版(因为json版base64体积增大,编码需要一定时长)
以上数据基于I7-6700K CPU测试。CPU可能影响编码效率。
数据也含有一定的网络波动,这无法避免。
本项目基于.NET Framework 4.5开发,包含Microsoft.DirectX.dll & Microsoft.DirectX.DirectSound.dll,用于采集声音。依赖于Newtonsoft.Json 10.0.0.0
【项目传送门】
https://gitee.com/Jack.Zhou/Baidu.FastASR.Test
语音识别可以应用于多个创新想法喔~这里我给各位带来几个我曾经做过的例子~
利用语音技术,基于即时通讯平台构建智能门禁
https://v.youku.com/v_show/id_XMzkxNTU4NzUyOA==.html?x&sharefrom=android&sharekey=2cc745957e168788abe187a4217e03285
利用语音识别,配合百度翻译接口,建立简单实时双语字幕
https://v.youku.com/v_show/id_XMzIwODE1MTg0OA==.html?spm=a2h3j.8428770.3416059.1
感谢各位的收看哟,祝你们的开发顺顺利利,马到成功~
这么多精华帖子,一个个膜拜
这利器真好,
从练普通话开始哈哈
语音识别这块的精度自己还掌握不了
是啊,这倒是一个办法
有没有android降噪增强的代码?最近发现偶尔的极端环境.远程传输语音的噪音很强.
真是语音识别利器
哈哈哈,短处靠别人专业的产品来弥补就好了
硬件还是个小白
目前市场上大多数是用麦克风阵列加载的声源定位以及降噪实现提高语音识别率
不牛啦,只是在百度平台上的一颗小草哈哈
牛人就是不一样,向牛人学习。
大佬们都值得崇拜
硬件降噪效果好更好呀,算法降噪毕竟就要消耗资源了
之前听说过用降噪的方式,不过是用硬件去降噪的,如果有降噪的算法确实更方便
这个我暂时还没深入研究,跟我公司业务不搭所以我还没涉及到。抱歉啦
人声加强和噪声滤波算法,谢谢,受教,有什么demo吗?
很多方式喔,比较简单的就是吐字清晰。进阶的就是更换声音采集设备,高级的就是人声加强和噪声滤波算法
保证你的语音文件发音尽可能标准,吐字清晰 ^_^
有什么办法能提语音识别度