본문으로 건너뛰기

음성 채팅 모드

voice 채권 모드when 장치 듣기, 업로드 및 replies를 결정합니다. 즉, 키워드로 한 번 누르거나 손을 잡을 수 있습니다. ai_manage_mode는 이러한 모드를 등록하는 구성 요소이며, 그 사이를 전환하고, 이벤트 (사용자, VAD, 키)를 어느 모드가 활성화됩니다.

그것은 장치의 입력 (버튼, 마이크, 웨이브 단어)과 [ai_agent] (ai-agent) 사이에 앉아 실제 클라우드 이야기. 모드는 오디오 자체를 업로드하지 않습니다. moment를 시작하고 중지하기로 결정하면 ai_agent를 구동합니다.

약관

(주)이름 *
채팅 모드기기가 듣고 업로드 할 때 결정하는 상호 작용 스타일 - hold, oneshot, wakeup 또는 free.
VAD를Voice Activity Detection - 사용자가 말하는지 감지합니다.
모드 핸들AI_MODE_HANDLE_T - 콜백의 세트는 하나의 모드 구현 (init, Task, event handling 등).

채팅 모드는 무엇입니까?

모든 모드는 하나의 질문에 답합니다. ** 장치 시작을 유지하고 사용자의 목소리를 캡처 중지해야합니까?** 네 개의 내장 모드가 서로 응답합니다.

주요 특징뚱 베어더 큰관련 기사
기타AI_CHAT_MODE_HOLD버튼을 눌러버튼 출시
원샷AI_CHAT_MODE_ONE_SHOT버튼을 한 번 클릭VAD는 연설의 끝을 검출합니다
모닝콜AI_CHAT_MODE_WAKEUP자주 묻는 질문VAD는 연설의 끝을 검출합니다
무료 다운로드AI_CHAT_MODE_FREE항상 듣고결코 — 연속

enum은 AI_CHAT_MODE_E입니다. 사용자 정의 모드는 AI_CHAT_MODE_CUSTOM_START (0x100)에서 시작하므로, 내장 된 것과는 결코 충돌하지 않습니다.

typedef enum {
AI_CHAT_MODE_HOLD,
AI_CHAT_MODE_ONE_SHOT,
AI_CHAT_MODE_WAKEUP,
AI_CHAT_MODE_FREE,

AI_CHAT_MODE_CUSTOM_START = 0x100,
} AI_CHAT_MODE_E;

모드 수명주기

방아쇠가 무엇이든, 각 형태는 AI_MODE_STATE_E로 드러낸 동일한 국가 기계를 달립니다. 활성 모드는 이 상태를 차례로 진행합니다. 현재 ai_mode_get_state로 쿼리하십시오.

(주)이름 *
AI_MODE_STATE_INIT모드는 초기화됩니다.
AI_MODE_STATE_IDLE방아쇠를 위한 처음과 대기.
AI_MODE_STATE_LISTEN사용자의 목소리를 캡처.
AI_MODE_STATE_UPLOAD캡처 된 오디오를 클라우드로 전송합니다.
AI_MODE_STATE_THINK클라우드는 처리 (ASR + reasoning).
AI_MODE_STATE_SPEAK클라우드의 답장을 다시 재생합니다.
AI_MODE_STATE_INVALID모드가 활성화되지 않습니다, 또는 모드는 시작되지 않습니다.

:::기사 ai_mode_get_stateAI_MODE_STATE_INVALID를 반환합니다. 상태에 의존하기 전에 ai_mode_init와 모드를 초기화합니다. :::

모드가 구현되는 방법

모드는 AI_MODE_HANDLE_T에서 수집된 콜백 세트로 AI_CHAT_MODE_E 값을 ai_mode_register로 등록했습니다. name 만, init, deinit, task, handle_event, get_state, client_run가 필요합니다. vad_changehandle_key는 오디오 및 버튼 구성 요소가 활성화 될 때만 존재합니다.

typedef struct {
const char *name;

OPERATE_RET (*init) (void);
OPERATE_RET (*deinit) (void);
OPERATE_RET (*task) (void *args);
OPERATE_RET (*handle_event) (AI_NOTIFY_EVENT_T *event);
AI_MODE_STATE_E (*get_state) (void);
OPERATE_RET (*client_run) (void *data);

#if defined(ENABLE_COMP_AI_AUDIO) && (ENABLE_COMP_AI_AUDIO == 1)
OPERATE_RET (*vad_change) (AI_AUDIO_VAD_STATE_E vad_state);
#endif

#if defined(ENABLE_BUTTON) && (ENABLE_BUTTON == 1)
OPERATE_RET (*handle_key) (TDL_BUTTON_TOUCH_EVENT_E event, void *arg);
#endif
} AI_MODE_HANDLE_T;

내장 모드는 이미 핸들을 제공; 당신은 각각 하나의 통화로 등록 (ai_mode_hold_register, ai_mode_oneshot_register, 나머지). 사용자 정의 모드를 만들 때 자신의 AI_MODE_HANDLE_T 만 정의합니다.

