打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C++ SDK 2.0

本文档中的SDK只适用于7月5日新发布的2.0版语音服务,如果您是之前开通的,要使用此SDK需要新开通2.0版服务。否则请继续使用旧版SDK,并按照1.0版文档对接。

C++ SDK 2.0实时语音识别提供了异步识别方式同步识别方式。异步识别方式通过设置回调函数来获取识别结果,数据的发送和识别结果的获取运行在不同的线程中;同步识别方式通过get接口即可获取识别结果,数据的发送和识别结果的获取可以运行在同一个线程中。

下载安装

SDK 下载

C++ SDK 可从CppSdk2.0中下载,压缩文件包含以下几个部分:

  • CMakeLists.txt demo工程的CMakeList文件。
  • build 编译目录。
  • demo 包含demo.cpp,各语音服务配置文件。各文件描述见下表:
文件名描述
sdkDemo.cppwindows专用,默认为一句话识别功能demo,如需可自行替换成其它功能(编码格式:UTF-8 代签名)
speechRecognizerDemo.cpp一句话异步识别demo
speechRecognizerSyncDemo.cpp一句话同步识别demo
speechSynthesizerDemo.cpp语音合成demo
speechTranscriberDemo.cpp实时语音异步识别demo
speechTranscriberSyncDemo.cpp实时语音同步识别demo
testX.wav测试音频
  • include 包含sdk头文件,以及部分第三方头文件。各文件描述见下表
文件名描述
opensslopenssl
pthreadpthread线(windows下使用)
uuiduuid(linux下使用)
opusopus
jsoncppjsoncpp
nlsClient.hSDK实例
nlsEvent.h事件说明
speechRecognizerRequest.h一句话异步识别接口
speechRecognizerSyncRequest.h一句话同步识别接口
speechSynthesizerRequest.h语音合成接口
speechTranscriberRequest.h实时语音异步识别接口
speechTranscriberSyncRequest.h实时语音同步识别接口
iNlsRequest.hRequest基础
  • lib 包含sdk,以及第三方依赖库。linux.tar.gz为linux平台lib压缩包。windows.zip为windows平台lib压缩包。其中根据平台不同,可以选择linux版本32/64位libnlsCppSdk.so(glibc2.5及以上, Gcc4, Gcc5), windows版本32/64位nlsCppSdk.dll(VS2013、VS2015)。
  • readme.txt SDK说明。
  • release.log 版本说明。
  • version 版本号。
  • build.sh demo编译脚本。

依赖库:

SDK 依赖 openssl(l-1.0.2j),opus(1.2.1),jsoncpp(0.10.6),uuid(1.0.3),pthread(2.9.1)。依赖库放置在 path/to/sdk/lib 下。

注意:path/to/sdk/lib/linux/uuid仅在linux下使用。path/to/sdk/lib/windwos/1x.0/pthread仅在windows下使用。SDK压缩包内提供的依赖库为64位,不提供32位。在32位下,需要用户自行编译。

编译运行

  1. Linux平台下cmake编译:
  2. 1: 请确认本地系统以安装Cmake,最低版本2.6
  3. 2: cd path/to/sdk/lib
  4. 3: tar -zxvpf linux.tar.gz
  5. 4: cd path/to/sdk
  6. 3: 执行[./build.sh]编译demo
  7. 4: 编译完毕,cd path/to/sdk/demo,执行[./stDemo your-token your-appkey]
  8. 如果不支持cmake,可尝试手动编译:
  9. 1: cd path/to/sdk/lib
  10. 2: tar -zxvpf linux.tar.gz
  11. 3: cd path/to/sdk/demo
  12. 4: g++ -o stDemo speechTranscriberDemo.cpp -I./path/to/sdk/include -L./path/to/sdk/lib/linux -lnlsCppSdk -lssl -lcrypto -lopus -luuid -lpthread -ljsoncpp -D_GLIBCXX_USE_CXX11_ABI=0
  13. 5: export LD_LIBRARY_PATH=path/to/sdk/lib/linux/
  14. 6: ./stDemo your-token your-appkey
  15. Windows平台需要用户自己搭建工程。

Token获取方式可见链接:获取访问令牌

