海思HI35xx语音识别方案
前言
语音识别是智能化应用的一个重要分支,也是语音交互功能的基础。语音识别基于神经网络算法,借助大数据进行模型训练,据科大讯飞相关数据报道,它们已经能够实现98%以上的准确识别率,同时支持多种外语及国内的一些方言。从语音技术实现方式分类可以分为本地识别和云识别,本地识别主要是借助语音芯片诸如LD3320等,而云识别目前国内比较火的有科大讯飞、百度AI等云服务提供,它们提供友好的API接口,支持多种开发语言,相比于本地语音识别,它的识别准确率更高,应用场景更为灵活。
海思HI35xx音频知识
海思音频模块包含音频输入(AI)、音频输出(AO)、音频编码(AENC)、音频解码(ADEC)这四个模块,这几个模块实现了声音采集、声音播放以及声音编解码的功能。原始的音频信号是模拟信号,通过pcm方式进行数字化,常用音频采样频率有8khz、16khz、32khz、48khz。根据香农采样定理,为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍,而人能听到的声音频率范围在20~20000hz,而且听力敏感区是集中在中频区段,所以用16khz频率采样作为语音识别原始数据既能保持音质,也能降低数据运算复杂度。
根据笔者的经验,海思音频模块硬件实现方式有两种,一种是将音频芯片集成到芯片内部,作为片上资源使用,另一种是外接音频芯片方式,如wm9874。这两种接法大同小异,与音频芯片控制指令数据交互是由I2C实现,而音频数据交互则是由I2S或者PCM来实现。软件开发需要注意的是音频采样率设置、采样数据位宽,8位或者16位,不同的云语音识别平台对音频采样率、位宽都有要求,不过比较通用的是16khz采样、16位数据宽度、pcm音频格式。下图是海思CPU与音频芯片用I2S或PCM方式进行数据交互的示意图,可见PCM方式只有单声道,而没有多声道立体声的概念。
语音识别方案
语音识别方案分为硬件本地实现和智能语音云实现,我比较推崇使用云方式,它成本较低,后期维护少,识别准确率高,而且随着5G商业化浪潮实现,网络延时基本可以忽略,语音识别实时性与本地相比无异。配合HIMPP平台的API使用实现音频采集、处理、推云平台的功能并不难,首先MIC作为音频模拟信号输入源,由AUDIO CODE芯片进行模数转换,然后通过I2S或者PCM方式与CPU进行数据交互,接着CPU通过Socket连接云服务器进行推流,云将语音识别的数据返回。此外,云还有语音合成功能,它可以将文字合成为语音,此过程恰好与语音识别的数据流相反,并最终推向speaker。HIMPP平台的API使用可以参考《海思HI35xx平台软件开发快速入门之背景知识》
语音识别案例
这里参考了百度AI语音识别案例源码,百度AI语音识别的样例编程语言环境为C++,由于采用了云方式,避免不了进行网络开发,根据百度AI语音开发文档,有要求一定运行环境,网络连接请求依赖于curl、加密依赖于openssl、数据交互格式依赖jsoncpp,还有百度语音识别的SDK开发包,这里这里给出了这些运行环境移植的源码。
// 请替换您下载的C++SDK路径
#include "aip-cpp-sdk-0.7.4/speech.h"
void ASR(aip::Speech* client);
void ASR_url(aip::Speech* client);
void TTS(aip::Speech* client);
int main()
{
// 务必替换百度云控制台中新建百度语音应用的 Api Key 和 Secret Key
aip::Speech * client = new aip::Speech("15398376", "GgCrxhNOhe0UnP9k0hHaUxfF", "TEmp8hCGMeVV61VG0PAKXKRG4nekMLmI");
ASR(client);
ASR_url(client);
TTS(client);
return 0;
}
/**
* ASR语音识别示例
*/
void ASR(aip::Speech* client) {
std::map<std::string, std::string> options;
options["lan"] = "ZH";
std::string file_content;
aip::get_file_content("./16k_test.pcm", &file_content);
Json::Value result = client->recognize(file_content, "pcm", 16000, options);
std::cout << "语音识别本地文件结果:" << std::endl << result.toStyledString();
}
/**
* ASR语音识别示例,使用远程文件地址
*/
void ASR_url(aip::Speech* client) {
std::map<std::string, std::string> options;
options["lan"] = "zh";
Json::Value result =
client->recognize_url("http://bos.nj.bpc.baidu.com/v1/audio/8k.amr",
"http://your_site/dump",
"amr", 8000, options);
std::cout << "语音识别远程文件结果:" << std::endl << result.toStyledString();
}
/**
* TTS语音合成示例
*/
void TTS(aip::Speech* client) {
std::ofstream ofile;
std::string file_ret;
std::map<std::string, std::string> options;
options["spd"] = "5";
options["per"] = "2";
ofile.open("./tts.mp3", std::ios::out | std::ios::binary);
Json::Value result = client->text2audio("百度语音合成测试", options, file_ret);
// 如果file_ret为不为空则说明合成成功,返回mp3文件内容
if (!file_ret.empty())
{
// 合成成功保存文件
ofile << file_ret;
std::cout << "语音合成成功,打开目录下的tts.mp3文件听听看" << std::endl;
} else {
// 合成出错,打印错误信息
std::cout << result.toStyledString();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 分享
- 举报

-
浏览量:4659次2020-07-27 16:34:42
-
浏览量:2191次2020-08-04 20:24:33
-
浏览量:1150次2024-01-05 10:33:11
-
浏览量:1449次2023-11-06 15:17:14
-
浏览量:1137次2023-10-26 15:06:55
-
浏览量:1122次2023-10-25 15:43:39
-
浏览量:1124次2023-10-26 15:18:07
-
浏览量:935次2023-11-06 16:38:09
-
浏览量:2901次2020-08-04 20:12:26
-
浏览量:1043次2023-11-24 16:31:45
-
浏览量:1201次2023-11-24 16:27:11
-
浏览量:2432次2020-08-04 20:26:22
-
浏览量:3762次2020-07-27 15:12:15
-
浏览量:3333次2020-07-28 10:38:42
-
浏览量:6955次2020-09-27 14:15:09
-
浏览量:2924次2020-07-28 17:54:29
-
浏览量:4698次2020-07-30 10:26:53
-
浏览量:3117次2020-07-29 15:38:57
-
浏览量:3713次2022-01-31 09:00:24
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖

在学了在学了!






举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明