API 참조

헤더: ai_manage_mode.h. 기능 반환 OPERATE_RET (OPRT_OK 성공에) 그렇지 않으면.

제품정보이름 *제품정보
ai_mode_registermodehandle채팅 모드 값에 대한 모드 핸들을 등록하십시오. 등록 순서는 ai_mode_switch_next 주기 순서를 놓습니다.
ai_mode_initmode등록 된 모드를 초기화하고 활성 모드를 만듭니다.
ai_mode_deinit활성 모드를 분리합니다.
ai_mode_task_runningargsActive Mode의 task 콜백을 실행합니다. 이 호출을 반복하여 state Machine을 미리 호출합니다.
ai_mode_handle_eventeventActive Mode에 AI_NOTIFY_EVENT_T를 전달합니다.
ai_mode_get_state활성 모드의 AI_MODE_STATE_E (AI_MODE_STATE_INVALID 아무도)를 반환합니다.
ai_mode_client_rundataActive Mode의 client_run 콜백을 실행합니다.
ai_mode_vad_changevad_stateActive Mode로 VAD state를 변경합니다. ENABLE_COMP_AI_AUDIO를 요구합니다.
ai_mode_handle_keyeventargActive Mode로 버튼 이벤트를 전달합니다. ENABLE_BUTTON를 요구합니다.
ai_mode_get_curr_modemode (아웃)활성 채팅 모드를 가져옵니다.
ai_mode_switchmode다른 모드로 전환 - 현재를 분리하고 목표를 초기화합니다.
ai_mode_switch_next다음 등록 모드로 전환하고 AI_CHAT_MODE_E 값을 반환합니다.
ai_get_mode_state_strstate상태에 대한 인간의 읽기 가능한 이름을 반환합니다.
ai_get_mode_name_strmode모드에 대한 인간의 읽기 가능한 이름을 반환합니다.
ai_mode_is_in_register_listmode모드가 등록되면 TRUE를 반환합니다.
ai_get_first_modeout_mode (아웃)첫 번째 등록 모드를 가져옵니다.

:::가격 ai_mode_switch_next 사이클 모드는 등록한 순서에. 긴 압박 또는 설정 toggle에 와이어를 사용하여 사용자가 runtime에서 채팅 모드를 통해 회전 할 수 있습니다. :::

앱으로 연결

시작시에 필요한 모드를 등록하고 기본을 초기화 한 다음 작업 루프 및 전달 이벤트를 실행합니다.

#include "ai_manage_mode.h"
#include "ai_mode_hold.h"
#include "ai_mode_oneshot.h"

OPERATE_RET ai_modes_start(void)
{
OPERATE_RET rt = OPRT_OK;

// 1. Register the modes you want. Registration order = switch-next order.
TUYA_CALL_ERR_RETURN(ai_mode_hold_register());
TUYA_CALL_ERR_RETURN(ai_mode_oneshot_register());

// 2. Initialize a default mode.
TUYA_CALL_ERR_RETURN(ai_mode_init(AI_CHAT_MODE_HOLD));
return rt;
}

// 3. Advance the active mode's state machine in your loop.
void ai_mode_loop(void *args)
{
while (1) {
ai_mode_task_running(args);
tal_system_sleep(10);
}
}

// Rotate to the next registered mode (e.g. from a long-press).
void ai_mode_cycle(void)
{
AI_CHAT_MODE_E next = ai_mode_switch_next();
PR_NOTICE("Switched to mode: %s", ai_get_mode_name_str(next));
}

사용자 정의 모드 추가

필요한 콜백을 구현하고 AI_MODE_HANDLE_T를 채우고 AI_CHAT_MODE_CUSTOM_START 이상의 값으로 등록하십시오.

static AI_MODE_STATE_E sg_state = AI_MODE_STATE_IDLE;

static OPERATE_RET my_mode_init(void) { sg_state = AI_MODE_STATE_IDLE; return OPRT_OK; }
static OPERATE_RET my_mode_deinit(void) { return OPRT_OK; }
static AI_MODE_STATE_E my_mode_get_state(void) { return sg_state; }

static OPERATE_RET my_mode_task(void *args)
{
switch (sg_state) {
case AI_MODE_STATE_IDLE: /* wait for a trigger */ break;
case AI_MODE_STATE_LISTEN: /* capture voice */ break;
default: break;
}
return OPRT_OK;
}

static OPERATE_RET my_mode_handle_event(AI_NOTIFY_EVENT_T *event) { return OPRT_OK; }

OPERATE_RET my_mode_register(void)
{
AI_MODE_HANDLE_T handle = {
.name = "my_mode",
.init = my_mode_init,
.deinit = my_mode_deinit,
.task = my_mode_task,
.handle_event = my_mode_handle_event,
.get_state = my_mode_get_state,
};
return ai_mode_register(AI_CHAT_MODE_CUSTOM_START, &handle);
}

참조