注意:

  1. linux环境下,运行环境最低要求:Glibc 2.5及以上, Gcc4、Gcc5
  2. windows下,目前支持VS2013,VS2015

关键接口

基础接口

  • NlsClient:语音处理Client,相当于所有语音相关处理类的Factory,全局创建一个实例即可。
  • NlsEvent:事件对象,用户可以从中获取Request状态码、云端返回结果、失败信息等。

异步识别接口

  • SpeechTranscriberRequest:实时音频流识别请求对象。
  • SpeechTranscriberCallback:回调事件函数集合的对象,语音结果、异常等回调的统一入口。

同步识别接口

  • SpeechTranscriberSyncRequest: 一句话识别同步请求对象。

更多介绍参见api文档链接:C++ API接口说明

C++ SDK自定义错误码

错误码错误描述解决方案
10000001SSL: couldn’t create a ……!建议重试
10000002openssl官方错误描述根据描述提示处理之后,建议重试
10000003系统错误描述根据系统错误描述提示处理
10000004URL: The url is empty.检查是否设置 云端URL地址
10000005URL: Could not parse WebSocket url检查是否正确设置 云端URL地址
10000006MODE: unsupport mode.检查时都正确设置了语音功能模式
10000007JSON: Json parse failed.服务端发送错误响应内容,请提供task_id,并反馈给阿里云
10000008WEBSOCKET: unkown head type.服务端发送错误WebSocket类型,请提供task_id,并反馈给阿里云
10000009HTTP: connect failed.与云端连接失败,请检查网络,在重试
HTTP协议官方状态码HTTP: Got bad status.根据HTTP协议官方描述提示处理
系统错误码IP: ip address is not valid.根据系统错误描述提示处理
系统错误码ENCODE: convert to utf8 error.根据系统错误描述提示处理
10000010please check if the memory is enough内存不足. 请检查本地机器内存
10000011Please check the order of execution接口调用顺序错误(接收到Failed/complete事件时,SDK内部会关闭连接。此时在调用send会上报错误。)
10000012StartCommand/StopCommand Send failed参数错误. 请检查参数设置是否正确
10000013The sent data is null or dataSize <= 0.发送错误. 请检查发送参数是否正确
10000014Start invoke failed.start超时错误. 请调用stop,释放资源,重新开始识别流程.
10000015connect failed等connect失败. 释放资源,重新开始识别流程.

代码示例

实时语音异步识别示例

