代码规范化,修改了播放参数

This commit is contained in:
mojingtao 2024-11-13 10:15:59 +08:00
parent 7dd4de87b3
commit 398db0d431
30 changed files with 755627 additions and 2280 deletions

View File

@ -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 进行编译。如下图:
![alt text](image.png)
芯片概述
------------
杰理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

View File

@ -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">

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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",
@ -446,6 +369,7 @@ static void websockets_stt_client_main_thread(void *priv)
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

View File

@ -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

View File

@ -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");
}

View File

@ -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

View File

@ -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

View File

@ -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();
}
}

View File

@ -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

View File

@ -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();

View File

@ -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

View File

@ -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.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
doubao_chat/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB