今天,我們來研究樂鑫的語音助手框架ESP-Skainet其中的中文語音合成的例程。
編譯原例程
-
首先需要clone例程
git clone --recursive https://github.com/espressif/esp-skainet.git
該工程內(nèi)部自帶一個idf,是運行的最佳版本,不過你任然可以使用自己的idf。
-
進入例程中
cd esp-skainet/examples/chinese_tts
-
理論上設(shè)置好了芯片型號為esp32s3后自動調(diào)用sdkconfig.defaults.esp32s3配置文件。 但是實際上好像沒有,所以這里加一個步驟確保能使用上默認配置。
cp sdkconfig.defaults.esp32s3 sdkconfig.defaults
-
設(shè)置芯片為esp32s3
idf.py set-target esp32s3
-
進入menuconfig
idf.py menuconfig
修改Audio Media Hal -> Audio Hardware board 改成ESP32-S3-Korvo-1
-
編譯燒錄程序
idf.py flash monitor -p /dev/ttyUSB0
運行原例程
運行后,可以看到如下打印
歡迎使用樂鑫語音合成
I (266) tts_parser: unicode:0x6b22 -> huan1
I (266) tts_parser: unicode:0x8fce -> ying2
I (276) tts_parser: unicode:0x4f7f -> shi3
I (276) tts_parser: unicode:0x7528 -> yong4
I (286) tts_parser: unicode:0x4e50 -> le4
I (286) tts_parser: unicode:0x946b -> xin1
I (296) tts_parser: unicode:0x8bed -> yu3
I (296) tts_parser: unicode:0x97f3 -> yin1
I (306) tts_parser: unicode:0x5408 -> he2
I (306) tts_parser: unicode:0x6210 -> cheng2
請輸入短語:
簡化原例程并分析
原例程大致分為兩個功能,第一個功能是閱讀“樂鑫語音合成”這句話,還有一個功能是朗讀串口輸入的文字。 第二部分經(jīng)常會有bug,所以咱們簡化例程,重心分析第一個功能。簡化例程如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_tts.h"
#include "esp_tts_voice_xiaole.h"
#include "esp_board_init.h"
int app_main()
{
ESP_ERROR_CHECK(esp_board_init(AUDIO_HAL_16K_SAMPLES, 1, 16)); // 初始化codec芯片,配置好采樣率、聲道數(shù)、采樣大小
esp_tts_voice_t *voice = (esp_tts_voice_t *)&esp_tts_voice_xiaole; // 配置tts的聲音配置文件,來自libvoice_set_xiaole
esp_tts_handle_t *tts_handle = esp_tts_create(voice); // 創(chuàng)建tts對象
char *prompt1 = "你好我是啟明云端"; // 需要轉(zhuǎn)換的文字
if (esp_tts_parse_chinese(tts_handle, prompt1)) // 文字解析成拼音
{
int len[1] = {0};
do
{
short *pcm_data = esp_tts_stream_play(tts_handle, len, 3); // 拼音轉(zhuǎn)換成pcm音頻
esp_audio_play(pcm_data, len[0] * 2, portMAX_DELAY); //播放音頻
} while (len[0] > 0);
}
esp_tts_stream_reset(tts_handle); // 重置 tts 流并清除 TTS 實例的所有緩存
return 0;
}
這里音頻的tts來自靜態(tài)庫libvoice_set_xiaole中,目前也只有這一個音色可供使用,其余的tts相關(guān)函數(shù)則是屬于靜態(tài)庫libesp_tts_chinese。
總結(jié)
tts過度封裝化,一定程度上注定它的使用難度不高。但是依據(jù)已跑完的例程來看,音頻任然有發(fā)音聲音的問題,對于現(xiàn)在的一些成熟的tts方案,樂鑫的這個tts還有一定的差距,這個缺點可能導(dǎo)致無法應(yīng)用于商業(yè)化項目中。項目中如果涉及到語音轉(zhuǎn)文字的內(nèi)容,一方面可以通過云平臺的提供的API能力發(fā)送文字收取PCM音頻來解決。另一方面如果是有限的詞匯,也可以用語音拼接的方式,把相應(yīng)的音頻存到文件系統(tǒng)中,通過映射播放指定的內(nèi)容并拼湊成一段完整的語句。例如:“支付寶收款”、“元”、“個”、“十”、“百”、“千”、“萬”這幾段文字的語音就基本可以通過拼湊音頻達到支付寶語音播報功能。
|