天天看點

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

上一章: 智能語音終端開發闆适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第五章 >>> 下一章: 基本調試指南 | 《無需從0開發 1天上手智能語音離線上方案》第七章>>>

1. 語音服務适配指南

1.1 概述

語音服務元件提供關鍵詞識别和語音資料的處理控制。輸入麥克風的語音資料經過回音消除降噪和關鍵詞識别處理後再輸出到應用層使用。YoC在語音服務接口和算法實作之間增加了适配層,友善多種語音算法的接入,保持了應用代碼的統一。

下圖以SC5654晶片雙核架構為例,适配層利用核間通訊,實作應用與DSP算法的資料互動。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

1.2 适配接口

1.2.1 語音服務适配接口

語音服務适配接口注冊在mic_ops結構體中,詳細資訊如下:

元件:mic

頭檔案:

語音服務的适配接口如下:

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章
1.2.2 應用接口映射

應用通過調用應用層API,操作對應語音服務适配接口,語音服務開發者隻需實作适配接口定義。使用者無需修改代碼,即可遷移至對應語音服務上。

應用API與語音服務适配接口映射如下:

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

1.3 接口說明

init

• 函數原型

int (*init) (mic_t *mic, mic_event_t mic_event);
           

• 功能描述

語音服務初始化,在應用調用aui_mic_start時會調用該接口。若有私有資料需要儲存,可通過函數mic_set_privdata将其儲存在mic->priv私有成員指針中。設定後,其他适配函數就可以通過函數mic_get_privdata擷取該指針。語音服務層通過應用注冊的mic_event回調函數将語音事件傳遞給應用層。

• 參數描述

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

• 相關定義

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章
智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

deinit

int (*deinit) (mic_t *mic);
           

應用接口aui_mic_stop執行時會調用該适配接口釋放資源。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章
智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

kws_control

int (*kws_control) (mic_t *mic, int flag);
           

關鍵詞識别使能控制。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

kws_wake

int (*kws_wake) (mic_t *mic, int flag);
           

強制算法發出一個模拟喚醒事件。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

pcm_data_control

int (*pcm_data_control) (mic_t *mic, int flag);
           

控制算法輸出的音頻流的開關。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

• 傳回值

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

pcm_aec_control

int (*pcm_aec_control) (mic_t *mic, int flag);
           

控制算法是否使能回音消除。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

pcm_set_param

int (*pcm_set_param) (mic_t *mic, void *param);
           

初始化語音算法參數。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章
智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章
智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

mic_set_privdata

int mic_set_privdata(void *priv);
           

設定适配私有資料到mic對象。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

mic_get_privdata

void *mic_get_privdata(void);
           

擷取mic對象中的私有資料指針。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

mic_ops_register

int mic_ops_register(mic_ops_t *ops);
           

注冊适配層,一般增加一個适配需要實作一個新的函數封裝該函數,提供一個簡單的注冊函數供應用使用。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

1.4 适配示例

适配完成所有接口函數後,定義适配接口結構體,完成函數注冊。

示例如下:

/* 适配接口結構體 */
static mic_ops_t mic_adp_ops = {
    .init = mic_adaptor_init,
    .deinit = mic_adaptor_deinit,
    .kws_control = mic_adaptor_kws_control,
    .kws_wake = mic_adaptor_kws_wake,
    .pcm_data_control = mic_adaptor_pcm_data_control,
    .pcm_aec_control = mic_adaptor_pcm_aec_control,
    .pcm_set_param = mic_adaptor_set_param,
    .pcm_get_param = mic_adaptor_get_param,
};

/* 注冊函數 */
void mic_thead_v1_register(void)
{
    mic_ops_register(&mic_adp_ops);
}
           

2. 雲服務适配指南

2.1 概述

雲服務元件提供應用與雲端ASR/NLP/TTS服務互動的接口。調用對應服務API後,元件自動完成雲端連接配接、鑒權、啟動服務的過程,使用者隻需通過接口将需識别的音頻或需合成的字元串傳入,即可獲得雲端傳回結果,裝置端隻需根據結果完成預定的應用行為。

為了減少使用者的開發成本, YoC定義了一套統一的适配接口,應用層可以用同樣的代碼在不同的雲服務之間無縫切換。

2.2 适配接口

已适配的元件:aui_aliyunnls、aui_cloud

雲服務元件的主要API如下:

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

2.3 接口說明

aui_cloud_init

int aui_cloud_init(aui_t *aui);
           

該函數用于初始化雲服務。參數aui_t結構包含的config成員用來指定語音合成的參數,包括發言人、音量、語速。适配雲端請務必參考取值範圍并進行轉換,保證多平台切換是參數不做調整也能達到預期的效果,還有nlp_cb回調函數,供使用者處理雲端傳回的資訊,ASR結果和NLP結果都使用同一個回調。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章
智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章
智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

aui_cloud_start_pcm

int aui_cloud_start_pcm(aui_t *aui);
           

啟動語音資料互動,準備上傳語音資料。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

aui_cloud_push_pcm

