本文介绍了如何使用阿里云智能语音服务提供的C++ SDK,包括SDK的安装方法及SDK代码示例。
前提条件
示例说明
录音文件识别示例使用了nlsCommonSDK的AlibabaNlsCommon::FileTrans
提交识别请求和查询识别结果,采用的是RPC风格的POP API调用方式。
下载安装
下载nlsCommonSDK,文件包含如下几部分:
CMakeLists.txt:示例代码工程的CMakeList文件。
readme.txt:SDK说明。
release.log:更新记录。
version:版本号。
build.sh:Demo编译脚本。
demo:示例文件。
文件名
描述
文件名
描述
fileTransDemo.cpp
录音文件识别示例。
include:包含SDK头文件,以及部分第三方头文件。各文件如下表所示。
文件名
描述
文件名
描述
openssl
OpenSSL头文件目录,Linux下使用。
curl
curl头文件目录。
uuid
UUID头文件目录,Linux下使用。
json
jsoncpp头文件目录。
Global.h
全局声明头文件。
FileTrans.h
录音文件识别头文件。
lib:包含curl、jsoncpp动态库。
根据平台不同,使用如下版本软件加载库文件:
Linux(Glibc:2.5及以上,Gcc4或Gcc5)
Windows(VS2013、VS2015)
编译运行操作步骤:
Linux下安装工具要求如下:
Glibc 2.5及以上
Gcc4或Gcc5
Windows下需要您自行搭建示例工程(请将示例文件修改为含有BOM的
UTF-8
编码格式),依赖库如下:openssl-1.0.2j
libuuid-1.0.3
curl-7.60.0
jsoncpp-0.10.6
假设示例文件已解压至
path/to
路径下,在Linux终端依次执行如下命令编译运行程序。支持Cmake:
确认本地系统已安装Cmake 2.4及以上版本。
切换目录:
cd path/to/sdk/lib
。解压缩文件:
tar -zxvpf linux.tar.gz
。切换目录:
cd path/to/sdk
。执行编译脚本:
./build.sh
。切换目录:
cd path/to/sdk/demo
。执行文件识别示例程序:
./fileTransDemo your-AccessKeyId your-AccessKeySecret your-appkey
。
不支持Cmake:
切换目录:
cd path/to/sdk/lib
。解压缩文件:
tar -zxvpf linux.tar.gz
。切换目录:
cd path/to/sdk/demo
。使用g++编译命令编译示例程序:
g++ -o fileTransDemo fileTransDemo.cpp -I path/to/sdk/include/ -L path/to/sdk/lib/linux -ljsoncpp -lssl -lcrypto -lcurl -luuid -
lalibabacloud-idst-common-D_GLIBCXX_USE_CXX11_ABI=0
。指定库路径:
export LD_LIBRARY_PATH=path/to/sdk/lib/linux/
。执行文件识别示例程序:
./fileTransDemo your-AccessKeyId your-AccessKeySecret your-appkey
。
关键接口
FileTrans:录音文件识别对象。您可以从中获取录音文件识别结果、失败信息等。
代码示例
下载nls-sample-16k.wav。该示例录音文件为PCM编码格式16000 Hz采样率,管控台设置的模型为通用模型。如果使用其他录音文件,请填入对应的编码格式和采样率,并在管控台设置对应的模型。关于模型设置,请参见管理项目。
#include <iostream>
#include <string>
#include "FileTrans.h"
#ifdef _WIN32
#include <windows.h>
#endif // _WIN32
using std::string;
using std::cout;
using std::endl;
using namespace AlibabaNlsCommon;
#if defined _WIN32
string UTF8ToGBK(const string &strUTF8) {
int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
unsigned short * wszGBK = new unsigned short[len + 1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (char*)strUTF8.c_str(), -1, (wchar_t*)wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK = new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, (wchar_t*)wszGBK, -1, szGBK, len, NULL, NULL);
string strTemp(szGBK);
delete[] szGBK;
delete[] wszGBK;
return strTemp;
}
#endif
// 录音文件识别
int fileTrans(const char* accessKeyId, const char* accessKeySecret, const char* appKey, const char* fileLink) {
FileTrans request;
/*设置阿里云账号AccessKey Id*/
request.setAccessKeyId(accessKeyId);
/*设置阿里云账号AccessKey Secret*/
request.setKeySecret(accessKeySecret);
/*设置阿里云AppKey*/
request.setAppKey(appKey);
/*设置音频文件url地址*/
request.setFileLinkUrl(fileLink);
/*设置闲时版连接域名,这里默填写的是上海地域,如果要使用其它地域请参考各地域POP调用参数*/
request.setDomain("speechfiletranscriberlite.cn-shanghai.aliyuncs.com");
/*设置闲时版连接版本*/
request.setServerVersion("2021-12-21");
/*设置连接地域*/
request.setRegionId("cn-shanghai");
/*开始文件识别, 成功返回0, 失败返回-1*/
int ret = request.applyFileTrans();
if (-1 == ret) {
cout << "FileTrans failed: " << request.getErrorMsg() << endl; /*获取失败原因*/
return -1;
} else {
string result = request.getResult();
#ifdef _WIN32
result = UTF8ToGBK(result);
#endif
cout << "FileTrans successed: " << result << endl;
return 0;
}
}
int main(int argc, char* argv[]) {
if (argc < 4) {
cout << "FileTransDemo need params : <AccessKey Id> <AccessKey Secret> <app - key>" << endl;
return -1;
}
const char* accessKeyId = argv[1];
const char* accessKeySecret = argv[2];
const char* appKey = argv[3];
const char* fileLink = "https://gw.alipayobjects.com/os/bmw-prod/0574ee2e-f494-45a5-820f-63aee583045a.wav";
fileTrans(accessKeyId, accessKeySecret, appKey, fileLink);
return 0;
}
常见问题
- 本页导读 (1)
- 前提条件
- 示例说明
- 下载安装
- 关键接口
- 代码示例
- 常见问题
- C++ SDK(3.0及以后版本)使用语音合成和语音识别功能,可以提高GCC5.0以上的编译版本吗?
- 为什么连接不到framework?
- SDK报错“DNS resolved timeout”是什么问题?
- C++ SDK ASR请求有DNS解析失败的情况导致异常,报错“ali-recog-skd.log:AliSpeech_C++SDK(ERROR): GetInetAddressByHostname:252 DNS: resolved timeout.ali-recog-skd.log:AliSpeech_C++SDK(ERROR): start:76 start failed: DNS: resolved timeout..unimrcpserver_current.log: [ERROR] [[./ali/AliRecogChannel.cpp:772,onTaskFailed]]Ali Task start failed Msg :DNS: resolved timeout., start finised."”如何解决?
- C++ SDK(新)集成到其他项目中时,将CMakeLists.txt中的add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) 修改为add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1)后编译不通过如何解决?
- C++ SDK在Windows上使用,报错缺少nlsCommonSdk.dll如何解决?
- C++ SDK旧版NlsSdkCpp2.0和新版NlsSdkCpp3.X的区别是什么?
- C++版的SDK不支持实现C11规范吗? 现在导致项目无法链接SDK该如何解决?
- C++ SDK测试Demo成功,集成项目报错,DNS解析失败,报错“nls-gateway-cn-shanghai.aliyuncs.com dns failed: nodename nor servname provided, or not known”如何解决?
- C++ SDK测试Demo可以成功,集成项目报错,网络链接失败,报错“[dnsEventCallback:465]Node:0x7f087c001030 ai_canonname: nls-gateway-cn-shanghai.aliyuncs.com.gds.alibabadns.com[dnsEventCallback:477]Node:0x7f087c001030 IpV4:106.15.XX.XX[connectProcess:1329]Node:0x7f087c001030 sockFd:41[connectProcess:1347]Node:0x7f087c001030 new Socket ip:106.15.XX.XX port:443 Fd:41.[socketConnect:1458]Node:0x7f087c001030 Connect failed:Network is unreachable. retry...”如何解决?
- C++ SDK语音合成时传入的文本没有采用UTF-8编码会有什么错误信息?