完整示例,详见SDK压缩包中的demo目录speechTranscriberDemo.cpp文件。

  1. // 工作线程
  2. void* pthreadFunc(void* arg) {
  3. int sleepMs = 0;
  4. ParamCallBack cbParam;
  5. SpeechTranscriberCallback* callback = NULL;
  6. // 0: 从自定义线程参数中获取token, 配置文件等参数.
  7. ParamStruct* tst = (ParamStruct*)arg;
  8. if (tst == NULL) {
  9. cout << "arg is not valid." << endl;
  10. return NULL;
  11. }
  12. // 初始化自定义回调参数, 仅作为示例表示参数传递, 在demo中不起任何作用
  13. cbParam.iExg = 1;
  14. cbParam.sExg = "exg.";
  15. /* 打开音频文件, 获取数据 */
  16. ifstream fs;
  17. fs.open(tst->fileName.c_str(), ios::binary | ios::in);
  18. if (!fs) {
  19. cout << tst->fileName << " isn't exist.." << endl;
  20. return NULL;
  21. }
  22. /*
  23. * 1: 创建并设置回调函数
  24. */
  25. callback = new SpeechTranscriberCallback();
  26. callback->setOnTranscriptionStarted(onTranscriptionStarted, &cbParam); // 设置识别启动回调函数
  27. callback->setOnTranscriptionResultChanged(onTranscriptionResultChanged, &cbParam); // 设置识别结果变化回调函数
  28. callback->setOnTranscriptionCompleted(onTranscriptionCompleted, &cbParam); // 设置语音转写结束回调函数
  29. callback->setOnSentenceBegin(onSentenceBegin, &cbParam); // 设置一句话开始回调函数
  30. callback->setOnSentenceEnd(onSentenceEnd, &cbParam); // 设置一句话结束回调函数
  31. callback->setOnTaskFailed(onTaskFailed, &cbParam); // 设置异常识别回调函数
  32. callback->setOnChannelClosed(onChannelClosed, &cbParam); // 设置识别通道关闭回调函数
  33. /*
  34. * 创建实时音频流识别SpeechTranscriberRequest对象, 参数为callback对象.
  35. * request对象在一个会话周期内可以重复使用.
  36. * 会话周期是一个逻辑概念. 比如Demo中, 指读取, 发送完整个音频文件数据的时间.
  37. * 音频文件数据发送结束时, 可以releaseTranscriberRequest()释放对象.
  38. * createTranscriberRequest(), start(), sendAudio(), stop(), releaseTranscriberRequest()请在
  39. * 同一线程内完成, 跨线程使用可能会引起异常错误.
  40. */
  41. /*
  42. * 2: 创建实时音频流识别SpeechTranscriberRequest对象
  43. */
  44. SpeechTranscriberRequest* request = NlsClient::getInstance()->createTranscriberRequest(callback);
  45. if (request == NULL) {
  46. cout << "createTranscriberRequest failed." << endl;
  47. delete callback;
  48. callback = NULL;
  49. return NULL;
  50. }
  51. request->setAppKey(tst->appkey.c_str()); // 设置AppKey, 必填参数, 请参照官网申请
  52. request->setFormat("pcm"); // 设置音频数据编码格式, 可选参数,目前支持pcm, opu. 默认是pcm
  53. request->setSampleRate(16000); // 设置音频数据采样率, 可选参数,目前支持16000, 8000. 默认是16000
  54. request->setIntermediateResult(false); // 设置是否返回中间识别结果, 可选参数. 默认false
  55. request->setPunctuationPrediction(false); // 设置是否在后处理中添加标点, 可选参数. 默认false
  56. request->setInverseTextNormalization(false); // 设置是否在后处理中执行数字转写, 可选参数. 默认false
  57. request->setSemanticSentenceDetection(false); // 设置是否语义断句, 可选参数. 默认false
  58. request->setMaxSentenceSilence(500); // 设置vad阀值, 可选参数. 合法参数范围200~2000(ms), 默认值800ms
  59. request->setToken(tst->token.c_str()); // 设置账号校验token, 必填参数
  60. /*
  61. * 3: start()为阻塞操作, 发送start指令之后, 会等待服务端响应, 或超时之后才返回
  62. */
  63. if (request->start() < 0) {
  64. cout << "start() failed." << endl;
  65. NlsClient::getInstance()->releaseTranscriberRequest(request); // start()失败,释放request对象
  66. delete callback;
  67. callback = NULL;
  68. return NULL;
  69. }
  70. // 文件是否读取完毕, 或者接收到TaskFailed, closed, completed回调, 终止send
  71. while (!fs.eof()) {
  72. char data[FRAME_SIZE] = {0};
  73. fs.read(data, sizeof(char) * FRAME_SIZE);
  74. int nlen = fs.gcount();
  75. /*
  76. * 4: 发送音频数据. sendAudio返回-1表示发送失败, 需要停止发送. 对于第三个参数:
  77. * request对象format参数为pcm时, 使用false即可. format为opu, 使用压缩数据时, 需设置为true.
  78. */
  79. nlen = request->sendAudio(data, nlen, false);
  80. if (nlen < 0) {
  81. // 发送失败, 退出循环数据发送
  82. cout << "send data fail." << endl;
  83. break;
  84. } else {
  85. cout << "send len:" << nlen << " ." << endl;
  86. }
  87. /*
  88. *语音数据发送控制:
  89. *语音数据是实时的, 不用sleep控制速率, 直接发送即可.
  90. *语音数据来自文件, 发送时需要控制速率, 使单位时间内发送的数据大小接近单位时间原始语音数据存储的大小.
  91. */
  92. sleepMs = getSendAudioSleepTime(6400, 16000, 1); // 根据 发送数据大小,采样率,数据压缩比 来获取sleep时间
  93. /*
  94. * 5: 语音数据发送延时控制
  95. */
  96. #ifdef _WIN32
  97. Sleep(sleepMs);
  98. #else
  99. usleep(sleepMs * 1000);
  100. #endif
  101. }
  102. // 关闭音频文件
  103. fs.close();
  104. /*
  105. * 6: 数据发送结束,关闭识别连接通道.
  106. * stop()为阻塞操作, 在接受到服务端响应, 或者超时之后, 才会返回.
  107. */
  108. request->stop();
  109. /*
  110. * 7: 识别结束, 释放request对象
  111. */
  112. NlsClient::getInstance()->releaseTranscriberRequest(request);
  113. /*
  114. * 8: 释放callback对象
  115. */
  116. delete callback;
  117. callback = NULL;
  118. return NULL;
  119. }

