文章目录

相关链接
使用前先查阅下面的使用文档:
C++ sdk使用文档: https://ai.baidu.com/ai-doc/SPEECH/dlbxfrs5o- 音频格式及转码:https://ai.baidu.com/ai-doc/SPEECH/7k38lxpwf
- 调用示例:https://github.com/Baidu-AIP/sdk-demo
- 测试音频下载链接:https://platform.bj.bcebos.com/sdk/asr/asr_doc/doc_download_files/public.zip
Ⅰ. 安装使用
第一步:登录百度云
网址:https://login.bce.baidu.com/

第二步: 搜索语音技术

第三步:领取免费试用资源


第四步:创建应用


第五步:获取秘钥
在创建完毕应用后,平台将会分配给您此应用的相关凭证,主要为 AppID 、API Key 、Secret Key。以上三个信息是您应用实际开发的主要凭证,请您妥善保管。下图为示例内容:

第六步:使用 sdk 调用服务
下载地址:https://ai.baidu.com/sdk

上述服务下载完解压放到服务器中即可!
最后安装 sdk 所需依赖:
shell
# 安装 jsoncpp
sudo apt install libjsoncpp-dev
# 安装 libcurl
sudo apt install curl
# 安装 openssl
# ubuntu 22.04 默认安装了
测试样例
测试代码的目录如下所示,我们只需要用到里面的 speech.h 文件:

cpp
#include "../aip-cpp-sdk/speech.h" // 引入百度语音识别 SDK 头文件
// 语音识别函数
void asr(aip::Speech &client)
{
// 创建一个字符串变量来存储音频文件的内容
std::string file_content;
// 读取本地的音频文件(16k.pcm),并将其内容存入 file_content
aip::get_file_content("16k.pcm", &file_content);
// 调用百度语音识别 SDK 中的 recognize 方法进行语音识别
// file_content:传入音频数据
// "pcm":音频格式,指示音频文件是 PCM 编码格式
// 16000:音频采样率(16kHz)
// aip::null:附加参数,通常为 null
Json::Value result = client.recognize(file_content, "pcm", 16000, aip::null);
// 检查识别结果的错误码,如果错误码不为 0,表示识别失败
if (result["err_no"].asInt() != 0) {
std::cout << result["err_msg"].asString() << std::endl;
return;
}
// 输出识别结果的第一个元素,通常是转录后的文本
std::cout << result["result"][0].asString() << std::endl;
}
int main()
{
// 设置应用的 APPID/AK/SK(需要从百度云获取)
std::string app_id = "117644864";
std::string api_key = "5Bt1BCHIJcJIO2AoMbBsSqC9";
std::string secret_key = "Y1gqrypoZHMWAoh6M20UH88wfbn89uRw";
// 初始化百度语音识别客户端对象,传入应用的 APPID、API 密钥和 Secret Key
aip::Speech client(app_id, api_key, secret_key);
asr(client); // 进行语音识别
return 0;
}
makefile 文件:
makefile
main : main.cc
g++ -std=c++17 $^ -o $@ -lcurl -lcrypto /usr/lib/x86_64-linux-gnu/libjsoncpp.so.1.8.4 # 版本问题特殊处理
然后这里用到的 16k.pcm 文件的话,到码云上面下载即可!
Ⅱ. 二次封装

cpp
#pragma once
#include "aip-cpp-sdk/speech.h"
#include "logger.hpp"
// ASRClient 类封装了百度语音识别 SDK 的接口
class ASRClient
{
public:
using ptr = std::shared_ptr<ASRClient>;
public:
ASRClient(const std::string &app_id,
const std::string &api_key,
const std::string &secret_key)
: _client(app_id, api_key, secret_key)
{}
std::string recognize(const std::string &speech_data, std::string &err)
{
Json::Value result = _client.recognize(speech_data, "pcm", 16000, aip::null);
if (result["err_no"].asInt() != 0) {
LOG_ERROR("语音识别失败:{}", result["err_msg"].asString());
err = result["err_msg"].asString();
return std::string();
}
return result["result"][0].asString();
}
private:
aip::Speech _client;
};
测试代码
cpp
#include "../../../header/asr.hpp"
#include "gflags/gflags.h"
DEFINE_string(app_id, "117644864", "语音平台应用ID");
DEFINE_string(api_key, "5Bt1BCHIJcJIO2AoMbBsSqC9", "语音平台API密钥");
DEFINE_string(secret_key, "Y1gqrypoZHMWAoh6M20UH88wfbn89uRw", "语音平台加密密钥");
DEFINE_bool(run_mode, false, "程序的运行模式,false-调试; true-发布;");
DEFINE_string(log_file, "", "发布模式下,用于指定日志的输出文件");
DEFINE_int32(log_level, 0, "发布模式下,用于指定日志输出等级");
int main(int argc, char *argv[])
{
google::ParseCommandLineFlags(&argc, &argv, true);
init_logger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);
ASRClient client(FLAGS_app_id, FLAGS_api_key, FLAGS_secret_key);
std::string file_content, err;
aip::get_file_content("16k.pcm", &file_content); // 读取本地的音频文件(16k.pcm),并将其内容存入 file_content
std::string res = client.recognize(file_content, err); // 进行语音识别
if (res.empty())
{
LOG_ERROR("识别失败:{}", err);
return -1;
}
std::cout << res << std::endl;
return 0;
}
makefile 文件:
makefile
test : test.cc
g++ -std=c++17 $^ -o $@ -lfmt -lspdlog -lgflags -lcurl -lcrypto /usr/lib/x86_64-linux-gnu/libjsoncpp.so.1.8.4
