代码规范化,修改了播放参数
This commit is contained in:
parent
7dd4de87b3
commit
398db0d431
|
|
@ -1,193 +1,25 @@
|
|||
# AC79 系列WiFi&蓝牙 AIoT固件程序
|
||||
# AC79 豆包聊天程序
|
||||
|
||||
## 环境搭建
|
||||
* windows 10 64位
|
||||
* CodeBlocks 20.03 官方链接:https://www.codeblocks.org/downloads/binaries/
|
||||
* 下载并安装工具链 下载链接:http://pkgman.jieliapp.com/s/win-toolchain
|
||||
* 下载并安装软件包管理器 下载链接:http://pkgman.jieliapp.com/s/pkgmanoffline
|
||||
|
||||
## 编译与烧录
|
||||
|
||||
快速开始
|
||||
------------
|
||||
1. **进入下载模式**:
|
||||
- 将开发板 USB 的接口端使用合适的 USB 数据线正确连接到 PC 主机。
|
||||
- 通过长按开发板的顶板 update 键,同时(注意是同时, 并hold住)按 reset 键。
|
||||
- 先松开 reset 键,再松开 update 键,即可进入下载模式。
|
||||
- 进入下载模式后,电脑弹出如下红框所示的盘符,代表进入下载模式成功。
|
||||
|
||||
欢迎使用杰理AC79开源项目,在开始进入项目之前,请详细阅读以下芯片介绍获得对AC79系列芯片大概认识,SDK固件包不含开发文档,进行开发之前详细阅读[SDK开发文档](https://doc.zh-jieli.com/AC79/zh-cn/master/index.html),为用户提供完善的开发例程,帮助开发者快速顺利地使用AC79系列芯片进行方案开发。
|
||||
2. **编译项目**:
|
||||
- 将准备好的硬件环境上电,然后使开发板进入下载模式。
|
||||
- 在 CodeBlocks 界面中点击 build 或者 rebuild 进行编译。如下图:
|
||||

|
||||
|
||||
|
||||
|
||||
芯片概述
|
||||
------------
|
||||
|
||||
杰理AC79系列是一款低成本高集成度WiFi 802.11b/g/n以及双模蓝牙V2.1到V5.0组合的音视频多媒体系统级Soc。内部集成了主频高达320MHz的双核浮点DSP处理器,自带D-cache、I-cache为各类方案提供了强大的运算能力;并完整支持了单天线40MHz BW WiFi 802.11b/g/n AP和STA各种通讯模式;通过内部集成PTA共存分时设计模块,使得WiFi/蓝牙V2.1/蓝牙V5.0可同时工作,实现灵活和高性能的无线传输能力;芯片同时集成ADC/DAC接口作为音频处理资源、摄像头ISC接口作为视频处理资源、RGB推屏接口作为UI显示资源,方便实现各种高集成度的音视频多媒体处理方案,同时自带PMU模块提供多种低功耗工作模式,能使用LDO或者DCDC供电模式满足不同方案供电管理需求。
|
||||
|
||||
|
||||
|
||||
芯片应用场景
|
||||
------------
|
||||
|
||||
- 儿童绘本故事机
|
||||
- 点读笔/扫描笔/翻译笔
|
||||
- WiFi蓝牙智能音箱
|
||||
- 可视门铃/视频门锁/楼宇智能
|
||||
- WiFi监控摄像头IP Camera
|
||||
- WiFi可视美容仪
|
||||
- 蓝牙/USB扫码枪
|
||||
- 婴儿监护器
|
||||
- 宠物喂食机
|
||||
- WiFi摄像头玩具
|
||||
- 智能家居/物联网设备
|
||||
|
||||
|
||||
|
||||
芯片软硬件资源介绍
|
||||
------------
|
||||
|
||||
### CPU
|
||||
|
||||
- 双核DSP,最高主频320Mhz,支持单精度浮点以及数学运算加速引擎,带I-cache、D-cache、MMU功能,片上集成了共578K字节SRAM,部分封装支持2/8M字节SDRAM
|
||||
|
||||
|
||||
|
||||
### 外设
|
||||
|
||||
- GPIO、IIC、SPI、SDIO、PWM、MCPWM、UART、USB1.1、USB2.0、ADC、TIMER、IR接收、电容触摸按键、GPCNT、RTC
|
||||
|
||||
|
||||
|
||||
### MATH
|
||||
|
||||
- 支持硬件FFT、IFFT、矩阵运算
|
||||
|
||||
- 支持硬件AES128/256
|
||||
|
||||
- 支持硬件SHA128/256
|
||||
|
||||
- 支持硬件随机数
|
||||
|
||||
- 支持硬件CRC16
|
||||
|
||||
|
||||
|
||||
### 蓝牙
|
||||
|
||||
- 符合蓝牙V5.0+BR+EDR+BLE规范
|
||||
|
||||
- 支持蓝牙微微网和散射网
|
||||
|
||||
- 满足class2和class3发射功率要求
|
||||
|
||||
- 支持 GFSK 和 π/4 DQPSK 所有包类型
|
||||
|
||||
- 提供+15dbm发射功率
|
||||
|
||||
- 接收器灵敏度为 -93dBm
|
||||
|
||||
|
||||
|
||||
### WiFi
|
||||
|
||||
- 支持 IEEE 802.11b/g/n
|
||||
|
||||
- 802.11n支持 MCS0~ MCS7、20MHz/40MHz 带宽
|
||||
|
||||
- 支持800ns 和 400ns 保护间隔
|
||||
|
||||
- 支持AP模式、STA模式、monitor配网模式
|
||||
|
||||
- AP模式支持多个基站接入
|
||||
|
||||
- STA模式支持保存多个连接网络,匹配信号最好的网络去连接
|
||||
|
||||
- 支持STA模式冷启动快连
|
||||
|
||||
- 支持power save mode省电模式
|
||||
|
||||
- 支持Open System、WEP、WPA-PSK/WPA2-PSK + TKIP/AES/CCMP加密方式
|
||||
|
||||
- 支持脱离802.11协议,直接利用底层RF收发数据包
|
||||
|
||||
- 支持连接CMW270等测试仪测试板子RF性能
|
||||
|
||||
- 发射功率:
|
||||
DSSS 1M/S 17 dBm
|
||||
MCS0 16 dBm
|
||||
MCS7 12 dBm
|
||||
|
||||
- 接收灵敏度:
|
||||
DSSS 1M/S -95 dBm
|
||||
MCS0 -91 dBm
|
||||
MCS7 -72 dBm
|
||||
|
||||
|
||||
|
||||
### 音频
|
||||
|
||||
- 集成DAC、MIC、LINEIN、IIS、PDM、SPDIF音频硬件模块,其中IIS模块最高支持8个通道同时工作,可单独设置成输入或者输出、支持16/24bit数据位宽
|
||||
PDMLINK模块支持同时接入4路16bit数据位宽的数字麦,ADC支持4个通道同时工作,每通道皆可支持配置成MIC或者LINEIN
|
||||
- 支持SBC、MSBC、CVSD、AAC、MP2、MP3、ADPCM、AMR、OPUS、SPX、WAV、PCM音频编码格式,编码数据源支持MIC、LINEIN、IIS、PDMLINK、SPDIF和虚拟数据源
|
||||
- 支持SBC、MSBC、CVSD、AAC、ADPCM、AMR、APE、DTS、FLAC、M4A、MP1、MP2、MP3、OPUS、SPX、WAV、WMA、PCM音频解码格式,解码数据源支持FLASH、SD卡、U盘、LINEIN、外挂FM模块、网络URL、经典蓝牙、虚拟数据源、客户自定义解密数据源
|
||||
- 音效处理支持混响、回声、电音、变声变调、变速、移频、啸波抑制、EQ、DRC、回声消除、传统降噪、神经网络降噪
|
||||
- 语音识别支持活动语音检测VAD、单/双mic的打断唤醒ASR功能
|
||||
- 部分解码格式支持断点播放、快进快退、定点播放、AB点复读播放
|
||||
|
||||
|
||||
|
||||
### 视频
|
||||
|
||||
- 支持DVP-1/2/4/8bit、 BT656图像传感器接口的YUV sensor,最大支持720P分辨率
|
||||
- JPEG编码最大支持720P@30fps@AVI封装
|
||||
- 支持任意尺寸JPEG单张编解码
|
||||
- 支持SPI接口摄像头
|
||||
- 支持一路DVP摄像头 + 一路SPI摄像头, 可同时输出YUV,一路联动JPEG图传或录卡,另一路做光流算法
|
||||
- 支持图像拼接功能,图像分辨率为176*128,帧率可高达60帧
|
||||
- 支持软件对摄像头YUV帧缩放、裁剪
|
||||
|
||||
|
||||
|
||||
### 显示
|
||||
|
||||
- 支持SPI、EMI、PAP、RGB888(8bit)/RGB666(6bit) 推屏接口,其中RGB推屏可达480\*272@15fps,320\*240@30fps
|
||||
- 杰理UI工具可支持屏触摸、软件显示图层、软件旋转图像、音标显示、自定义合成显示区域、支持不同大小字体同时显示,支持SD卡加载UI资源文件
|
||||
- 支持播放JPG、AVI、GIF文件
|
||||
|
||||
|
||||
|
||||
### 网络协议栈
|
||||
|
||||
- 基础协议支持:lwip、mbedtls、http/https、websocket、coap、nopoll、curl、mqtt、ftp、uip、iperf
|
||||
|
||||
- AI云平台支持:图灵、百度云、腾讯云、中国电信智能家居平台、涂鸦、阿里云、华为hilink、天猫精灵、亚马逊平台、思必弛、玩瞳
|
||||
|
||||
|
||||
|
||||
### 固件升级
|
||||
|
||||
- 支持U盘/SD卡单备份升级
|
||||
- 支持U盘/SD卡/WIFI双备份升级
|
||||
- 支持代码双备份+资源部分备份+资源部分固定方式升级
|
||||
|
||||
|
||||
|
||||
### WiFi测试盒
|
||||
|
||||
- 支持发射功率、灵敏度、频率偏差参数测试,频率偏差校正
|
||||
- 支持UI人机交互
|
||||
- 支持双模块同步测试
|
||||
- 支持传导、空中两种测试方式
|
||||
- 支持样本标定与样本筛选
|
||||
- 支持CDROM,存储上位机软件及使用文档
|
||||
- 支持上位机参数配置、本地固件升级、出厂校准
|
||||
- 支持辅助通信(UART)
|
||||
|
||||
|
||||
|
||||
### SDK中间件
|
||||
|
||||
- FAT文件系统
|
||||
- 数据存储记忆
|
||||
- FreeRtos/Pthread API
|
||||
- 循环CBUF
|
||||
- 帧LBUF
|
||||
|
||||
|
||||
|
||||
参考资源
|
||||
------------
|
||||
## 参考资源
|
||||
|
||||
* 芯片数据手册&原理图 : [doc/datasheet/AC791N规格书](./doc/datasheet/AC791N规格书)
|
||||
* SDK 发布版本信息 : [AC79NN_SDK_发布版本信息](https://doc.zh-jieli.com/AC79/zh-cn/release_v1.2.0/other/version/index.html)
|
||||
* 钉钉技术支持群号 : 15375032297 或 31275808
|
||||
|
|
|
|||
|
|
@ -166,6 +166,11 @@
|
|||
<Add directory="../../../../../apps/common/usb/include" />
|
||||
<Add directory="../../../../../include_lib/driver/device/usb/device" />
|
||||
<Add directory="../../../../../include_lib/net/cJSON_common" />
|
||||
<Add directory="../../../../../apps/wifi_daobao/playback/inc" />
|
||||
<Add directory="../../../../../apps/wifi_daobao/record/inc" />
|
||||
<Add directory="../../../../../apps/wifi_daobao/asr/inc" />
|
||||
<Add directory="../../../../../apps/wifi_daobao/tts/inc" />
|
||||
<Add directory="../../../../../apps/wifi_daobao/chat/inc" />
|
||||
</Compiler>
|
||||
<Linker>
|
||||
<Add option="-flto" />
|
||||
|
|
@ -4170,24 +4175,27 @@
|
|||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="../../../../common/usb/usb_std_class_def.h" />
|
||||
<Unit filename="../../../../wifi_daobao/aduio_playback.c">
|
||||
<Unit filename="../../../../wifi_daobao/asr/inc/websocket_asr.h" />
|
||||
<Unit filename="../../../../wifi_daobao/asr/src/websocket_asr.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="../../../../wifi_daobao/aduio_playback.h" />
|
||||
<Unit filename="../../../../wifi_daobao/aduio_record.h" />
|
||||
<Unit filename="../../../../wifi_daobao/aduio_record_queue_new.c">
|
||||
<Unit filename="../../../../wifi_daobao/chat/inc/http_chat.h" />
|
||||
<Unit filename="../../../../wifi_daobao/chat/src/http_chat.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="../../../../wifi_daobao/chat_lwip_http_stream.c">
|
||||
<Unit filename="../../../../wifi_daobao/main.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="../../../../wifi_daobao/doubao_start.c">
|
||||
<Unit filename="../../../../wifi_daobao/playback/inc/aduio_playback.h" />
|
||||
<Unit filename="../../../../wifi_daobao/playback/src/aduio_playback.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="../../../../wifi_daobao/stt_websocket_queue.c">
|
||||
<Unit filename="../../../../wifi_daobao/record/inc/aduio_record.h" />
|
||||
<Unit filename="../../../../wifi_daobao/record/src/aduio_record.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="../../../../wifi_daobao/tts_websocket.c">
|
||||
<Unit filename="../../../../wifi_daobao/tts/inc/websocket_tts.h" />
|
||||
<Unit filename="../../../../wifi_daobao/tts/src/websocket_tts.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="../../app_main.c">
|
||||
|
|
|
|||
|
|
@ -27215,7 +27215,7 @@
|
|||
"app_config.h"
|
||||
"debug.h"
|
||||
|
||||
1731312023 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\aduio_playback.c
|
||||
1731399623 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\aduio_playback.c
|
||||
"server/audio_server.h"
|
||||
"server/server_core.h"
|
||||
"system/app_core.h"
|
||||
|
|
@ -27238,10 +27238,10 @@
|
|||
1731310916 c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\aduio_playback.h
|
||||
"fs/fs.h"
|
||||
|
||||
1731313181 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\aduio_record_queue_new.c
|
||||
1731380259 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\aduio_record_queue_new.c
|
||||
"aduio_record.h"
|
||||
|
||||
1731310963 c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\aduio_record.h
|
||||
1731379271 c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\aduio_record.h
|
||||
"server/audio_server.h"
|
||||
"server/server_core.h"
|
||||
"system/app_core.h"
|
||||
|
|
@ -27258,17 +27258,18 @@
|
|||
"asm/clock.h"
|
||||
"aduio_playback.h"
|
||||
|
||||
1731324300 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\chat_lwip_http_stream.c
|
||||
1731395888 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\chat_lwip_http_stream.c
|
||||
"system/includes.h"
|
||||
"wifi/wifi_connect.h"
|
||||
"apps/http_client.h"
|
||||
"app_config.h"
|
||||
"cJSON.h"
|
||||
"fs/fs.h"
|
||||
|
||||
1715152831 c:\users\lc\desktop\git\doubao_chat\include_lib\net\cjson_common\cjson.h
|
||||
<stddef.h>
|
||||
|
||||
1731325239 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\stt_websocket_queue.c
|
||||
1731399564 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\stt_websocket_queue.c
|
||||
"web_socket/websocket_api.h"
|
||||
"wifi/wifi_connect.h"
|
||||
"system/includes.h"
|
||||
|
|
@ -27279,7 +27280,7 @@
|
|||
"mem_leak_test.h"
|
||||
"app_config.h"
|
||||
|
||||
1731312714 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\tts_websocket.c
|
||||
1731399554 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\tts_websocket.c
|
||||
"web_socket/websocket_api.h"
|
||||
"wifi/wifi_connect.h"
|
||||
"system/includes.h"
|
||||
|
|
@ -27545,7 +27546,7 @@
|
|||
"sock_api/sock_api.h"
|
||||
"app_config.h"
|
||||
|
||||
1730285718 source:c:\users\lc\desktop\git\doubao_chat\apps\demo\demo_devkitboard\wifi_demo_task.c
|
||||
1731400281 source:c:\users\lc\desktop\git\doubao_chat\apps\demo\demo_devkitboard\wifi_demo_task.c
|
||||
"app_config.h"
|
||||
"system/includes.h"
|
||||
"wifi/wifi_connect.h"
|
||||
|
|
@ -27645,3 +27646,123 @@
|
|||
"asm/sfc_norflash_api.h"
|
||||
"event/device_event.h"
|
||||
|
||||
1731461108 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\chat\src\http_chat.c
|
||||
"http_chat.h"
|
||||
|
||||
1731405117 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\main.c
|
||||
"server/audio_server.h"
|
||||
"server/server_core.h"
|
||||
"system/app_core.h"
|
||||
"generic/circular_buf.h"
|
||||
"os/os_api.h"
|
||||
"app_config.h"
|
||||
"system/includes.h"
|
||||
"wifi/wifi_connect.h"
|
||||
"syscfg/syscfg_id.h"
|
||||
"storage_device.h"
|
||||
"fs/fs.h"
|
||||
<time.h>
|
||||
"device/device.h"
|
||||
"asm/clock.h"
|
||||
"spiflash.h"
|
||||
"asm/sfc_norflash_api.h"
|
||||
"event/device_event.h"
|
||||
|
||||
1731404177 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\playback\src\aduio_playback.c
|
||||
"server/audio_server.h"
|
||||
"server/server_core.h"
|
||||
"system/app_core.h"
|
||||
"generic/circular_buf.h"
|
||||
"os/os_api.h"
|
||||
"app_config.h"
|
||||
"system/includes.h"
|
||||
"wifi/wifi_connect.h"
|
||||
"syscfg/syscfg_id.h"
|
||||
"storage_device.h"
|
||||
"fs/fs.h"
|
||||
<time.h>
|
||||
"device/device.h"
|
||||
"asm/clock.h"
|
||||
"aduio_playback.h"
|
||||
"spiflash.h"
|
||||
"asm/sfc_norflash_api.h"
|
||||
"event/device_event.h"
|
||||
|
||||
1731461943 c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\playback\inc\aduio_playback.h
|
||||
"server/audio_server.h"
|
||||
"server/server_core.h"
|
||||
"system/app_core.h"
|
||||
"generic/circular_buf.h"
|
||||
"os/os_api.h"
|
||||
"app_config.h"
|
||||
"system/includes.h"
|
||||
"wifi/wifi_connect.h"
|
||||
"syscfg/syscfg_id.h"
|
||||
"storage_device.h"
|
||||
"fs/fs.h"
|
||||
<time.h>
|
||||
"device/device.h"
|
||||
"asm/clock.h"
|
||||
"spiflash.h"
|
||||
"asm/sfc_norflash_api.h"
|
||||
"event/device_event.h"
|
||||
"websocket_tts.h"
|
||||
|
||||
1731461151 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\tts\src\websocket_tts.c
|
||||
"websocket_tts.h"
|
||||
|
||||
1731460665 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\record\src\aduio_record.c
|
||||
"aduio_record.h"
|
||||
|
||||
1731460653 c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\record\inc\aduio_record.h
|
||||
"server/audio_server.h"
|
||||
"server/server_core.h"
|
||||
"system/app_core.h"
|
||||
"generic/circular_buf.h"
|
||||
"os/os_api.h"
|
||||
"app_config.h"
|
||||
"system/includes.h"
|
||||
"wifi/wifi_connect.h"
|
||||
"syscfg/syscfg_id.h"
|
||||
"storage_device.h"
|
||||
"fs/fs.h"
|
||||
<time.h>
|
||||
"device/device.h"
|
||||
"asm/clock.h"
|
||||
"aduio_playback.h"
|
||||
|
||||
1731461014 source:c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\asr\src\websocket_asr.c
|
||||
"websocket_asr.h"
|
||||
|
||||
1731461005 c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\asr\inc\websocket_asr.h
|
||||
"web_socket/websocket_api.h"
|
||||
"wifi/wifi_connect.h"
|
||||
"system/includes.h"
|
||||
"fs/fs.h"
|
||||
"asm/sfc_norflash_api.h"
|
||||
"cJSON.h"
|
||||
"aduio_record.h"
|
||||
"mem_leak_test.h"
|
||||
"app_config.h"
|
||||
|
||||
1731461724 c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\tts\inc\websocket_tts.h
|
||||
"web_socket/websocket_api.h"
|
||||
"wifi/wifi_connect.h"
|
||||
"system/includes.h"
|
||||
"asm/sfc_norflash_api.h"
|
||||
"cJSON.h"
|
||||
"mem_leak_test.h"
|
||||
"app_config.h"
|
||||
"aduio_playback.h"
|
||||
"fs/fs.h"
|
||||
"spiflash.h"
|
||||
"event/device_event.h"
|
||||
|
||||
1731461077 c:\users\lc\desktop\git\doubao_chat\apps\wifi_daobao\chat\inc\http_chat.h
|
||||
"system/includes.h"
|
||||
"wifi/wifi_connect.h"
|
||||
"apps/http_client.h"
|
||||
"app_config.h"
|
||||
"cJSON.h"
|
||||
"fs/fs.h"
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
#ifndef __ADUIO_PLAYBACK_H__
|
||||
#define __ADUIO_PLAYBACK_H__
|
||||
#include "fs/fs.h"
|
||||
|
||||
struct tts_response{
|
||||
char *msg;
|
||||
size_t len;
|
||||
int end;
|
||||
};
|
||||
|
||||
struct playback_hdl {
|
||||
struct server *dec_server;
|
||||
char volume;
|
||||
u8 channel;
|
||||
void *cache_buf;
|
||||
cbuffer_t save_cbuf;
|
||||
int sample_rate;
|
||||
OS_SEM r_sem;
|
||||
OS_SEM w_sem;
|
||||
volatile u8 run_flag;
|
||||
FILE *file;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
#ifndef __WEBSOCKET_ASR_H__
|
||||
#define __WEBSOCKET_ASR_H__
|
||||
|
||||
|
||||
#include "web_socket/websocket_api.h"
|
||||
#include "wifi/wifi_connect.h"
|
||||
#include "system/includes.h"
|
||||
#include "fs/fs.h"
|
||||
#include "asm/sfc_norflash_api.h"
|
||||
#include "cJSON.h"
|
||||
#include "aduio_record.h"
|
||||
#ifdef WEBSOCKET_MEMHEAP_DEBUG
|
||||
#include "mem_leak_test.h"
|
||||
#endif
|
||||
#include "app_config.h"
|
||||
|
||||
// 定义消息类型常量
|
||||
#define SERVER_FULL_RESPONSE 0b1001
|
||||
#define SERVER_ACK 0b1011
|
||||
#define SERVER_ERROR_RESPONSE 0b1111
|
||||
|
||||
// 定义压缩和序列化方法常量
|
||||
#define GZIP 1
|
||||
#define JSON 1
|
||||
#define NO_SERIALIZATION 0
|
||||
|
||||
// 定义响应结构体,用于存储原始响应数据
|
||||
typedef struct {
|
||||
uint8_t protocol_version;
|
||||
uint8_t header_size;
|
||||
uint8_t message_type;
|
||||
uint8_t message_type_specific_flags;
|
||||
uint8_t serialization_method;
|
||||
uint8_t message_compression;
|
||||
uint8_t reserved;
|
||||
uint8_t* header_extensions;
|
||||
uint8_t* payload;
|
||||
size_t payload_size;
|
||||
} Response;
|
||||
|
||||
// 定义解析后的响应结构体,用于存储处理后的数据
|
||||
typedef struct {
|
||||
unsigned char* payload_msg;
|
||||
size_t payload_size;
|
||||
} ParsedResponse;
|
||||
|
||||
//JSON打包结构体
|
||||
typedef struct {
|
||||
char* appid;
|
||||
char* cluster;
|
||||
char* token;
|
||||
char* uid;
|
||||
int nbest;
|
||||
char* workflow;
|
||||
int show_language;
|
||||
int show_utterances;
|
||||
char* result_type;
|
||||
char* format;
|
||||
int rate;
|
||||
char* language;
|
||||
int bits;
|
||||
int channel;
|
||||
char* codec;
|
||||
} AsrWsClient;
|
||||
|
||||
//头部信息
|
||||
#define STT_DEFAULT_VERSION 0b0001
|
||||
#define STT_DEFAULT_MESSAGE_TYPE 0b0001
|
||||
#define STT_DEFAULT_MESSAGE_TYPE_SPECIFIC_FLAGS 0b0000
|
||||
#define STT_DEFAULT_SERIAL_METHOD 0b0001
|
||||
#define STT_DEFAULT_COMPRESSION_TYPE 0b0000
|
||||
#define STT_DEFAULT_RESERVED_DATA 0
|
||||
#define STT_DEFAULT_EXTENSION_HEADER NULL
|
||||
#define STT_DEFAULT_EXTENSION_HEADER_LENGTH 0
|
||||
#define DEFAULT_HEADR STT_DEFAULT_VERSION,STT_DEFAULT_MESSAGE_TYPE,STT_DEFAULT_MESSAGE_TYPE_SPECIFIC_FLAGS,\
|
||||
STT_DEFAULT_SERIAL_METHOD,STT_DEFAULT_COMPRESSION_TYPE,STT_DEFAULT_RESERVED_DATA,\
|
||||
STT_DEFAULT_EXTENSION_HEADER,STT_DEFAULT_EXTENSION_HEADER_LENGTH
|
||||
|
||||
//asr地址
|
||||
#define OBJ_URL "wss://openspeech.bytedance.com/api/v2/asr"
|
||||
|
||||
|
||||
extern OS_SEM voice_start_sem;//录音开始信号量
|
||||
extern u8 sock_run_flag;//asr->chat->tts正在运行的标志位
|
||||
|
||||
|
||||
|
||||
void asr_websocket_client_thread_create(void);//创建asr主线程以及一些信号量
|
||||
void websockets_asr_client_request_handle_create(void);//创建回复处理任务
|
||||
|
||||
#endif
|
||||
|
|
@ -1,95 +1,15 @@
|
|||
#include "web_socket/websocket_api.h"
|
||||
#include "wifi/wifi_connect.h"
|
||||
#include "system/includes.h"
|
||||
#include "fs/fs.h"
|
||||
#include "asm/sfc_norflash_api.h"
|
||||
#include "cJSON.h"
|
||||
#include "aduio_record.h"
|
||||
#ifdef WEBSOCKET_MEMHEAP_DEBUG
|
||||
#include "mem_leak_test.h"
|
||||
#endif
|
||||
|
||||
#include "app_config.h"
|
||||
|
||||
#define stt
|
||||
#ifdef stt
|
||||
|
||||
// 定义消息类型常量
|
||||
#define SERVER_FULL_RESPONSE 0b1001
|
||||
#define SERVER_ACK 0b1011
|
||||
#define SERVER_ERROR_RESPONSE 0b1111
|
||||
#include "websocket_asr.h"
|
||||
|
||||
// 定义压缩和序列化方法常量
|
||||
#define GZIP 1
|
||||
#define JSON 1
|
||||
#define NO_SERIALIZATION 0
|
||||
|
||||
// 定义响应结构体,用于存储原始响应数据
|
||||
typedef struct {
|
||||
uint8_t protocol_version;
|
||||
uint8_t header_size;
|
||||
uint8_t message_type;
|
||||
uint8_t message_type_specific_flags;
|
||||
uint8_t serialization_method;
|
||||
uint8_t message_compression;
|
||||
uint8_t reserved;
|
||||
uint8_t* header_extensions;
|
||||
uint8_t* payload;
|
||||
size_t payload_size;
|
||||
} Response;
|
||||
|
||||
// 定义解析后的响应结构体,用于存储处理后的数据
|
||||
typedef struct {
|
||||
unsigned char* payload_msg;
|
||||
size_t payload_size;
|
||||
} ParsedResponse;
|
||||
|
||||
typedef struct {
|
||||
char* appid;
|
||||
char* cluster;
|
||||
char* token;
|
||||
char* uid;
|
||||
int nbest;
|
||||
char* workflow;
|
||||
int show_language;
|
||||
int show_utterances;
|
||||
char* result_type;
|
||||
char* format;
|
||||
int rate;
|
||||
char* language;
|
||||
int bits;
|
||||
int channel;
|
||||
char* codec;
|
||||
} AsrWsClient;
|
||||
|
||||
|
||||
#define STT_DEFAULT_VERSION 0b0001
|
||||
#define STT_DEFAULT_MESSAGE_TYPE 0b0001
|
||||
#define STT_DEFAULT_MESSAGE_TYPE_SPECIFIC_FLAGS 0b0000
|
||||
#define STT_DEFAULT_SERIAL_METHOD 0b0001
|
||||
#define STT_DEFAULT_COMPRESSION_TYPE 0b0000
|
||||
#define STT_DEFAULT_RESERVED_DATA 0
|
||||
#define STT_DEFAULT_EXTENSION_HEADER NULL
|
||||
#define STT_DEFAULT_EXTENSION_HEADER_LENGTH 0
|
||||
|
||||
#define DEFAULT_HEADR STT_DEFAULT_VERSION,STT_DEFAULT_MESSAGE_TYPE,STT_DEFAULT_MESSAGE_TYPE_SPECIFIC_FLAGS,\
|
||||
STT_DEFAULT_SERIAL_METHOD,STT_DEFAULT_COMPRESSION_TYPE,STT_DEFAULT_RESERVED_DATA,\
|
||||
STT_DEFAULT_EXTENSION_HEADER,STT_DEFAULT_EXTENSION_HEADER_LENGTH
|
||||
|
||||
#define OBJ_URL "wss://openspeech.bytedance.com/api/v2/asr"
|
||||
|
||||
extern OS_SEM voice_start_sem;
|
||||
|
||||
OS_SEM chat_sem;
|
||||
|
||||
OS_MUTEX http_mutex;
|
||||
|
||||
OS_SEM disconnet_sem;
|
||||
|
||||
static OS_SEM websocket_send_sem;
|
||||
|
||||
unsigned char chat_msg[4 * 1024];
|
||||
OS_SEM chat_sem;//聊天任务开启信号量
|
||||
//OS_MUTEX http_mutex;
|
||||
OS_SEM disconnet_sem;//asr_websocket断连信号量
|
||||
//OS_SEM ws_sem;
|
||||
unsigned char chat_msg[4 * 1024];//asr识别出来的信息
|
||||
|
||||
//websocket回复回调函数
|
||||
static void websockets_callback(u8 *buf, u32 len, u8 type)
|
||||
{
|
||||
int argv[4];
|
||||
|
|
@ -101,7 +21,7 @@ static void websockets_callback(u8 *buf, u32 len, u8 type)
|
|||
argv[0]=(int)buf;
|
||||
argv[1]=len;
|
||||
|
||||
err = os_taskq_post_type("websockets_stt_client_request_handle", Q_USER, 10, argv);
|
||||
err = os_taskq_post_type("websockets_asr_client_request_handle", Q_USER, 10, argv);
|
||||
if (err == OS_Q_FULL) {
|
||||
printf("post request err!\r\n");
|
||||
}
|
||||
|
|
@ -110,10 +30,7 @@ static void websockets_callback(u8 *buf, u32 len, u8 type)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Websocket Client api
|
||||
*******************************************************************************/
|
||||
//websocket参数注册函数
|
||||
static void websockets_client_reg(struct websocket_struct *websockets_info, char mode)
|
||||
{
|
||||
memset(websockets_info, 0, sizeof(struct websocket_struct));
|
||||
|
|
@ -136,6 +53,7 @@ static void websockets_client_reg(struct websocket_struct *websockets_info, char
|
|||
#endif
|
||||
}
|
||||
|
||||
//websocket初始化函数
|
||||
static int websockets_client_init(struct websocket_struct *websockets_info, u8 *url, const char *origin_str, const char *user_agent_str)
|
||||
{
|
||||
websockets_info->ip_or_url = url;
|
||||
|
|
@ -151,27 +69,32 @@ static int websockets_client_init(struct websocket_struct *websockets_info, u8 *
|
|||
return websockets_info->_init(websockets_info);
|
||||
}
|
||||
|
||||
//websocket握手函数函数
|
||||
static int websockets_client_handshack(struct websocket_struct *websockets_info)
|
||||
{
|
||||
return websockets_info->_handshack(websockets_info);
|
||||
}
|
||||
|
||||
//websocket发送信息函数
|
||||
static int websockets_client_send(struct websocket_struct *websockets_info, u8 *buf, int len, char type)
|
||||
{
|
||||
//SSL加密时一次发送数据不能超过16K,用户需要自己分包
|
||||
return websockets_info->_send(websockets_info, buf, len, type);
|
||||
}
|
||||
|
||||
//websocket通知服务器断连函数
|
||||
static int websockets_client_exit_notify(struct websocket_struct *websockets_info)
|
||||
{
|
||||
return websockets_info->_exit_notify(websockets_info);
|
||||
}
|
||||
|
||||
//websocket断连函数
|
||||
static void websockets_client_exit(struct websocket_struct *websockets_info)
|
||||
{
|
||||
websockets_info->_exit(websockets_info);
|
||||
}
|
||||
|
||||
//头生成函数
|
||||
static uint8_t* generate_header(
|
||||
uint8_t version,
|
||||
uint8_t message_type,
|
||||
|
|
@ -207,6 +130,7 @@ static uint8_t* generate_header(
|
|||
return header;
|
||||
}
|
||||
|
||||
//JSON组包函数
|
||||
static char* construct_request(AsrWsClient* client, const char* reqid) {
|
||||
cJSON* root = cJSON_CreateObject();
|
||||
if (root == NULL) {
|
||||
|
|
@ -266,7 +190,8 @@ fail:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static ParsedResponse* stt_parse_response(const uint8_t* res, size_t res_size) {
|
||||
//asr回复信息解析函数
|
||||
static ParsedResponse* asr_parse_response(const uint8_t* res, size_t res_size) {
|
||||
// 检查响应大小是否足够
|
||||
if (res_size < 4) return NULL;
|
||||
|
||||
|
|
@ -341,6 +266,7 @@ static ParsedResponse* stt_parse_response(const uint8_t* res, size_t res_size) {
|
|||
return result;
|
||||
}
|
||||
|
||||
//uuid生成函数
|
||||
static void generate_uuid(char *uuid_out)
|
||||
{
|
||||
const char *c = "89ab";
|
||||
|
|
@ -373,10 +299,8 @@ static void generate_uuid(char *uuid_out)
|
|||
*p = 0;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Websocket Client.c
|
||||
*******************************************************************************/
|
||||
static void websockets_stt_client_main_thread(void *priv)
|
||||
//asr主线程
|
||||
static void websockets_asr_client_main_thread(void *priv)
|
||||
{
|
||||
|
||||
while(1){
|
||||
|
|
@ -397,7 +321,6 @@ static void websockets_stt_client_main_thread(void *priv)
|
|||
char *aduio_client_request=NULL;
|
||||
rec_msg *rmsg=NULL;
|
||||
int frist_voice=0;
|
||||
char name[128];
|
||||
|
||||
AsrWsClient STTPayload={
|
||||
.appid="8571950639",
|
||||
|
|
@ -436,16 +359,17 @@ static void websockets_stt_client_main_thread(void *priv)
|
|||
}
|
||||
|
||||
/* 3 . hanshack */
|
||||
// printf("websockets_client_handshack_start\r\n");
|
||||
// os_mutex_pend(&http_mutex, 0);
|
||||
//printf("websockets_client_handshack_start\r\n");
|
||||
//os_mutex_pend(&http_mutex, 0);
|
||||
err = websockets_client_handshack(websockets_info);
|
||||
// os_mutex_post(&http_mutex);
|
||||
// printf("websockets_client_handshack_end\r\n");
|
||||
//os_mutex_post(&http_mutex);
|
||||
//printf("websockets_client_handshack_end\r\n");
|
||||
if (FALSE == err) {
|
||||
printf(" . ! Handshake error !!!\r\n");
|
||||
continue;
|
||||
}
|
||||
printf(" . Handshake success \r\n");
|
||||
|
||||
/* 4 . CreateThread */
|
||||
thread_fork("stt_websocket_client_heart", 19, 512, 0,
|
||||
&websockets_info->ping_thread_id,
|
||||
|
|
@ -470,14 +394,10 @@ static void websockets_stt_client_main_thread(void *priv)
|
|||
rmsg=(rec_msg *)msg[1];
|
||||
|
||||
if(frist_voice==0){
|
||||
|
||||
FILE *f = fopen("mnt/sdfile/res/ai_res/boot.amr", "r");
|
||||
if (!f) {
|
||||
printf("fopen err!\n");
|
||||
}else{
|
||||
fget_name(f, name, sizeof(name));
|
||||
printf("file_name: %s\n", name);
|
||||
|
||||
extern int playback_file(FILE *res);
|
||||
|
||||
playback_file(f);
|
||||
|
|
@ -533,7 +453,7 @@ static void websockets_stt_client_main_thread(void *priv)
|
|||
// os_sem_pend(&websocket_send_sem,0);
|
||||
err = websockets_client_send(websockets_info, (u8 *)full_client_request, total_length, WCT_TXTDATA);
|
||||
if (FALSE == err) {
|
||||
printf(" . ! send err !!!\r\n");
|
||||
printf(" . ! stt send err !!!\r\n");
|
||||
break;
|
||||
}
|
||||
if(full_client_request!=NULL){
|
||||
|
|
@ -632,7 +552,8 @@ static void websockets_stt_client_main_thread(void *priv)
|
|||
}
|
||||
}
|
||||
|
||||
static void websockets_stt_client_request_handle(void *priv){
|
||||
//asr回复处理线程
|
||||
static void websockets_asr_client_request_handle(void *priv){
|
||||
int err;
|
||||
int msg[32];
|
||||
u8 *buf;
|
||||
|
|
@ -649,7 +570,7 @@ static void websockets_stt_client_request_handle(void *priv){
|
|||
|
||||
//printf(" . len: %d",len);
|
||||
|
||||
req=stt_parse_response(buf, len);
|
||||
req=asr_parse_response(buf, len);
|
||||
|
||||
//free(buf);
|
||||
|
||||
|
|
@ -661,6 +582,7 @@ static void websockets_stt_client_request_handle(void *priv){
|
|||
cJSON *code = cJSON_GetObjectItem(json, "code");
|
||||
if(cJSON_IsNumber(code)){
|
||||
if(code->valueint!=1000){
|
||||
sock_run_flag=0;
|
||||
os_sem_set(&voice_start_sem,0);
|
||||
os_sem_post(&voice_start_sem);
|
||||
}else{
|
||||
|
|
@ -696,18 +618,17 @@ static void websockets_stt_client_request_handle(void *priv){
|
|||
}
|
||||
}
|
||||
|
||||
void stt_websocket_client_thread_create(void)
|
||||
//创建asr主线程以及一些信号量
|
||||
void asr_websocket_client_thread_create(void)
|
||||
{
|
||||
os_sem_create(&disconnet_sem,0);
|
||||
os_sem_create(&chat_sem,0);
|
||||
os_mutex_create(&http_mutex);
|
||||
//os_sem_create(&websocket_send_sem,1);
|
||||
thread_fork("websockets_stt_client_main_thread", 16, 1024 * 8, 512, 0, websockets_stt_client_main_thread, NULL);
|
||||
thread_fork("websockets_asr_client_main_thread", 16, 1024 * 8, 512, 0, websockets_asr_client_main_thread, NULL);
|
||||
}
|
||||
|
||||
void websockets_stt_client_request_handle_create(void)
|
||||
//创建回复处理任务
|
||||
void websockets_asr_client_request_handle_create(void)
|
||||
{
|
||||
thread_fork("websockets_stt_client_request_handle",20,1024 * 2, 1024, 0,websockets_stt_client_request_handle,NULL);
|
||||
thread_fork("websockets_asr_client_request_handle",20,1024 * 2, 1024, 0,websockets_asr_client_request_handle,NULL);
|
||||
}
|
||||
|
||||
#endif // stt
|
||||
#endif // asr
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
#ifndef __HTTP_CAHT_H__
|
||||
#define __HTTP_CAHT_H__
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "wifi/wifi_connect.h"
|
||||
#include "apps/http_client.h"
|
||||
#include "app_config.h"
|
||||
#include "cJSON.h"
|
||||
#include "fs/fs.h"
|
||||
|
||||
//chat地址
|
||||
#define HTTP_DEMO_URL "https://ark.cn-beijing.volces.com/api/v3/chat/completions"
|
||||
|
||||
//demo_chat发送信息
|
||||
#define HTTP_DEMO_DATA "{\"model\":\"ep-20241018141941-6bn54\", \"messages\":[{\"role\":\"user\", \"content\":\"豆包,介绍一下上甘岭战役\"}]}"
|
||||
|
||||
//校验令牌
|
||||
#define AUTHORIZATION "Bearer f311cc81-1c5b-42c3-bb8a-1b10d1348080"
|
||||
|
||||
//chat回复接收的最大数据
|
||||
#define MAX_CONTENT_LENGTH 4*1024
|
||||
|
||||
//上下文最大留存
|
||||
#define MAX_MSG_LENGTH 5
|
||||
|
||||
//上下文结构体
|
||||
typedef struct message_session{
|
||||
char role[10];
|
||||
char content[5*1024];
|
||||
}msg_session;
|
||||
|
||||
|
||||
extern unsigned char chat_msg[4 * 1024];
|
||||
|
||||
extern OS_SEM chat_sem;
|
||||
|
||||
extern OS_SEM disconnet_sem;
|
||||
|
||||
//extern OS_MUTEX http_mutex;
|
||||
|
||||
extern u8 sock_run_flag;
|
||||
|
||||
//OS_SEM tts_sem;
|
||||
|
||||
void http_chat_task_create(void);//http_chat 主线程创建
|
||||
#endif
|
||||
|
|
@ -1,52 +1,20 @@
|
|||
#include "system/includes.h"
|
||||
#include "wifi/wifi_connect.h"
|
||||
#include "apps/http_client.h"
|
||||
#include "app_config.h"
|
||||
#include "cJSON.h"
|
||||
|
||||
#define chat_lwip_stream
|
||||
#ifdef chat_lwip_stream
|
||||
|
||||
#define HTTP_DEMO_URL "https://ark.cn-beijing.volces.com/api/v3/chat/completions"
|
||||
#include "http_chat.h"
|
||||
|
||||
#define HTTP_DEMO_DATA "{\"model\":\"ep-20241018141941-6bn54\", \"messages\":[{\"role\":\"user\", \"content\":\"豆包,介绍一下上甘岭战役\"}]}"
|
||||
|
||||
#define AUTHORIZATION "Bearer f311cc81-1c5b-42c3-bb8a-1b10d1348080"
|
||||
|
||||
#define MAX_CONTENT_LENGTH 4*1024
|
||||
|
||||
#define MAX_MSG_LENGTH 5
|
||||
|
||||
typedef struct message_session{
|
||||
char role[10];
|
||||
char content[5*1024];
|
||||
}msg_session;
|
||||
char accumulated_content[10*1024] = {0};//chat回复累加数据
|
||||
|
||||
static char buffer[2*1024] = {0}; // 用于存储不完整数据块的缓冲区
|
||||
static size_t buffer_len = 0;
|
||||
static size_t buffer_len = 0; //不完整数据块的缓冲区长度
|
||||
static size_t accumulated_length = 0;//实时回复数据总长度
|
||||
static size_t add_length = 0;//实时增加的长度
|
||||
|
||||
char accumulated_content[10*1024] = {0};
|
||||
static size_t accumulated_length = 0;
|
||||
static size_t add_length = 0;
|
||||
static size_t sup_length = 0;
|
||||
static size_t sent_length = 0;
|
||||
static msg_session msg_arr[MAX_MSG_LENGTH];//上下文数组
|
||||
|
||||
static msg_session msg_arr[MAX_MSG_LENGTH];
|
||||
|
||||
static int chat_index=0;
|
||||
|
||||
extern unsigned char chat_msg[4 * 1024];
|
||||
|
||||
extern OS_SEM chat_sem;
|
||||
|
||||
extern OS_SEM disconnet_sem;
|
||||
|
||||
extern OS_MUTEX http_mutex;
|
||||
|
||||
extern u8 sock_run_flag;
|
||||
|
||||
OS_SEM tts_sem;
|
||||
static int chat_index=0;//上下文数组下标
|
||||
|
||||
//解析chat返回的chunk
|
||||
static void process_sse_chunk(const char *chunk)
|
||||
{
|
||||
int argv[4];
|
||||
|
|
@ -61,20 +29,6 @@ static void process_sse_chunk(const char *chunk)
|
|||
if (strcmp(data_start, "[DONE]") == 0) {
|
||||
printf("SSE stream ended\r\n");
|
||||
printf("answer: %s\r\n",accumulated_content);
|
||||
// diff_len = accumulated_length-sent_length;
|
||||
// if(diff_len>0){
|
||||
// for(j=0;j<(diff_len/5)+1;j++){
|
||||
// argv[0]=accumulated_length;
|
||||
// argv[1]=diff_len;
|
||||
// if(diff_len>5){
|
||||
// diff_len-=5;
|
||||
// }
|
||||
// os_sem_set(&tts_sem,0);
|
||||
// os_sem_post(&tts_sem);
|
||||
// os_taskq_post_type("websockets_tts_client_main_thread", Q_USER, 20, argv);
|
||||
// }
|
||||
// }
|
||||
|
||||
if(chat_index>=MAX_MSG_LENGTH){
|
||||
chat_index = MAX_MSG_LENGTH-1;
|
||||
for (int i = 1; i < MAX_MSG_LENGTH; i++) {
|
||||
|
|
@ -111,17 +65,11 @@ static void process_sse_chunk(const char *chunk)
|
|||
strcmp(content->valuestring,";")==0){
|
||||
//printf("sentence:%s\r\n",accumulated_content+(accumulated_length-add_length));
|
||||
argv[0]=accumulated_length;
|
||||
// sup_length=0;
|
||||
// if(add_length>5){
|
||||
// sup_length = add_length-5;
|
||||
// add_length = 5;
|
||||
// }
|
||||
// sent_length+=add_length;
|
||||
argv[1]=add_length;
|
||||
os_sem_set(&tts_sem,0);
|
||||
os_sem_post(&tts_sem);
|
||||
// os_sem_set(&tts_sem,0);
|
||||
// os_sem_post(&tts_sem);
|
||||
os_taskq_post_type("websockets_tts_client_main_thread", Q_USER, 20, argv);
|
||||
add_length = 0+sup_length;
|
||||
add_length = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -133,6 +81,7 @@ static void process_sse_chunk(const char *chunk)
|
|||
|
||||
}
|
||||
|
||||
//http回复回调函数
|
||||
static err_t http_rev_func(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
|
||||
{
|
||||
//LWIP_PLATFORM_DIAG(("this is http_rev_func\r\n"));
|
||||
|
|
@ -174,6 +123,7 @@ static err_t http_rev_func(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_
|
|||
return ERR_OK;
|
||||
}
|
||||
|
||||
//http_chat主线程
|
||||
static void http_chat_task(void *priv)
|
||||
{
|
||||
const char *server_name = "ark.cn-beijing.volces.com"; // 服务器名称
|
||||
|
|
@ -263,9 +213,10 @@ static void http_chat_task(void *priv)
|
|||
}
|
||||
}
|
||||
|
||||
//http_chat 主线程创建
|
||||
void http_chat_task_create(void)
|
||||
{
|
||||
os_sem_create(&tts_sem,0);
|
||||
//os_sem_create(&tts_sem,0);
|
||||
if (thread_fork("http_chat_task", 16, 1024 * 4, 0, NULL, http_chat_task, NULL) != OS_NO_ERR) {
|
||||
printf("thread fork fail\n");
|
||||
}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
#include "server/audio_server.h"
|
||||
#include "server/server_core.h"
|
||||
#include "system/app_core.h"
|
||||
#include "generic/circular_buf.h"
|
||||
#include "os/os_api.h"
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "wifi/wifi_connect.h"
|
||||
#include "syscfg/syscfg_id.h"
|
||||
#include "storage_device.h"
|
||||
#include "fs/fs.h"
|
||||
#include <time.h>
|
||||
#include "device/device.h"
|
||||
#include "asm/clock.h"
|
||||
#include "spiflash.h"
|
||||
#include "asm/sfc_norflash_api.h"
|
||||
#include "event/device_event.h"
|
||||
|
||||
#define DOUBAO
|
||||
#ifdef DOUBAO
|
||||
|
||||
extern void asr_websocket_client_thread_create(void);
|
||||
extern void websockets_asr_client_request_handle_create(void);
|
||||
extern void http_chat_task_create(void);
|
||||
extern void tts_websocket_client_thread_create(void);
|
||||
|
||||
|
||||
static void doubao_start(void *priv)
|
||||
{
|
||||
enum wifi_sta_connect_state state;
|
||||
while (1) {
|
||||
printf("Connecting to the network...\n");
|
||||
state = wifi_get_sta_connect_state();
|
||||
if (WIFI_STA_NETWORK_STACK_DHCP_SUCC == state) {
|
||||
printf("Network connection is successful!\n");
|
||||
break;
|
||||
}
|
||||
os_time_dly(500);
|
||||
}
|
||||
asr_websocket_client_thread_create();
|
||||
websockets_asr_client_request_handle_create();
|
||||
http_chat_task_create();
|
||||
tts_websocket_client_thread_create();
|
||||
}
|
||||
//程序入口
|
||||
static int doubao_init_task(void)
|
||||
{
|
||||
|
||||
if (thread_fork("doubao_start", 10, 512, 0, NULL, doubao_start, NULL) != OS_NO_ERR) {
|
||||
printf("thread fork fail\n");
|
||||
}
|
||||
}
|
||||
late_initcall(doubao_init_task);
|
||||
|
||||
#endif //PLAYBACK
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
#ifndef __ADUIO_PLAYBACK_H__
|
||||
#define __ADUIO_PLAYBACK_H__
|
||||
|
||||
#include "server/audio_server.h"
|
||||
#include "server/server_core.h"
|
||||
#include "system/app_core.h"
|
||||
#include "generic/circular_buf.h"
|
||||
#include "os/os_api.h"
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "wifi/wifi_connect.h"
|
||||
#include "syscfg/syscfg_id.h"
|
||||
#include "storage_device.h"
|
||||
#include "fs/fs.h"
|
||||
#include <time.h>
|
||||
#include "device/device.h"
|
||||
#include "asm/clock.h"
|
||||
#include "spiflash.h"
|
||||
#include "asm/sfc_norflash_api.h"
|
||||
#include "event/device_event.h"
|
||||
#include "websocket_tts.h"
|
||||
|
||||
//音频参数
|
||||
#define CONFIG_STORE_VOLUME
|
||||
#define VOLUME_STEP 5
|
||||
#define MIN_VOLUME_VALUE 5
|
||||
#define MAX_VOLUME_VALUE 100
|
||||
#define INIT_VOLUME_VALUE 50
|
||||
|
||||
extern OS_SEM voice_stop_sem;
|
||||
|
||||
extern OS_SEM voice_start_sem;
|
||||
|
||||
//解码参数结构体
|
||||
struct playback_hdl {
|
||||
struct server *dec_server;
|
||||
char volume;
|
||||
u8 channel;
|
||||
void *cache_buf;
|
||||
cbuffer_t save_cbuf;
|
||||
int sample_rate;
|
||||
OS_SEM r_sem;
|
||||
OS_SEM w_sem;
|
||||
volatile u8 run_flag;
|
||||
FILE *file;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
|
@ -1,41 +1,13 @@
|
|||
#include "server/audio_server.h"
|
||||
#include "server/server_core.h"
|
||||
#include "system/app_core.h"
|
||||
#include "generic/circular_buf.h"
|
||||
#include "os/os_api.h"
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "wifi/wifi_connect.h"
|
||||
#include "syscfg/syscfg_id.h"
|
||||
#include "storage_device.h"
|
||||
#include "fs/fs.h"
|
||||
#include <time.h>
|
||||
#include "device/device.h"
|
||||
#include "asm/clock.h"
|
||||
#include "aduio_playback.h"
|
||||
|
||||
#include "spiflash.h"
|
||||
#include "asm/sfc_norflash_api.h"
|
||||
#include "event/device_event.h"
|
||||
|
||||
#define PLAYBACK
|
||||
#ifdef PLAYBACK
|
||||
|
||||
#define CONFIG_STORE_VOLUME
|
||||
#define VOLUME_STEP 5
|
||||
#define MIN_VOLUME_VALUE 5
|
||||
#define MAX_VOLUME_VALUE 100
|
||||
#define INIT_VOLUME_VALUE 50
|
||||
#include "aduio_playback.h"
|
||||
|
||||
struct playback_hdl playback_handler;
|
||||
struct playback_hdl playback_handler;//解码参数结构体
|
||||
|
||||
#define pbh (&playback_handler)
|
||||
|
||||
int w_flag=0;
|
||||
|
||||
extern OS_SEM voice_stop_sem;
|
||||
|
||||
extern OS_SEM voice_start_sem;
|
||||
int w_flag=0;//cbuf写入次数
|
||||
|
||||
static int audio_vfs_fread(void *file, void *data, u32 len)
|
||||
{
|
||||
|
|
@ -64,7 +36,7 @@ static int playback_buffer_data_out(void)
|
|||
union audio_req req = {0};
|
||||
|
||||
req.dec.volume = 20;
|
||||
req.dec.output_buf_len = 10 * 1024;
|
||||
req.dec.output_buf_len = 4 * 1024;
|
||||
req.dec.sample_rate = pbh->sample_rate;
|
||||
req.dec.channel = pbh->channel;
|
||||
req.dec.vfs_ops = &audio_vfs_ops;
|
||||
|
|
@ -100,7 +72,7 @@ int playback_file(FILE *res)
|
|||
pbh->file = res;
|
||||
union audio_req req = {0};
|
||||
|
||||
req.dec.volume = 50;
|
||||
req.dec.volume = 20;
|
||||
req.dec.output_buf_len = 1024;
|
||||
req.dec.sample_rate = 0;
|
||||
req.dec.channel = 0;
|
||||
|
|
@ -237,7 +209,7 @@ static void playback_start(void *priv)
|
|||
|
||||
while(1){
|
||||
os_sem_pend(&pbh->w_sem,0);
|
||||
os_time_dly(20);
|
||||
//os_time_dly(20);
|
||||
playback_buffer_data_out();
|
||||
}
|
||||
}
|
||||
|
|
@ -19,12 +19,14 @@
|
|||
|
||||
#define SPEECH_RECOGNITION_BUFFER_SIZE (1024 * 10)
|
||||
|
||||
//录音传输缓存数据结构体
|
||||
typedef struct record_message {
|
||||
char msg[SPEECH_RECOGNITION_BUFFER_SIZE+1];
|
||||
size_t msg_size;
|
||||
volatile u8 end;
|
||||
}rec_msg;
|
||||
|
||||
//录音参数结构体
|
||||
struct record_hdl {
|
||||
struct server *enc_server;
|
||||
OS_SEM stop_sem;
|
||||
|
|
@ -39,15 +41,8 @@ struct record_hdl {
|
|||
int sample_rate;
|
||||
};
|
||||
|
||||
struct timer_hdl {
|
||||
u32 ticks;
|
||||
int index;
|
||||
int prd;
|
||||
u32 fine_cnt;
|
||||
u8 run;
|
||||
u32 precesion;
|
||||
void *power_ctrl;
|
||||
struct list_head head;
|
||||
};
|
||||
extern struct playback_hdl playback_handler;
|
||||
|
||||
extern int w_flag;
|
||||
|
||||
#endif
|
||||
|
|
@ -1,39 +1,15 @@
|
|||
#include "aduio_record.h"
|
||||
|
||||
#define RECORD
|
||||
#ifdef RECORD
|
||||
|
||||
OS_SEM voice_start_sem;
|
||||
#include "aduio_record.h"
|
||||
|
||||
static OS_SEM voice_stop_sem;
|
||||
OS_SEM voice_start_sem;//录音开始信号量
|
||||
|
||||
u8 sock_run_flag = 0;
|
||||
u8 sock_run_flag = 0;//asr->chat->tts正在运行的标志位
|
||||
|
||||
static OS_SEM voice_stop_sem;//录音暂停信号量
|
||||
|
||||
static const u32 timer_div[] = {
|
||||
/*0000*/ 1,
|
||||
/*0001*/ 4,
|
||||
/*0010*/ 16,
|
||||
/*0011*/ 64,
|
||||
/*0100*/ 2,
|
||||
/*0101*/ 8,
|
||||
/*0110*/ 32,
|
||||
/*0111*/ 128,
|
||||
/*1000*/ 256,
|
||||
/*1001*/ 4 * 256,
|
||||
/*1010*/ 16 * 256,
|
||||
/*1011*/ 64 * 256,
|
||||
/*1100*/ 2 * 256,
|
||||
/*1101*/ 8 * 256,
|
||||
/*1110*/ 32 * 256,
|
||||
/*1111*/ 128 * 256,
|
||||
};
|
||||
|
||||
static struct record_hdl record_handler;
|
||||
|
||||
extern struct playback_hdl playback_handler;
|
||||
|
||||
extern int w_flag;
|
||||
static struct record_hdl record_handler;//录音参数结构体
|
||||
|
||||
#define rech (&record_handler)
|
||||
|
||||
|
|
@ -81,7 +57,7 @@ static int record_vfs_fwrite(void *file, void *data, u32 len)
|
|||
qmsg->end = 0;
|
||||
|
||||
argv[0]=(int)qmsg;
|
||||
err = os_taskq_post_type("websockets_stt_client_main_thread", Q_USER, 10, argv);
|
||||
err = os_taskq_post_type("websockets_asr_client_main_thread", Q_USER, 10, argv);
|
||||
if (err == OS_Q_FULL) {
|
||||
return len;
|
||||
}
|
||||
|
|
@ -117,6 +93,7 @@ static const struct audio_vfs_ops record_vfs_ops = {
|
|||
.flen = record_vfs_flen,
|
||||
};
|
||||
|
||||
//关闭编码器
|
||||
static int record_close(void)
|
||||
{
|
||||
union audio_req req = {0};
|
||||
|
|
@ -131,6 +108,7 @@ static int record_close(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
//解码服务事件回调函数
|
||||
static void enc_server_event_handler(void *priv, int argc, int *argv)
|
||||
{
|
||||
switch (argv[0]) {
|
||||
|
|
@ -151,6 +129,7 @@ static void enc_server_event_handler(void *priv, int argc, int *argv)
|
|||
}
|
||||
}
|
||||
|
||||
//解码初始化函数
|
||||
static int encoder_init(int sample_rate, u8 channel)
|
||||
{
|
||||
int err;
|
||||
|
|
@ -209,6 +188,7 @@ static int encoder_init(int sample_rate, u8 channel)
|
|||
return 0;
|
||||
}
|
||||
|
||||
//解码器参数初始化,开启解码器
|
||||
static int record_mode_init(void)
|
||||
{
|
||||
log_i("record_play_main\n");
|
||||
|
|
@ -226,6 +206,7 @@ static int record_mode_init(void)
|
|||
return encoder_init(rech->sample_rate, rech->channel);
|
||||
}
|
||||
|
||||
//调用初始化函数任务,以及等待解码器暂停
|
||||
static void record_run_task(void){
|
||||
|
||||
union audio_req req = {0};
|
||||
|
|
@ -240,6 +221,7 @@ static void record_run_task(void){
|
|||
|
||||
}
|
||||
|
||||
//解码器开启任务
|
||||
static void record_encoder_start_task(void)
|
||||
{
|
||||
union audio_req req = {0};
|
||||
|
|
@ -248,7 +230,7 @@ static void record_encoder_start_task(void)
|
|||
req.enc.cmd = AUDIO_ENC_PAUSE;
|
||||
server_request(rech->enc_server, AUDIO_REQ_ENC, &req);
|
||||
|
||||
if(/*req.enc.status==AUDIO_ENC_PAUSE&&*/!sock_run_flag){
|
||||
// if(/*req.enc.status==AUDIO_ENC_PAUSE&&*/!sock_run_flag){
|
||||
memset(&req,0,sizeof(union audio_req));
|
||||
req.dec.cmd = AUDIO_DEC_GET_STATUS;
|
||||
server_request(playback_handler.dec_server, AUDIO_REQ_DEC, &req);
|
||||
|
|
@ -272,21 +254,24 @@ static void record_encoder_start_task(void)
|
|||
server_request(rech->enc_server, AUDIO_REQ_ENC, &req);
|
||||
|
||||
}
|
||||
}
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
//record_run_task创建函数
|
||||
static void record_run_task_create(void)
|
||||
{
|
||||
thread_fork("record_run_task", 15, 1024 , 0, NULL, record_run_task, NULL);
|
||||
}
|
||||
|
||||
//record_encoder_start_task创建函数
|
||||
static void record_encoder_start_task_create(void)
|
||||
{
|
||||
os_sem_create(&voice_start_sem,0);
|
||||
thread_fork("record_encoder_start_task", 15, 512 , 0, NULL, record_encoder_start_task, NULL);
|
||||
}
|
||||
|
||||
//开始创建任务函数
|
||||
static void record_start(void *priv)
|
||||
{
|
||||
record_encoder_start_task_create();
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
#ifndef __WEBSOCKET_TTS_H__
|
||||
#define __WEBSOCKET_TTS_H__
|
||||
|
||||
|
||||
#include "web_socket/websocket_api.h"
|
||||
#include "wifi/wifi_connect.h"
|
||||
#include "system/includes.h"
|
||||
#include "asm/sfc_norflash_api.h"
|
||||
#include "cJSON.h"
|
||||
#ifdef WEBSOCKET_MEMHEAP_DEBUG
|
||||
#include "mem_leak_test.h"
|
||||
#endif
|
||||
|
||||
#include "app_config.h"
|
||||
#include "aduio_playback.h"
|
||||
|
||||
#include "fs/fs.h"
|
||||
#include "spiflash.h"
|
||||
#include "event/device_event.h"
|
||||
|
||||
extern char accumulated_content[4*1024];//chat回答信息
|
||||
|
||||
//extern OS_MUTEX http_mutex;
|
||||
|
||||
// 消息类型定义
|
||||
#define AUDIO_ONLY_RESPONSE 0xb
|
||||
#define ERROR_MESSAGE 0xf
|
||||
#define FRONTEND_MESSAGE 0xc
|
||||
|
||||
//tts回复信息结构体
|
||||
struct tts_response{
|
||||
char *msg;
|
||||
size_t len;
|
||||
int end;
|
||||
};
|
||||
|
||||
//JSON打包结构体
|
||||
typedef struct {
|
||||
char* appid;
|
||||
char* cluster;
|
||||
char* token;
|
||||
char* uid;
|
||||
char* voice_type;
|
||||
char* encoding;
|
||||
int compression_rate;
|
||||
int rate;
|
||||
float speed_ratio;
|
||||
float volume_ratio;
|
||||
float pitch_ratio;
|
||||
char* emotion;
|
||||
char* language;
|
||||
char* reqid;
|
||||
char* text;
|
||||
char* text_type;
|
||||
char* operation;
|
||||
int silence_duration;
|
||||
char* with_frontend;
|
||||
char* frontend_type;
|
||||
char* pure_enlish_opt;
|
||||
} TTSClient;
|
||||
|
||||
//tts头部信息
|
||||
#define TTS_DEFAULT_VERSION 0b0001
|
||||
#define TTS_DEFAULT_MESSAGE_TYPE 0b0001
|
||||
#define TTS_DEFAULT_MESSAGE_TYPE_SPECIFIC_FLAGS 0b0000
|
||||
#define TTS_DEFAULT_SERIAL_METHOD 0b0001
|
||||
#define TTS_DEFAULT_COMPRESSION_TYPE 0b0000
|
||||
#define TTS_DEFAULT_RESERVED_DATA 0
|
||||
#define TTS_DEFAULT_EXTENSION_HEADER NULL
|
||||
#define TTS_DEFAULT_EXTENSION_HEADER_LENGTH 0
|
||||
|
||||
#define DEFAULT_HEADR TTS_DEFAULT_VERSION,TTS_DEFAULT_MESSAGE_TYPE,TTS_DEFAULT_MESSAGE_TYPE_SPECIFIC_FLAGS,\
|
||||
TTS_DEFAULT_SERIAL_METHOD,TTS_DEFAULT_COMPRESSION_TYPE,TTS_DEFAULT_RESERVED_DATA,\
|
||||
TTS_DEFAULT_EXTENSION_HEADER,TTS_DEFAULT_EXTENSION_HEADER_LENGTH
|
||||
|
||||
//tts地址
|
||||
#define OBJ_URL "wss://openspeech.bytedance.com/api/v1/tts/ws_binary"
|
||||
|
||||
//extern OS_SEM tts_sem;
|
||||
|
||||
|
||||
void tts_websocket_client_thread_create(void);//tts主线程创建
|
||||
|
||||
#endif
|
||||
|
|
@ -1,78 +1,11 @@
|
|||
#include "web_socket/websocket_api.h"
|
||||
#include "wifi/wifi_connect.h"
|
||||
#include "system/includes.h"
|
||||
#include "asm/sfc_norflash_api.h"
|
||||
#include "cJSON.h"
|
||||
#ifdef WEBSOCKET_MEMHEAP_DEBUG
|
||||
#include "mem_leak_test.h"
|
||||
#endif
|
||||
|
||||
#include "app_config.h"
|
||||
#include "aduio_playback.h"
|
||||
|
||||
#include "fs/fs.h"
|
||||
#include "spiflash.h"
|
||||
#include "event/device_event.h"
|
||||
|
||||
|
||||
#define tts
|
||||
#ifdef tts
|
||||
|
||||
int end_flag;
|
||||
#include "websocket_tts.h"
|
||||
|
||||
struct tts_response *tts_req;
|
||||
|
||||
extern char accumulated_content[4*1024];
|
||||
|
||||
extern OS_MUTEX http_mutex;
|
||||
|
||||
// 消息类型定义
|
||||
#define AUDIO_ONLY_RESPONSE 0xb
|
||||
#define ERROR_MESSAGE 0xf
|
||||
#define FRONTEND_MESSAGE 0xc
|
||||
|
||||
typedef struct {
|
||||
char* appid;
|
||||
char* cluster;
|
||||
char* token;
|
||||
char* uid;
|
||||
char* voice_type;
|
||||
char* encoding;
|
||||
int compression_rate;
|
||||
int rate;
|
||||
float speed_ratio;
|
||||
float volume_ratio;
|
||||
float pitch_ratio;
|
||||
char* emotion;
|
||||
char* language;
|
||||
char* reqid;
|
||||
char* text;
|
||||
char* text_type;
|
||||
char* operation;
|
||||
int silence_duration;
|
||||
char* with_frontend;
|
||||
char* frontend_type;
|
||||
char* pure_enlish_opt;
|
||||
} TTSClient;
|
||||
|
||||
#define TTS_DEFAULT_VERSION 0b0001
|
||||
#define TTS_DEFAULT_MESSAGE_TYPE 0b0001
|
||||
#define TTS_DEFAULT_MESSAGE_TYPE_SPECIFIC_FLAGS 0b0000
|
||||
#define TTS_DEFAULT_SERIAL_METHOD 0b0001
|
||||
#define TTS_DEFAULT_COMPRESSION_TYPE 0b0000
|
||||
#define TTS_DEFAULT_RESERVED_DATA 0
|
||||
#define TTS_DEFAULT_EXTENSION_HEADER NULL
|
||||
#define TTS_DEFAULT_EXTENSION_HEADER_LENGTH 0
|
||||
|
||||
#define DEFAULT_HEADR TTS_DEFAULT_VERSION,TTS_DEFAULT_MESSAGE_TYPE,TTS_DEFAULT_MESSAGE_TYPE_SPECIFIC_FLAGS,\
|
||||
TTS_DEFAULT_SERIAL_METHOD,TTS_DEFAULT_COMPRESSION_TYPE,TTS_DEFAULT_RESERVED_DATA,\
|
||||
TTS_DEFAULT_EXTENSION_HEADER,TTS_DEFAULT_EXTENSION_HEADER_LENGTH
|
||||
|
||||
#define OBJ_URL "wss://openspeech.bytedance.com/api/v1/tts/ws_binary"
|
||||
|
||||
|
||||
extern OS_SEM tts_sem;
|
||||
struct tts_response *tts_req;//tts回复信息
|
||||
|
||||
//websocket回复回调函数
|
||||
static void websockets_callback(u8 *buf, u32 len, u8 type)
|
||||
{
|
||||
int argv[4];
|
||||
|
|
@ -94,8 +27,8 @@ static void websockets_callback(u8 *buf, u32 len, u8 type)
|
|||
argv[0]=(int)tts_req;
|
||||
os_taskq_post_type("read_queue_to_cbuf", Q_USER, 30, argv);
|
||||
|
||||
os_sem_set(&tts_sem,0);
|
||||
os_sem_post(&tts_sem);
|
||||
// os_sem_set(&tts_sem,0);
|
||||
// os_sem_post(&tts_sem);
|
||||
|
||||
//printf("queue is post\r\n");
|
||||
}
|
||||
|
|
@ -103,10 +36,7 @@ static void websockets_callback(u8 *buf, u32 len, u8 type)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Websocket Client api
|
||||
*******************************************************************************/
|
||||
//websocket参数注册函数
|
||||
static void websockets_client_reg(struct websocket_struct *websockets_info, char mode)
|
||||
{
|
||||
memset(websockets_info, 0, sizeof(struct websocket_struct));
|
||||
|
|
@ -128,6 +58,7 @@ static void websockets_client_reg(struct websocket_struct *websockets_info, char
|
|||
#endif
|
||||
}
|
||||
|
||||
//websocket初始化函数
|
||||
static int websockets_client_init(struct websocket_struct *websockets_info, u8 *url, const char *origin_str, const char *user_agent_str)
|
||||
{
|
||||
websockets_info->ip_or_url = url;
|
||||
|
|
@ -143,22 +74,26 @@ static int websockets_client_init(struct websocket_struct *websockets_info, u8 *
|
|||
return websockets_info->_init(websockets_info);
|
||||
}
|
||||
|
||||
//websocket握手函数函数
|
||||
static int websockets_client_handshack(struct websocket_struct *websockets_info)
|
||||
{
|
||||
return websockets_info->_handshack(websockets_info);
|
||||
}
|
||||
|
||||
//websocket发送信息函数
|
||||
static int websockets_client_send(struct websocket_struct *websockets_info, u8 *buf, int len, char type)
|
||||
{
|
||||
//SSL加密时一次发送数据不能超过16K,用户需要自己分包
|
||||
return websockets_info->_send(websockets_info, buf, len, type);
|
||||
}
|
||||
|
||||
//websocket断连函数
|
||||
static void websockets_client_exit(struct websocket_struct *websockets_info)
|
||||
{
|
||||
websockets_info->_exit(websockets_info);
|
||||
}
|
||||
|
||||
//头生成函数
|
||||
static uint8_t* generate_header(
|
||||
uint8_t version,
|
||||
uint8_t message_type,
|
||||
|
|
@ -191,6 +126,7 @@ static uint8_t* generate_header(
|
|||
return header;
|
||||
}
|
||||
|
||||
//JSON组包函数
|
||||
static char* construct_request(TTSClient* client, const char* reqid) {
|
||||
cJSON* root = cJSON_CreateObject();
|
||||
if (root == NULL) {
|
||||
|
|
@ -253,6 +189,7 @@ fail:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
//tts回复信息解析函数
|
||||
static char* tts_parse_response(uint8_t *res,int *len) {
|
||||
printf("--------------------------- response ---------------------------\n");
|
||||
|
||||
|
|
@ -321,7 +258,7 @@ static char* tts_parse_response(uint8_t *res,int *len) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
//uuid生成函数
|
||||
static void generate_uuid(char *uuid_out)
|
||||
{
|
||||
const char *c = "89ab";
|
||||
|
|
@ -354,9 +291,7 @@ static void generate_uuid(char *uuid_out)
|
|||
*p = 0;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Websocket Client.c
|
||||
*******************************************************************************/
|
||||
//tts主线程
|
||||
static void websockets_tts_client_main_thread(void *priv)
|
||||
{
|
||||
int err;
|
||||
|
|
@ -373,7 +308,7 @@ static void websockets_tts_client_main_thread(void *priv)
|
|||
char *full_client_request=NULL;
|
||||
char *payload_text = NULL;
|
||||
int msg[32]; //接收消息队列buf
|
||||
int total_len;
|
||||
int addr_len;
|
||||
int add_len;
|
||||
|
||||
u8 uuid[16] = {0};
|
||||
|
|
@ -383,7 +318,7 @@ static void websockets_tts_client_main_thread(void *priv)
|
|||
.cluster="volcano_tts",
|
||||
.token="BNA-XBIrEisvMczcmc-Sm4B3H-PmfqlL",
|
||||
.uid="2452284000",
|
||||
.voice_type="BV700_streaming",
|
||||
.voice_type="BV001_streaming",
|
||||
.encoding="pcm",
|
||||
.compression_rate=1,
|
||||
.rate=8000,
|
||||
|
|
@ -443,17 +378,17 @@ static void websockets_tts_client_main_thread(void *priv)
|
|||
|
||||
/* 5 . recv or send data */
|
||||
while (1) {
|
||||
os_sem_pend(&tts_sem,0);
|
||||
// os_sem_pend(&tts_sem,0);
|
||||
|
||||
err = os_taskq_pend("taskq", msg, ARRAY_SIZE(msg));
|
||||
if (err != OS_TASKQ || msg[0] != Q_USER) {
|
||||
goto exit_ws;
|
||||
}
|
||||
total_len = msg[1];
|
||||
addr_len = msg[1]-msg[2];
|
||||
|
||||
add_len = msg[2];
|
||||
|
||||
printf("total_len:%d add_len:%d\r\n",total_len,add_len);
|
||||
printf("addr_len:%d add_len:%d\r\n",addr_len,add_len);
|
||||
|
||||
websocket_header=generate_header(DEFAULT_HEADR);
|
||||
|
||||
|
|
@ -472,7 +407,7 @@ static void websockets_tts_client_main_thread(void *priv)
|
|||
goto exit_ws;
|
||||
}
|
||||
|
||||
memcpy(payload_text,accumulated_content+(total_len-add_len),add_len);
|
||||
memcpy(payload_text,accumulated_content+addr_len,add_len);
|
||||
|
||||
TTSPayload.text = payload_text;
|
||||
|
||||
|
|
@ -514,10 +449,11 @@ static void websockets_tts_client_main_thread(void *priv)
|
|||
free(payload);
|
||||
payload = NULL;
|
||||
}
|
||||
|
||||
//os_mutex_pend(&http_mutex, 0);
|
||||
err = websockets_client_send(websockets_info, (u8 *)full_client_request, total_length, WCT_TXTDATA);
|
||||
//os_mutex_post(&http_mutex);
|
||||
if (FALSE == err) {
|
||||
printf(" . ! send err !!!\r\n");
|
||||
printf(" . ! tts send err !!!\r\n");
|
||||
goto exit_ws;
|
||||
}
|
||||
|
||||
|
|
@ -548,6 +484,7 @@ exit_ws:
|
|||
free(full_client_request);
|
||||
}
|
||||
|
||||
//tts主线程创建
|
||||
void tts_websocket_client_thread_create(void)
|
||||
{
|
||||
thread_fork("websockets_tts_client_main_thread", 15, 1024 * 6, 1024, 0, websockets_tts_client_main_thread, NULL);
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
Loading…
Reference in New Issue