本文介紹了如何使用阿里云智能語音服務提供的C++ SDK,包括SDK的安裝方法及SDK代碼示例。
前提條件
當前最新版本:1.2.2。發布日期:2018年11月14日。
使用SDK前,請先閱讀接口說明,詳情請參見接口說明。
已開通智能語音交互并獲取AccessKey ID和AccessKey Secret,詳情請參見從這里開始。
示例說明
錄音文件識別示例使用了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:錄音文件識別對象。您可以從中獲取錄音文件識別結果、失敗信息等。
代碼示例
該示例錄音文件為PCM編碼格式16000Hz采樣率,管控臺設置的模型為通用模型。如果使用其他錄音文件,請填入對應的編碼格式和采樣率,并在管控臺設置對應的模型。關于模型設置,請參見管理項目。
調用接口前,需配置環境變量,通過環境變量讀取訪問憑證。智能語音交互的AccessKey ID、AccessKey Secret和AppKey的環境變量名:NLS_AK_ENV、NLS_SK_ENV、NLS_APPKEY_ENV。
#include <stdlib.h>
#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("filetrans.cn-shanghai.aliyuncs.com");
/*設置連接地域,默認為上海*/
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[]) {
// 智能語音交互的AccessKey ID、AccessKey Secret和AppKey的環境變量名:NLS_AK_ENV、NLS_SK_ENV、NLS_APPKEY_ENV
const char* accessKeyId = getenv("NLS_AK_ENV");
const char* accessKeySecret = getenv("NLS_SK_ENV");
const char* appKey = getenv("NLS_APPKEY_ENV");
const char* fileLink = "https://gw.alipayobjects.com/os/bmw-prod/0574ee2e-f494-45a5-820f-63aee583045a.wav";
fileTrans(accessKeyId, accessKeySecret, appKey, fileLink);
return 0;
}