实时语音同步识别示例

完整示例,详见SDK压缩包中的demo目录speechTranscriberSyncDemo.cpp文件。

  1. // 工作线程
  2. void* pthreadFunc(void* arg) {
  3. int sleepMs = 0;
  4. // 0: 从自定义线程参数中获取token, 配置文件等参数.
  5. ParamStruct* tst = (ParamStruct*)arg;
  6. if (tst == NULL) {
  7. cout << "arg is not valid." << endl;
  8. return NULL;
  9. }
  10. // 打开音频文件, 获取数据
  11. FILE* file = fopen(tst->fileName.c_str(), "rb");
  12. if (NULL == file) {
  13. cout << tst->fileName << " isn't exist." << endl;
  14. return NULL;
  15. }
  16. fseek(file, 0, SEEK_END);
  17. int fileSize = ftell(file); // 获取音频文件的长度
  18. fseek(file, 0, SEEK_SET);
  19. /*
  20. * 创建实时音频流同步识别SpeechTranscriberSyncRequest对象.
  21. * request对象在一个会话周期内可以重复使用.
  22. * 会话周期是一个逻辑概念. 比如Demo中, 指读取, 发送完整个音频文件数据的时间.
  23. * 音频文件数据发送结束时, 可以releaseTranscriberSyncRequest()释放对象.
  24. * createTranscriberSyncRequest(), sendSyncAudio(), getTranscriberResult(), releaseTranscriberSyncRequest()请在
  25. * 同一线程内完成, 跨线程使用可能会引起异常错误.
  26. */
  27. /*
  28. * 1: 创建实时音频流识别SpeechTranscriberSyncRequest对象
  29. */
  30. SpeechTranscriberSyncRequest* request = NlsClient::getInstance()->createTranscriberSyncRequest();
  31. if (request == NULL) {
  32. cout << "createTranscriberSyncRequest failed." << endl;
  33. return NULL;
  34. }
  35. request->setAppKey(tst->appkey.c_str()); // 设置AppKey, 必填参数, 请参照官网申请
  36. request->setFormat("pcm"); // 设置音频数据编码格式, 可选参数,目前支持pcm, opu. 默认是pcm
  37. request->setSampleRate(16000); // 设置音频数据采样率, 可选参数,目前支持16000, 8000. 默认是16000
  38. request->setIntermediateResult(true); // 设置是否返回中间识别结果, 可选参数. 默认false
  39. request->setPunctuationPrediction(true); // 设置是否在后处理中添加标点, 可选参数. 默认false
  40. request->setInverseTextNormalization(true); // 设置是否在后处理中执行数字转写, 可选参数. 默认false
  41. request->setSemanticSentenceDetection(false); // 设置是否语义断句, 可选参数. 默认false
  42. request->setMaxSentenceSilence(500); // 设置vad阀值, 可选参数. 合法参数范围200~2000(ms), 默认值800ms
  43. request->setToken(tst->token.c_str()); // 设置账号校验token, 必填参数
  44. int sentSize = 0; // 已发送的文件数据大小
  45. while (sentSize < fileSize) {
  46. char data[FRAME_SIZE] = {0};
  47. int size = fread(data, sizeof(char), sizeof(char) * FRAME_SIZE, file);
  48. AudioDataStatus status;
  49. if (sentSize == 0) {
  50. status = AUDIO_FIRST; // 发送第一块音频数据
  51. }
  52. else if (sentSize + size < fileSize) {
  53. status = AUDIO_MIDDLE; // 发送中间音频数据
  54. }
  55. else if (sentSize + size == fileSize) {
  56. status = AUDIO_LAST; // 发送最后一块音频数据
  57. }
  58. sentSize += size;
  59. /*
  60. * 2: 发送音频数据. sendAudio返回-1表示发送失败, 可在getTranscriberResult函数中获得失败的具体信息
  61. * 对于第四个参数, request对象format参数为pcm时, 使用false即可. format为opu, 使用压缩数据时, 需设置为true.
  62. */
  63. request->sendSyncAudio(data, size, status);
  64. /*
  65. *语音数据发送控制:
  66. *语音数据是实时的, 不用sleep控制速率, 直接发送即可.
  67. *语音数据来自文件, 发送时需要控制速率, 使单位时间内发送的数据大小接近单位时间原始语音数据存储的大小.
  68. */
  69. sleepMs = getSendAudioSleepTime(6400, 16000, 1); // 根据 发送数据大小,采样率,数据压缩比 来获取sleep时间
  70. /*
  71. * 3: 语音数据发送延时控制
  72. */
  73. #ifdef _WIN32
  74. Sleep(sleepMs);
  75. #else
  76. usleep(sleepMs * 1000);
  77. #endif
  78. /*
  79. * 4: 获取识别结果
  80. * 接收到EventType为TaskFailed, closed, completed事件类型时,停止发送数据
  81. * 部分错误可收到多次TaskFailed事件,只要发生TaskFailed事件,请停止发送数据
  82. */
  83. bool isFinished = false;
  84. std::queue<NlsEvent> eventQueue;
  85. request->getTranscriberResult(&eventQueue);
  86. while (!eventQueue.empty()) {
  87. NlsEvent _event = eventQueue.front();
  88. eventQueue.pop();
  89. NlsEvent::EventType type = _event.getMsgType();
  90. switch (type)
  91. {
  92. case NlsEvent::TranscriptionStarted:
  93. cout << "************* Transcriber started *************" << endl;
  94. break;
  95. case NlsEvent::SentenceBegin:
  96. cout << "************* Detected sentence begin *************" << endl;
  97. cout << "sentence index: " << _event.getSentenceIndex() << endl;
  98. cout << "sentence time: " << _event.getSentenceTime() << endl;
  99. break;
  100. case NlsEvent::TranscriptionResultChanged:
  101. cout << "************* Transcriber has sentence middle result *************" << endl;
  102. cout << "sentence index: " << _event.getSentenceIndex() << endl;
  103. cout << "sentence time: " << _event.getSentenceTime() << endl;
  104. cout << "result: " << _event.getResult() << endl;
  105. break;
  106. case NlsEvent::SentenceEnd:
  107. cout << "************* Detected sentence end *************" << endl;
  108. cout << "sentence index: " << _event.getSentenceIndex() << endl;
  109. cout << "sentence time: " << _event.getSentenceTime() << endl;
  110. cout << "result: " << _event.getResult() << endl;
  111. break;
  112. case NlsEvent::TranscriptionCompleted:
  113. cout << "************* Transcriber completed *************" << endl;
  114. isFinished = true;
  115. break;
  116. case NlsEvent::TaskFailed:
  117. cout << "************* TaskFailed *************" << endl;
  118. isFinished = true;
  119. break;
  120. case NlsEvent::Close:
  121. cout << "************* Closed *************" << endl;
  122. isFinished = true;
  123. break;
  124. default:
  125. break;
  126. }
  127. cout << "allMessage: " << _event.getAllResponse() << endl;
  128. }
  129. if (isFinished) {
  130. break;
  131. }
  132. }
  133. // 关闭音频文件
  134. fclose(file);
  135. /*
  136. * 5: 识别结束, 释放request对象
  137. */
  138. NlsClient::getInstance()->releaseTranscriberSyncRequest(request);
  139. return NULL;
  140. }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
设计模式
使用Opencv,大恒C++ SDK采集大恒水星相机图像
c/c++中调用sqlite3的基本步骤 - ywwcn的专栏
深入浅出话回调(上)
常用矩阵计算C语言代码
用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle)完成文件拷贝程序(初级版)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服