XPU-17通信生产实习-智能音箱项目-DAY3
1.可执行cc main.c cJSON.c -o <指定输出文件名> -lcurl
编译文件,编译时需添加所有的c程序文件;
2.若编译提示段错误,是因为fp打开之后未关闭,需添加fclose(fp);
free(response);
这两句;
3.代码中包含中文时,需要以UTF-8
格式保存代码文件;
#include <stdio.h>
#include <stdlib.h> //malloc使用的头文件
#include <curl/curl.h> //libcurl的头文件
#include "cJSON.h" //cJSON的头文件int main(void)
{FILE* fp;//以只写方式打开文件//fp = fopen("hello.txt", "w");//响应消息的地址char* response = NULL;//响应消息的长度size_t resplen = 0;//创建内存文件,当通过文件句柄写入数据时,会自动分配内存fp = open_memstream(&response, &resplen);if (fp == NULL) //打开文件失败,打印错误信息并退出{perror("open_memstream() failed");return EXIT_FAILURE;}//初始化HTTP客户端CURL* curl = curl_easy_init();if (curl == NULL){perror("curl_easy_init() failed");return EXIT_FAILURE;}//准备HTTP请求消息,设置API地址(URI)curl_easy_setopt(curl, CURLOPT_URL, "https://coronavirus-tracker-api.herokuapp.com/v2/latest");//如果不指定写入的文件,libcurl会把服务器响应消息中的内容打印到屏幕上//如果指定了文件句柄,libcurl会把服务器响应消息中的内容写入文件curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);//打印HTTP请求和响应消息头curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);//发送HTTP请求消息,等待服务器的响应消息CURLcode error = curl_easy_perform(curl);if (error != CURLE_OK){fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(error));curl_easy_cleanup(curl);return EXIT_FAILURE;}//释放HTTP客户端申请的资源curl_easy_cleanup(curl);//关闭内存文件fclose(fp);puts(response);//解析JSON字符串cJSON* json = cJSON_Parse(response);if (json == NULL){const char* error_pos = cJSON_GetErrorPtr();if (error_pos != NULL){fprintf(stderr, "Error before: %s\n", error_pos);}return EXIT_FAILURE;}cJSON* latest = cJSON_GetObjectItemCaseSensitive(json, "latest");cJSON* comfirmed = cJSON_GetObjectItemCaseSensitive(latest, "confirmed");cJSON* deaths = cJSON_GetObjectItemCaseSensitive(latest, "deaths");printf("确诊人数: %d\n", comfirmed->valueint);printf("死亡人数: %d\n", deaths->valueint);//释放json数据结构占用的内存cJSON_free(json);free(response);return EXIT_SUCCESS;
}
编程规范
如何取名字
1.一致性原则(遵从现有的代码风格,组内统一风格,且尽量不要使用拼音);
2.标识符命名原则(名字的作用域越大,所携带的信息就应该越多);
3.文件命名(建议全部小写,扩展名h/c/cpp
);
标识符命名
1.数据类型:
(1)如果类型在使用时不需要访问内部结构,可以使用typedef
定义成别名;
(2)函数指针一般使用typedef
定义别名,方便使用;
2.宏:头文件中的宏,建议全部大写并使用下划线连接;
3.函数:
(1)采用动作性名字:getTime()
或get_time()
;
(2)返回布尔类型的函数,应该反映其返回值情况,如:isdigit()
;
4.常数:除0和1以外的数,都应该命名。
注释
1.代码本身已经讲明的事情不需要注释;
2.注释要与代码保持一致;
注释文档
可以使用Doxygen
生成代码文档或API文档。
排版
不需要太过关注,可以在提交代码前使用clang-format
或indent
等格式化工具自动修改。
习惯用法
1.头文件Guard Macro
;
2.计算数组中的元素个数;
3.优先处理异常情况;
4.遍历数组:从前往后遍历;
5.条件表达式中交换常量和变量的位置(Yoda conditions
);
6.使用等宽字体。
智能音箱
工作流程
Mic
–> AP(音频处理)
–> KWS(关键词检测)
–> VAD(语音活动检测)
–> ASR(语音识别)
–> NLU(自然语言处理)
–> NLG(自然语言生成)
–> TTS(语音合成)
–> Spesker
其中,KWS
VAD
ASR
NLU
NLG
TTS
六个模块在线上完成。
音频处理(Audio Processing),包括回声消除(AEC),波束成形(Beamforming),降噪(NS)等,现在主流采用麦克风阵列实现远场语音交互。
关键词检测(Key Word Spotting, KWS)用于检测”小度小度”、"Hey Siri"之类的关键词,然后唤醒设备并开始对话。
语音活动检测(Voice Activity Detection, VAD)用于识别语音是否结束。KWS和VAD都需要离线检测,避免语音一直上传到云端。
语音识别(Automatic Speech Recognition, ASR) 用来将语音转为文字,目前主流处理方式是使用神经网络。
语音合成(Text To Speech, TTS) 与语音识别相反,用来将文字转为语音。
自然语言处理(Natural Language Understanding, NLU)用于理解人类的自然语言,包括分词、词性标注、句法分析等。
自然语言生成(Natural Language Generation, NLG)用于理解文本后生成自然语言文本,包括自动摘要、机器翻译、问答系统、对话机器人等。
login as: yiyi
yiyi@192.168.51.8's password:
Linux debian 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) x86_64The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Jul 2 18:33:20 2020
yiyi@debian:~$ git clone https://gitee.com/liuyixiao_xpu/XPU-SmartSpeaker-TX3.git
正克隆到 'XPU-SmartSpeaker-TX3'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 完成.
yiyi@debian:~$ cd XPU-SmartSpeaker-
-bash: cd: XPU-SmartSpeaker-: 没有那个文件或目录
yiyi@debian:~$ cd XPU-SmartSpeaker-TX3/
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git init
重新初始化已存在的 Git 仓库于 /home/yiyi/XPU-SmartSpeaker-TX3/.git/
yiyi@debian:~/XPU-SmartSpeaker-TX3$ mkdir 41703030304
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git add 41703030304/
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。无文件要提交,干净的工作区
yiyi@debian:~/XPU-SmartSpeaker-TX3$ GIT ADD 41703030304/
-bash: GIT:未找到命令
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git add 41703030304/
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。无文件要提交,干净的工作区
yiyi@debian:~/XPU-SmartSpeaker-TX3$ ls
41703030304 readme.md
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git commit -m "创建文件夹"
位于分支 master
您的分支与上游分支 'origin/master' 一致。无文件要提交,干净的工作区
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git push
Username for 'https://gitee.com': liuyixiao_xpu
Password for 'https://liuyixiao_xpu@gitee.com':
Everything up-to-date
yiyi@debian:~/XPU-SmartSpeaker-TX3$ sudo apt install alsa-utils
[sudo] yiyi 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
将会同时安装下列软件:libasound2 libasound2-data libfftw3-single3 libsamplerate0
建议安装:libasound2-plugins libfftw3-bin libfftw3-dev
下列【新】软件包将被安装:alsa-utils libasound2 libasound2-data libfftw3-single3 libsamplerate0
升级了 0 个软件包,新安装了 5 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
需要下载 3,175 kB 的归档。
解压缩后会消耗 7,907 kB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://mirrors.ustc.edu.cn/debian buster/main amd64 libasound2-data all 1.1.8-1 [59.6 kB]
获取:2 http://mirrors.ustc.edu.cn/debian buster/main amd64 libasound2 amd64 1.1.8-1 [361 kB]
获取:3 http://mirrors.ustc.edu.cn/debian buster/main amd64 libfftw3-single3 amd64 3.3.8-2 [762 kB]
获取:4 http://mirrors.ustc.edu.cn/debian buster/main amd64 libsamplerate0 amd64 0.1.9-2 [949 kB]
获取:5 http://mirrors.ustc.edu.cn/debian buster/main amd64 alsa-utils amd64 1.1.8-2 [1,043 kB]
已下载 3,175 kB,耗时 1秒 (3,590 kB/s)
正在选中未选择的软件包 libasound2-data。
(正在读取数据库 ... 系统当前共安装有 34484 个文件和目录。)
准备解压 .../libasound2-data_1.1.8-1_all.deb ...
正在解压 libasound2-data (1.1.8-1) ...
正在选中未选择的软件包 libasound2:amd64。
准备解压 .../libasound2_1.1.8-1_amd64.deb ...
正在解压 libasound2:amd64 (1.1.8-1) ...
正在选中未选择的软件包 libfftw3-single3:amd64。
准备解压 .../libfftw3-single3_3.3.8-2_amd64.deb ...
正在解压 libfftw3-single3:amd64 (3.3.8-2) ...
正在选中未选择的软件包 libsamplerate0:amd64。
准备解压 .../libsamplerate0_0.1.9-2_amd64.deb ...
正在解压 libsamplerate0:amd64 (0.1.9-2) ...
正在选中未选择的软件包 alsa-utils。
准备解压 .../alsa-utils_1.1.8-2_amd64.deb ...
正在解压 alsa-utils (1.1.8-2) ...
正在设置 libfftw3-single3:amd64 (3.3.8-2) ...
正在设置 libasound2-data (1.1.8-1) ...
正在设置 libasound2:amd64 (1.1.8-1) ...
正在设置 libsamplerate0:amd64 (0.1.9-2) ...
正在设置 alsa-utils (1.1.8-2) ...
alsa-restore.service is a disabled or a static unit, not starting it.
alsa-state.service is a disabled or a static unit, not starting it.
正在处理用于 systemd (241-7~deb10u4) 的触发器 ...
正在处理用于 man-db (2.8.5-2) 的触发器 ...
正在处理用于 libc-bin (2.28-10) 的触发器 ...
yiyi@debian:~/XPU-SmartSpeaker-TX3$
yiyi@debian:~/XPU-SmartSpeaker-TX3$ alsamixer
yiyi@debian:~/XPU-SmartSpeaker-TX3$ arecord test.wav
Recording WAVE 'test.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
^CAborted by signal 中断...
arecord: pcm_read:2145: read error: 被中断的系统调用
yiyi@debian:~/XPU-SmartSpeaker-TX3$ test.wav
-bash: test.wav:未找到命令
yiyi@debian:~/XPU-SmartSpeaker-TX3$ aplay test.wav
Playing WAVE 'test.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
yiyi@debian:~/XPU-SmartSpeaker-TX3$
实习流程
KWS和VAD
nowboy主页:https://snowboy.kitt.ai/
下载snowboy库
https://github.com/kitt-ai/snowboy
ASR和TTS
https://cloud.baidu.com/
NLU
使用图灵机器人:http://www.turingapi.com/
使用HTTP协议调用机器人对话API。
创建机器人。
安装录音放音程序
sudo apt install alsa-utils
yiyi@debian:~/XPU-SmartSpeaker-TX3$ sudo apt install alsa-utils
[sudo] yiyi 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
将会同时安装下列软件:libasound2 libasound2-data libfftw3-single3 libsamplerate0
建议安装:libasound2-plugins libfftw3-bin libfftw3-dev
下列【新】软件包将被安装:alsa-utils libasound2 libasound2-data libfftw3-single3 libsamplerate0
升级了 0 个软件包,新安装了 5 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
需要下载 3,175 kB 的归档。
解压缩后会消耗 7,907 kB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://mirrors.ustc.edu.cn/debian buster/main amd64 libasound2-data all 1.1.8-1 [59.6 kB]
获取:2 http://mirrors.ustc.edu.cn/debian buster/main amd64 libasound2 amd64 1.1.8-1 [361 kB]
获取:3 http://mirrors.ustc.edu.cn/debian buster/main amd64 libfftw3-single3 amd64 3.3.8-2 [762 kB]
获取:4 http://mirrors.ustc.edu.cn/debian buster/main amd64 libsamplerate0 amd64 0.1.9-2 [949 kB]
获取:5 http://mirrors.ustc.edu.cn/debian buster/main amd64 alsa-utils amd64 1.1.8-2 [1,043 kB]
已下载 3,175 kB,耗时 1秒 (3,590 kB/s)
正在选中未选择的软件包 libasound2-data。
(正在读取数据库 ... 系统当前共安装有 34484 个文件和目录。)
准备解压 .../libasound2-data_1.1.8-1_all.deb ...
正在解压 libasound2-data (1.1.8-1) ...
正在选中未选择的软件包 libasound2:amd64。
准备解压 .../libasound2_1.1.8-1_amd64.deb ...
正在解压 libasound2:amd64 (1.1.8-1) ...
正在选中未选择的软件包 libfftw3-single3:amd64。
准备解压 .../libfftw3-single3_3.3.8-2_amd64.deb ...
正在解压 libfftw3-single3:amd64 (3.3.8-2) ...
正在选中未选择的软件包 libsamplerate0:amd64。
准备解压 .../libsamplerate0_0.1.9-2_amd64.deb ...
正在解压 libsamplerate0:amd64 (0.1.9-2) ...
正在选中未选择的软件包 alsa-utils。
准备解压 .../alsa-utils_1.1.8-2_amd64.deb ...
正在解压 alsa-utils (1.1.8-2) ...
正在设置 libfftw3-single3:amd64 (3.3.8-2) ...
正在设置 libasound2-data (1.1.8-1) ...
正在设置 libasound2:amd64 (1.1.8-1) ...
正在设置 libsamplerate0:amd64 (0.1.9-2) ...
正在设置 alsa-utils (1.1.8-2) ...
alsa-restore.service is a disabled or a static unit, not starting it.
alsa-state.service is a disabled or a static unit, not starting it.
正在处理用于 systemd (241-7~deb10u4) 的触发器 ...
正在处理用于 man-db (2.8.5-2) 的触发器 ...
正在处理用于 libc-bin (2.28-10) 的触发器 ...
yiyi@debian:~/XPU-SmartSpeaker-TX3$
调节音量
可执行alsamixer
进入音量调节界面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3oP3K8lg-1593707630035)(C:\Users\Savio\AppData\Roaming\Typora\typora-user-images\image-20200702223524840.png)]
按M解除静音 上下调整音量、左右调节##master pcm为放音设备设置
sudo reboot #重启
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sMlwRacx-1593707630036)(C:\Users\Savio\AppData\Roaming\Typora\typora-user-images\image-20200702224738690.png)]
按F4 上下调整音量、左右调节##capture为录音设备设置,越高越清晰
esc退出
可执行aplay <wav格式的音频文件>
播放音频;
可执行alsamixer
进入音量调节界面,按左右键选中capture
,按方向键上下调节音量;
可执行arecord test.wav
录制测试音频,按ctrl + c
结束录制;
语音合成模块
百度语音合成服务,基于HTTP请求的REST API接口,将文本转换为可以播放的音频文件。
合成的文件格式为 mp3,pcm(8k及16k),wav(16k),具体见aue参数。 若您需要其它格式,音频文件的转换方法请参考“语音识别工具”=>“音频文件转码”一节
获取token
// appKey = 4uYEcg1w3BfIx
// appSecret = CoKL5KtB1Hp0https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=4uYEcg1w3BfIx&client_secret=CoKL5KtB1Hp0
{"refresh_token":"4","expires_in":2592000,"session_key":"9mzdWEHgibZFvl9vDkIFuUGa\/FOgKdjNg9U3XH+YWdY5RFmGHr+AdyX9dbl8RcdlVwWQkLcz\/NXa2alp67iKIhivyeG+JA==","access_token":"24.c152fe271687a7f37b6d49b207a181ab.2592000.1596294308.282335-20735574","scope":"audio_voice_assistant_get brain_enhanced_asr audio_tts_post brain_speech_realtime public brain_all_scope picchain_test_picchain_api_scope brain_asr_async wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\u6743\u9650 vis-classify_flower lpq_\u5f00\u653e cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi fake_face_detect_\u5f00\u653eScope vis-ocr_\u865a\u62df\u4eba\u7269\u52a9\u7406 idl-video_\u865a\u62df\u4eba\u7269\u52a9\u7406","session_secret":"417cc1924bd3fb7a1ae0c7a0c1dc8395"}
scope中含有audio_tts_post 表示有语音合成能力,没有该audio_tts_post 的token调用接口会返回502错误。 在结果中可以看见 token = 1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328,在2592000秒(30天)后过期。
"refresh_token":"25.e44cead9cad4a6e7c57b8916f1f46f29.315360000.1909062308.282335-20735574"
鉴权认证机制
获取 Access Token
获取AccessToken 需要您在应用管理界面中新建应用,应用列表中即可查看。
使用语音识别及合成REST API 需要获取 Access Token。Access Token 是用户身份验证和授权的凭证,语音识别采用的是Client Credentials授权方式,即采用应用公钥(Api Key)、密钥获取Access Token,适用于任何带server类型应用,通过此授权方式获取Access Token仅可访问平台授权类的接口,
使用Client Credentials获取Access Token需要应用在其服务端发送请求(推荐用POST方法)到百度OAuth2.0授权服务的“ https://openapi.baidu.com/oauth/2.0/token ”地址上,并带上以下参数:
- grant_type:必须参数,固定为“client_credentials”;
- client_id:必须参数,应用的 API Key;
- client_secret:必须参数,应用的 Secret Key;
例如:
https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHl********LT0vuXV4&client_secret=0rDSjzQ20XUj5i********PQSzr5pVw2
响应数据包如下所示,其中 “access_token” 字段即为请求 REST API 所需的鉴权信息。
有效期内的Access Token 可以任意次重复使用。每一次请求申请一个新的token是一种常见的效率低下的使用方式。 可以申请多个Token, 每个Token相互独立。
默认情况下,Access Token 有效期为30天,开发者需要对 Access Token的有效性进行判断,如果Access Token过期可以重新获取。
例如:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store{
"access_token": "1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328",
"expires_in": 86400,
"refresh_token": "2.385d55f8615fdfd9edb7c4b********.604800.1293440400-2346678-124328",
"scope": "public",
"session_key": "ANXxSNjwQDugf8615Onqeik********CdlLxn",
"session_secret": "248APxvxjCZ0VEC********aK4oZExMB",
}
具体代码示例可以参见:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu 。注意语音服务的调用地址是https://openapi.baidu.com/oauth/2.0/token
请求方式及参数基本说明
更新时间:2019-11-24
请求方式及参数基本说明
语音合成接口支持 POST 和 GET两种方式, 推荐POST方式请求。 正式地址:http://tsn.baidu.com/text2audio 或 https://tsn.baidu.com/text2audio
- POST 方式(推荐), 文本小于2048个中文字或者英文数字。
- GET 方式,拼接后的url总长度不多于1000个字符,不推荐长文本合成使用。
请求方式和参数
上传参数
参数 | 可需 | 描述 |
---|---|---|
tex | 必填 | 合成的文本,使用UTF-8编码。小于2048个中文字或者英文数字。(文本在百度服务器内转换为GBK后,长度必须小于4096字节) |
tok | 必填 | 开放平台获取到的开发者access_token(见上面的“鉴权认证机制”段落) |
cuid | 必填 | 用户唯一标识,用来计算UV值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为60字符以内 |
ctp | 必填 | 客户端类型选择,web端填写固定值1 |
lan | 必填 | 固定值zh。语言选择,目前只有中英文混合模式,填写固定值zh |
spd | 选填 | 语速,取值0-15,默认为5中语速 |
pit | 选填 | 音调,取值0-15,默认为5中语调 |
vol | 选填 | 音量,取值0-15,默认为5中音量 |
per(基础音库) | 选填 | 度小宇=1,度小美=0,度逍遥=3,度丫丫=4 |
per(精品音库) | 选填 | 度博文=106,度小童=110,度小萌=111,度米朵=103,度小娇=5 |
aue | 选填 | 3为mp3格式(默认); 4为pcm-16k;5为pcm-8k;6为wav(内容同pcm-16k); 注意aue=4或者6是语音识别要求的格式,但是音频内容不是语音识别要求的自然人发音,所以识别效果会受影响。 |
tex字段2次urlencode
由于urlencode有两个标准 RFC 1738和RFC 3986. 百度为了更好地兼容,支持1次及2次urlencode, 其中2次urlencode可以覆盖全部的特殊字符。因而推荐传递tex 参数时做2次urlencode编码。
测试用例:“1+1=2”。 一次urlencode时,“+”可能会没有合成。
POST调用方式(推荐)
将文本以及其他参数写入到body里面,利用html表单的方式将参数传递到服务端。 所有的参数都在body中。body里面的数据为:
tex=***&lan=zh&cuid=***&ctp=1&aue=3&tok=***
tex 原始参数是"百度你好“
第一次urlencode后 tex=%e7%99%be%e5%ba%a6%e4%bd%a0%e5%a5%bd
第二次urlencode后 tex=%25e7%2599%25be%25e5%25ba%25a6%25e4%25bd%25a0%25e5%25a5%25bd
GET调用方式
将所有的参数都填写到URL地址中,可以通过浏览器可以播放合成的语音结果。
https://tsn.baidu.com/text2audio?tex=***&lan=zh&cuid=***&ctp=1&tok=***// 注意tex参数需要按照url参数标准使用url_encode UTF8编码,如合成文字为“百度你好”,url为 http://tsn.baidu.com/text2audio?tex=%e7%99%be%e5%ba%a6%e4%bd%a0%e5%a5%bd&lan=zh&cuid=***&ctp=1&tok=***
返回
需要根据 Content-Type的头部来确定是否服务端合成成功。
如果合成成功,返回的Content-Type以“audio”开头
- aue =3 ,返回为二进制mp3文件,具体header信息 Content-Type: audio/mp3;
- aue =4 ,返回为二进制pcm文件,具体header信息 Content-Type:audio/basic;codec=pcm;rate=16000;channel=1
- aue =5 ,返回为二进制pcm文件,具体header信息 Content-Type:audio/basic;codec=pcm;rate=8000;channel=1
- aue =6 ,返回为二进制wav文件,具体header信息 Content-Type: audio/wav;
如果合成出现错误,则会返回json文本,具体header信息为:Content-Type: application/json。其中sn字段主要用于DEBUG追查问题,如果出现问题,可以提供sn帮助确认问题。
错误示例:
{"err_no":500,"err_msg":"notsupport.","sn":"abcdefgh","idx":1}
错误码解释
错误码 | 含义 |
---|---|
500 | 不支持输入 |
501 | 输入参数不正确 |
502 | token验证失败 |
503 | 合成后端错误 |
问题反馈说明
- 您可以反馈至官方论坛。
- QQ群快速沟通: AI开放平台官网首页底部“QQ支持群”中,查找“百度语音”。
- 如果是接口问题,请给出请求的url和返回的json。
- 如果是合成的发音错误,可以在 http://ai.baidu.com/tech/speech/tts#tts-demo 上测试。请按照以下格式反馈
【restapi】【发音人】【在线】【错误类型】错误类型 分类:多音字、韵律、儿化音、TN(数字及特殊符号转换错误)、英文badcase、其他
反馈两个badcase示例
【restapi】【标准女声】【在线】【多音字“行”】文本:一行白鹭上青天描述:行念成(xing)期望:一行(hang)白鹭上青天【restapi】【标准女声】【在线】【其他,“人”发音不准确】文本:小主人描述:“人”发音类似“任”期望:小主人(ren2)
中央气象台API:
1.查询省份列表:http://www.nmc.cn/f/rest/province
2.查询城市:http://www.nmc.cn/f/rest/province/+省份id (省份id可以通过查询省份接口查)
http://www.nmc.cn/f/rest/province/ASN
例:http://www.nmc.cn/f/rest/province/ASH 陕西省
3.查询实时天气:http://www.nmc.cn/f/rest/real/+城市ID (城市id通过上个接口查)
例:http://www.nmc.cn/f/rest/real/57036 西安市
4.查询空气质量:http://www.nmc.cn/f/rest/aqi/+城市ID
例:http://www.nmc.cn/f/rest/aqi/57036 西安市
5.查询过去一天天气:http://www.nmc.cn/f/rest/passed/+城市ID
例:http://www.nmc.cn/f/rest/real/57036 西安市
6.查询前后一周天气:http://www.nmc.cn/f/rest/tempchart/+城市ID
例:http://www.nmc.cn/f/rest/real/57036 西安市
作业
调用中央气象台API查询城市空气质量 http://www.nmc.cn/f/rest/aqi
http://www.nmc.cn/f/rest/aqi/53754 绥德县
yiyi@debian:~/XPU-SmartSpeaker-TX3/41703030304$ cc main.c cJSON.c -o aqi -lcurl
yiyi@debian:~/XPU-SmartSpeaker-TX3/41703030304$ ./aqi
调用中央气象台API查询城市空气质量 http://www.nmc.cn/f/rest/aqi
查询地址:陕西省榆林市绥德县
发布时间: 2020-07-02 23:00
空气质量: 37
空气等级: 1
空气质量: 优
预警信息:
yiyi@debian:~/XPU-SmartSpeaker-TX3/41703030304$ cat main.c
#include <stdio.h>
#include <stdlib.h> //malloc使用的头文件
#include <curl/curl.h> //libcurl的头文件
#include "cJSON.h" //cJSON的头文件int main(void)
{//以只写方式打开文件FILE* fp = fopen("aqi.txt", "w");if (fp == NULL) //打开文件失败,打印错误信息并退出{perror("fopen() failed");return 1;}//初始化libcurlCURL* curl = curl_easy_init();if (curl == NULL){perror("curl_easy_init() failed");return 1;}//准备HTTP请求消息,设置API地址(URI)curl_easy_setopt(curl, CURLOPT_URL, "http://www.nmc.cn/f/rest/aqi/53754");curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);//发送HTTP请求消息CURLcode error = curl_easy_perform(curl);if (error != CURLE_OK){fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(error));curl_easy_cleanup(curl);return 1;}//释放libcurl申请的资源curl_easy_cleanup(curl);//关闭文件fclose(fp);//以只读方式打开文件fp = fopen("aqi.txt", "r");if (fp == NULL) //打开文件失败,打印错误信息并退出{perror("fopen() failed");return 1;}//将文件指针定位到文件末尾fseek(fp, 0, SEEK_END);//获取文件指针的当前位置,即文件的大小long size = ftell(fp);//将文件指针重新定位到文件头fseek(fp, 0, SEEK_SET);//分配文件大小相同的内存空间char* jsonstr = malloc(size);//将文件中的内容读取到内存中fread(jsonstr, 1, size, fp);fclose(fp);//解析JSON字符串cJSON* json = cJSON_Parse(jsonstr);cJSON* forecasttime = cJSON_GetObjectItemCaseSensitive(json, "forecasttime");cJSON* aqi = cJSON_GetObjectItemCaseSensitive(json, "aqi");cJSON* aq = cJSON_GetObjectItemCaseSensitive(json, "aq");cJSON* text = cJSON_GetObjectItemCaseSensitive(json, "text");cJSON* aqiCode = cJSON_GetObjectItemCaseSensitive(json, "aqiCode");printf("调用中央气象台API查询城市空气质量 http://www.nmc.cn/f/rest/aqi \n");printf("查询地址:陕西省榆林市绥德县 \n");printf("发布时间: %s\n", forecasttime->valuestring);printf("空气质量: %d\n", aqi->valueint);printf("空气等级: %d\n", aq->valueint);printf("空气质量: %s\n", text->valuestring);printf("预警信息: %s\n", aqiCode->valuestring);//释放json数据结构占用的内存cJSON_free(json);return 0;
}
yiyi@debian:~/XPU-SmartSpeaker-TX3/41703030304$ cd ..
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。未跟踪的文件:(使用 "git add <文件>..." 以包含要提交的内容)41703030304/提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git add 41703030304/
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。要提交的变更:(使用 "git reset HEAD <文件>..." 以取消暂存)新文件: 41703030304/LICENSE新文件: 41703030304/aqi新文件: 41703030304/aqi.txt新文件: 41703030304/cJSON.c新文件: 41703030304/cJSON.h新文件: 41703030304/main.c新文件: 41703030304/test.wav新文件: 41703030304/test2.wav新文件: "41703030304/\347\254\224\350\256\260.md"yiyi@debian:~/XPU-SmartSpeaker-TX3$ git commit -m "20200702实习作业提交通信工程1703班41703030304刘懿宵"
[master 49e239e] 20200702实习作业提交通信工程1703班41703030304刘懿宵9 files changed, 4185 insertions(+)create mode 100644 41703030304/LICENSEcreate mode 100755 41703030304/aqicreate mode 100644 41703030304/aqi.txtcreate mode 100644 41703030304/cJSON.ccreate mode 100644 41703030304/cJSON.hcreate mode 100644 41703030304/main.ccreate mode 100644 41703030304/test.wavcreate mode 100644 41703030304/test2.wavcreate mode 100644 "41703030304/\347\254\224\350\256\260.md"
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git status
位于分支 master
您的分支领先 'origin/master' 共 1 个提交。(使用 "git push" 来发布您的本地提交)无文件要提交,干净的工作区
yiyi@debian:~/XPU-SmartSpeaker-TX3$ git push
Username for 'https://gitee.com': liuyixiao_xpu
Password for 'https://liuyixiao_xpu@gitee.com':
枚举对象: 16, 完成.
对象计数中: 100% (16/16), 完成.
压缩对象中: 100% (14/14), 完成.
写入对象中: 100% (14/14), 68.47 KiB | 5.27 MiB/s, 完成.
总共 14 (差异 1),复用 0 (差异 0)
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/liuyixiao_xpu/XPU-SmartSpeaker-TX3.git833ec95..04ea31a master -> master
yiyi@debian:~/XPU-SmartSpeaker-TX3$
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cWxH6JA6-1593707630039)(C:\Users\Savio\AppData\Roaming\Typora\typora-user-images\image-20200703001134531.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1hXj7vsd-1593707630041)(C:\Users\Savio\AppData\Roaming\Typora\typora-user-images\image-20200703001139088.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4VA5p1DV-1593707630041)(C:\Users\Savio\AppData\Roaming\Typora\typora-user-images\image-20200703001149886.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EeaEsB5G-1593707630042)(C:\Users\Savio\AppData\Roaming\Typora\typora-user-images\image-20200703001228004.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3dcXh3Sz-1593707630043)(C:\Users\Savio\AppData\Roaming\Typora\typora-user-images\image-20200703001239500.png)]
XPU-17通信生产实习-智能音箱项目-DAY3相关推荐
- 叮当:一个开源的树莓派中文智能音箱项目
这个项目其实来源于我生活中的一个需求:我每天晚上都会去厨房做一个面包当明天的早餐,当我把用料按顺序准备好放进面包机时,我需要准确预约到明天早上我吃早餐的时间.然而,几乎每次在这个时候我都没有带手机在身 ...
- dingdang robot:一个开源的中文智能音箱项目
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:潘伟洲 免责说明:本文介绍的 dingdang-robot 与公司的叮当助手没有任何关系. 这个项目其实来源于我生活中的一个需求:我每天 ...
- dingdang-robot:一个开源的中文智能音箱项目
2019独角兽企业重金招聘Python工程师标准>>> 欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:潘伟洲 免责说明:本文介绍的 dingdang-robot ...
- 转:催熟智能音箱,争夺一个人工智能之梦
原文:http://36kr.com/p/5079975.html 深圳的硬件方案商吴桥今年很"牛气":接到的合作电话络绎不绝,他拒绝掉的人也数不胜数. 感谢智能音箱.吴桥估摸说, ...
- 华为智能音箱真的来了,一大波手机厂商也随后就到
华为这次终于出手了. 据外媒CNBC报道,华为在2018 IFA柏林消费电子展中公布了一款带路由器的智能音箱AI Cube,并计划今年年底在欧洲出售这款产品,但华为并未透露这款产品是否将在美国或中国推 ...
- 阿拉的小闹闹智能闹钟另辟蹊径做智能音箱 但未来或许喜忧参半
每一个智能音箱的入局者都想打造一款像亚马逊echo这样的爆品,Strategy Analytics显示今年第二季度亚马逊智能音箱出货量达430万台,居全球第一,成为国内外仿效者苦苦追赶的对象. 但是今 ...
- 阿拉的小闹闹--智能闹钟另辟蹊径---做智能音箱----- 但未来或许喜忧参半
阿拉的小闹闹智能闹钟另辟蹊径做智能音箱 但未来或许喜忧参半 每一个智能音箱的入局者都想打造一款像亚马逊echo这样的爆品,Strategy Analytics显示今年第二季度亚马逊智能音箱出货量达43 ...
- 竞争激烈的智能音箱市场 华为靠什么杀出重围
关注网易智能,聚焦AI大事件,读懂下一个大时代! 智能音箱市场的竞争就如同作武侠小说中林立的门派,一直以来都纷争不断. 亚马逊在早期的市场一直处于遥遥领先的地位,在2014年亚马逊Echo已经掀起智能 ...
- 京信通信:数据智能为生产调试“增效瘦身”
摘要: "数据驱动测试优化,突破自动测试边界,赋能智慧测试新模式."--京信智能制造副总经理葛鑫 "进入车间,映入眼帘的是一条长约20 米的 O 型生产线,产线前三名工人 ...
最新文章
- 如何在一个表达式中合并两个字典?
- Jsoup解析XML
- Python之woe:woe库的简介、安装、使用方法之详细攻略
- Oracle数据库之多行函数
- vue联动切换搜索域
- linux gd结构体,U-Boot中gd的定义和使用
- php语法基础考试,我的php学习第二十六天——PHP基础语法
- jquery学习之事件委派
- 【正则】正则表达式基础知识大全
- 好用的开源软件_推荐_良心软件
- 篮球计时计分器c语言程序,C51的篮球计时计分器程序
- Threejs导入OBJ模型出错的一些经验之谈
- 5次Shift破解Win7登录密码
- 3D动画(CSS3)-animation
- 无线路由器信号互相干扰怎么办
- 坚定信念,追求自己的理想!让那些坏人去死把!!!
- 关于pytorch等环境配置记录
- 怎么看电脑是32位还是64位?超级简单的方法!
- 建模:蒙特卡洛法求多重积分
- 【数据集格式】coco格式转txt格式