Files
arcs/modules/lschat/include/lsc_session_voice.h
2026-08-13 16:50:52 +08:00

292 lines
6.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Copyright (c) 2023, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stddef.h>
#include "lsc.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @addtogroup session_voice 闲聊会话
*
* @{
*/
/**
* @brief 定义音乐列表项结构体
*
* @param id 音乐id
*
*/
typedef struct {
char id[64];
} session_voice_music_item_t;
/**
* @brief 定义音乐列表结构体
*
* @param cnt 列表数量
* @param items 列表项
*
*/
typedef struct {
uint32_t cnt;
session_voice_music_item_t items[];
} session_voice_music_lists_t;
/**
* @brief 定义音乐控制指令类型
*
*/
typedef enum {
/** 下一首 */
SESSION_VOICE_MUSIC_INSTR_NEXT,
/** 上一首 */
SESSION_VOICE_MUSIC_INSTR_PAST,
/** 重播 */
SESSION_VOICE_MUSIC_INSTR_REPLAY,
/** 停止播放 */
SESSION_VOICE_MUSIC_INSTR_CLOSE,
/** 音量设置 */
SESSION_VOICE_MUSIC_INSTR_VOL_SET,
} session_voice_music_instr_e;
/**
* @brief 定义音乐控制指令结构体
*
* @param instr 指令类型
* @param arg 指令参数
*
*/
typedef struct {
session_voice_music_instr_e instr;
int arg;
} session_voice_music_instr_t;
/**
* @brief 定义会话事件类型
*
*
*/
typedef enum {
/** 识别到VAD */
SESSION_VOICE_GOT_VAD = BIT(0),
/** 语义TTS结果 */
SESSION_VOICE_TTS = BIT(2),
/** 语音识别结果 */
SESSION_VOICE_IAT = BIT(3),
/** 当前会话结束 */
SESSION_VOICE_FINISH = BIT(4),
/** 会话超时 */
SESSION_VOICE_TIMEOUT = BIT(5),
/** 音乐列表 */
SESSION_VOICE_MUSIC_LISTS = BIT(8),
/** 音乐控制指令 */
SESSION_VOICE_MUSIC_INSTR = BIT(9),
/** 语音文本结果 */
SESSION_VOICE_REPLY_URL = BIT(10),
/** 生图结果 */
SESSION_VOICE_DRAW = BIT(11),
/** AIUI技能控制 */
SESSION_VOICE_AIUI_CTRL = BIT(12),
/** 会话错误 */
SESSION_VOICE_ERR = BIT(13),
/** 闹钟意图 */
SESSION_VOICE_ALARM_INTENT = BIT(14),
/** 识别到VAD */
SESSION_VOICE_IAT_START = BIT(15),
/** 识别到VAD */
SESSION_VOICE_IAT_END = BIT(16),
/** 声纹信息(男女老少)*/
SESSION_VOICE_VPR_INFO = BIT(19),
/** 声纹ID*/
SESSION_VOICE_VPR_FEATURE = BIT(20),
/** 原始结果数据 */
SESSION_VOICE_RAW_DATA = BIT(30),
} session_voice_event_e;
/**
* @typedef session_voice_event_cb_t
* 定义回调函数类型不同事件类型对应的data数据类型不同。
* 事件类型和对应的data数据类型如下
*
* 事件类型 | data类型
* --------------------------|-----------------
* SESSION_VOICE_GOT_VAD | NULL
* SESSION_VOICE_TTS | char*
* SESSION_VOICE_IAT | char*
* SESSION_VOICE_FINISH | NULL
* SESSION_VOICE_MUSIC_LISTS | session_voice_music_lists_t
* SESSION_VOICE_MUSIC_INSTR | session_voice_music_instr_t
* SESSION_VOICE_REPLY_URL | char*
* SESSION_VOICE_DRAW | char*
* SESSION_VOICE_AIUI_CTRL | char*
* SESSION_VOICE_ERR | NULL
*
* @param evt 事件类型
* @param data 事件数据
* @param size 事件数据长度
* @param usr 用户参数
*/
typedef void (*session_voice_event_cb_t)(session_voice_event_e evt, void *data, uint32_t size, void *usr);
/**
* @brief 定义交互模式
*
*/
typedef enum {
/** 单工模式 */
SESSION_VOICE_INTER_MODE_ONESHOT = 0,
/** 全双工模式 */
SESSION_VOICE_INTER_MODE_CONTINUE = 1,
SESSION_VOICE_INTER_MODE_MAX = 2,
} session_voice_interactive_mode_e;
/**
* @brief 定义初始化参数类型
*
*/
typedef struct {
/** 交互模式 */
session_voice_interactive_mode_e inter_mode;
/** 会话超时时间 */
int session_timeout_ms;
/** 是否开启云端vad */
bool vad_enable;
/** vad检测超时时间 */
int vad_timeout_ms;
/** 设备id */
char device_id[64];
/** 音频编码格式: raw|ico|speex|speex-wb */
char aue[16];
/** 使用speex编码必须定义此字段的值 */
int speex_size;
bool oneshot;
char **words;
uint32_t words_cnt;
} session_voice_config_t;
/**
* @brief 会话初始化
*
* @retval 0 成功
*/
int session_voice_init(void);
/**
* @brief 会话逆初始化
*
* @retval 0 成功
*/
int session_voice_deinit(void);
/**
* @brief 参数设置
*
* @param cfg 配置参数
*
* @retval 0 设置成功
*/
int session_voice_set_config(session_voice_config_t *cfg);
/**
* @brief 获取设置参数
*
* @retval cfg 配置参数
*/
int session_voice_get_config(session_voice_config_t *cfg);
/**
* @brief 添加事件回调函数
* 支持多次添加回调函数
*
* @param cb 回调函数
* @param evt 监听的事件,参考@see session_voice_event_e
* @param usr 用户参数
*
* @retval 0 成功
*/
int session_voice_add_evt_callback(session_voice_event_cb_t cb, session_voice_event_e evt, void *usr);
/**
* @brief 移除已注册的事件回调函数
*
* @param cb 已注册的回调函数
*
* @retval 0 成功
*/
int session_voice_remove_evt_callback(session_voice_event_cb_t cb);
/**
* @brief 启动会话
*
* @retval 0 成功
*/
int session_voice_start(void);
/**
* @brief 中止会话
*
* @retval 0 成功
*/
int session_voice_cancel(void);
/**
* @brief 发送音频
*
* 通过该接口,将语音数据发送到云端处理。
*
* @note 支持流式发送音频格式必须为16k 16bit 单通道 PCM格式
*
* @param data 音频数据
* @param size 音频大小
*
* @retval 0 成功
*/
int session_voice_send_audio(uint8_t *data, uint32_t size);
/**
* @brief 主动中止音频发送
*
* 当未开启云端vad功能时客户端可以主动结束音频发送云端会结束识别并进行对应的处理
*
* @retval 0 成功
*/
int session_voice_end_audio(void);
/**
* @brief 设置当前会话使用的模型ID
*
* 该函数允许应用层设置当前会话使用的模型ID该ID将在会话开始时发送给服务器
* 如果未设置,则使用默认模型
*
* @param model_id 模型ID字符串如果为NULL则使用默认模型
*
* @retval 0 成功
*/
int session_voice_set_model_id(const char *model_id);
/**
* @brief 获取当前会话使用的模型ID
*
* @param model_id 输出参数用于存储模型ID
* @param max_len model_id缓冲区的最大长度
*
* @retval 0 成功
*/
int session_voice_get_model_id(char *model_id, size_t max_len);
/**
* @}
*/
#ifdef __cplusplus
}
#endif