int aui_cloud_push_pcm(aui_t *aui, void *data, size_t size);
           

推送語音資料到雲端進行識别。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

aui_cloud_stop_pcm

int aui_cloud_stop_pcm(aui_t *aui);
           

結束語音資料推送,雲端傳回的結果通過調用nlp_cb回調函數通知應用進行處理。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

aui_cloud_push_text

int aui_cloud_push_text(aui_t *aui, char *text);
           

文本内容推送到雲端進行NLP處理。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章
智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

aui_cloud_start_tts

int aui_cloud_start_tts(aui_t *aui);
           

啟動TTS語音合成服務

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

aui_cloud_req_tts

int aui_cloud_req_tts(aui_t *aui, const char *player_fifo_name, const char *text, aui_tts_cb stat_cb);
           

向雲端發送文本資訊,請求TTS音頻資料。要求異步實作,雲端的語音資料可以直接寫入播放器的nsfifo,然後調用aui_player_play來播放語音資料。nsfifo的使用方法可參見元件

components_aliyunnls_mit_tts.c中的實作。

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章
智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

aui_cloud_stop_tts

int aui_cloud_stop_tts(aui_t *aui);
           

停止TTS語音合成服務

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

3. 語音算法适配指南

智能語音SDK将算法實作與接口分離,設計出了一套階層化得調用架構,使用者在此架構上可以友善得将自研算法移植進DSP中,利用SDK中原有得資料采集、播放、上雲通道,以實作裝置端算法得快速落地。

3.1 架構圖

智能語音元件适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第六章

• AP(Application Processor)主要負責應用開發,CP(coprocessor)用來通過處理主cpu的一些工作負荷來使操作提速的輔助處理器,如語音算法。

• IPC (Inter-Process Communication,異構多核通信)

• voice data:資料内容格式為麥克風m(m路資料)和參考聲 n(n路資料)

3.2 特性

• 适用于多核SoC,AP核負責采集及搬送資料,CP核負責離線語音識别及抛出各類事件

• 提供多種錄音資料,友善對接雲端語音處理及本地算法問題調試

• 提供LPM接口,友善低功耗管理

• 接入方式簡單,最小隻需實作資料采集及語音識别部分算法等接口

3.3 接口定義

本地算法初始化

voice_t *voice_ai_init(void *priv, voice_cts_ops_t *ops);
           

• 參數:

– priv: 使用者私有資料

– ops: ai算法實作

• 傳回值:

– 0: 成功 非0:失敗

typedef struct __voice_cts_ops {
    int (*init)(void *priv);
    int (*deinit)(void *priv);
    int (*aec)(void *priv, void *mic, void *ref, int ms, void *out); //aec算法實作
    int (*vad)(void *priv, void *mic, void *ref, int ms, void *out); //vad算法實作
    int (*kws)(void *priv, void *mic, void *ref, int ms, void *out); //kws算法實作
    int (*asr)(void *priv, void *vad_data, int ms); //asr算法實作
} voice_cts_ops_t;           

初始化及去初始化

voice_t *voice_init(voice_evt_t cb, void *priv);
void voice_deinit(voice_t *v);
           

– cb: voice事件

– priv: 使用者私有數

– v: voice 句柄

typedef void (*voice_evt_t)(void *priv, voice_evt_id_t evt_id, void *data, int len);
typedef enum {
    VOICE_ASR_EVT,//asr事件
    VOICE_SILENCE_EVT,//斷句事件
    VOICE_DATA_EVT//回流資料到達事件
} voice_evt_id_t;           

參數配置

int voice_config(voice_t *v, voice_param_t *p);
           

– p: voice參數

typedef struct {
    int cts_ms;//ai算法每次資料大小,機關(ms)
    int ipc_mode;//與ai算法側的通信方式,1:ipc
} voice_param_t;           

拾音參數配置

int voice_add_mic(voice_t *v, voice_pcm_param_t *p);
int voice_add_ref(voice_t *v, voice_pcm_param_t *p);           

初始化ai算法子產品

– p:pcm參數

typedef struct {
    char            *pcm_name; //pcm裝置名
    unsigned int     rate;//采樣率
    int              sample_bits;//采樣位數
    int              access;//是否為交錯模式,0:非交錯 1:交錯
    int              channles;//通道總數
    int              channles_sum;//通道總數
    int              period_bytes;//pcm周期資料量(使用者不必配置)
} voice_pcm_param_t;
           

啟動(停止)本地算法

int voice_start(voice_t *v);
int voice_stop(voice_t *v);
           

資料回流控制

int voice_backflow_control(voice_t *v, voice_backflow_id_t id, int flag);
           

– id:資料類型

– flag: 0:關閉回流,1:打開回流

typedef enum {
    VOICE_MIC_DATA,//mic資料
    VOICE_REF_DATA,//ref資料
    VOICE_VAD_DATA,//vad後資料
    VOICE_AEC_DATA,//aec後資料

    VOCIE_BACKFLOW_DATA
} voice_backflow_id_t;
           

繼續閱讀