本文介绍了如何使用阿里云智能语音服务提供的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;
}