音合成:AutoDL 云端部署與本地 TTS 配置實(shí)戰(zhàn))
xiaozhi-esp32-server 接入 Fish Speech 語(yǔ)音合成AutoDL 云端部署與本地 TTS 配置實(shí)戰(zhàn)【免費(fèi)下載鏈接】xiaozhi-esp32-server本項(xiàng)目為xiaozhi-esp32提供后端服務(wù)幫助您快速搭建ESP32設(shè)備控制服務(wù)器。Backend service for xiaozhi-esp32, helps you quickly build an ESP32 device control server.項(xiàng)目地址: https://gitcode.com/gh_mirrors/xia/xiaozhi-esp32-server導(dǎo)讀本文基于 docs/fish-speech-integration.md 編寫(xiě)完整講解如何在 AutoDL 云服務(wù)器上從零部署 Fish Speech 開(kāi)源語(yǔ)音合成服務(wù)并將其接入 xiaozhi-esp32-server 的 TTS 模塊讓 ESP32 設(shè)備用上自托管、可克隆音色的中文語(yǔ)音合成能力。讀完本文你將掌握AutoDL 實(shí)例的鏡像選擇與學(xué)術(shù)加速設(shè)置、Fish Speech 的依賴安裝與模型下載、api_server接口的啟動(dòng)與端口轉(zhuǎn)發(fā)、以及 xiaozhi-esp32-server 中FishSpeech提供方的完整配置方法與底層調(diào)用原理。一、方案總覽為什么用 Fish SpeechFish Speech 是 Fish Audio 開(kāi)源的高質(zhì)量語(yǔ)音合成TTS模型核心能力是基于參考音頻reference audio 參考文本reference text的上下文學(xué)習(xí)in-context learning進(jìn)行聲音克隆只需一段數(shù)秒的音頻樣本即可合成出相似音色的語(yǔ)音。在 xiaozhi-esp32-server 的 TTS 生態(tài)中FishSpeech屬于自托管型提供方它不依賴任何商業(yè)云廠商的 TTS API而是把推理服務(wù)運(yùn)行在你自己控制的 GPU 機(jī)器如 AutoDL上通過(guò)標(biāo)準(zhǔn)的 HTTP 接口對(duì)外提供/v1/tts服務(wù)xiaozhi-esp32-server 側(cè)僅需配置api_url即可調(diào)用。相比云端商業(yè) TTS這種方案的優(yōu)勢(shì)在于音色完全由你掌控、支持本地參考音頻克隆、無(wú)按次計(jì)費(fèi)限制非常適合需要定制音色的私有化部署場(chǎng)景。該提供方位于 core/providers/tts/fishspeech.py通過(guò)core/utils/tts.py中的工廠函數(shù)create_instance按type: fishspeech動(dòng)態(tài)加載與 config.yaml 中預(yù)置的配置節(jié)一一對(duì)應(yīng)。二、AutoDL 云端部署 Fish Speech 服務(wù)2.1 租用實(shí)例與鏡像選擇登錄 AutoDL 控制臺(tái)租用一臺(tái) GPU 實(shí)例。鏡像選擇PyTorch / 2.1.0 / 3.10(ubuntu22.04) / cuda 12.1該鏡像自帶 PyTorch 2.1.0、Python 3.10Ubuntu 22.04與 CUDA 12.1 運(yùn)行環(huán)境與 Fish Speech 官方推薦的依賴版本兼容。2.2 設(shè)置學(xué)術(shù)加速并拉取項(xiàng)目機(jī)器開(kāi)機(jī)后首先開(kāi)啟學(xué)術(shù)加速用于加速訪問(wèn) GitHub 等外部資源source /etc/network_turbo進(jìn)入工作目錄AutoDL 數(shù)據(jù)盤cd autodl-tmp/克隆 Fish Speech 官方倉(cāng)庫(kù)并進(jìn)入項(xiàng)目目錄git clone https://gitclone.com/github.com/fishaudio/fish-speech.git ; cd fish-speech說(shuō)明gitclone.com是國(guó)內(nèi)常用的 GitHub 加速鏡像地址。如果你所在的網(wǎng)絡(luò)環(huán)境可以直連 GitHub也可以直接使用官方倉(cāng)庫(kù)地址https://github.com/fishaudio/fish-speech.git。2.3 安裝依賴以可編輯模式安裝項(xiàng)目依賴會(huì)安裝到當(dāng)前 Python 環(huán)境pip install -e.如果安裝過(guò)程中報(bào)錯(cuò)通常是因?yàn)槿鄙賞ortaudio開(kāi)發(fā)庫(kù)PyAudio 等音頻庫(kù)的編譯依賴執(zhí)行apt-get install portaudio19-dev -y安裝完成后重新執(zhí)行pip install -e.即可。2.4 重裝指定版本的 PyTorch為與 CUDA 12.1 及模型運(yùn)行環(huán)境嚴(yán)格匹配官方流程要求顯式重裝 PyTorch 2.3.1 全家桶注意實(shí)例鏡像自帶的是 2.1.0這里升級(jí)到 2.3.1指定 cu121 的 wheel 源pip install torch2.3.1 torchvision0.18.1 torchaudio2.3.1 --index-url https://download.pytorch.org/whl/cu121版本匹配說(shuō)明torchvision0.18.1與torchaudio2.3.1是 torch 2.3.1 對(duì)應(yīng)的配套版本三者必須一致否則可能出現(xiàn)算子不匹配或運(yùn)行時(shí)崩潰。2.5 下載模型權(quán)重進(jìn)入tools目錄并運(yùn)行官方下載腳本cd tools python download_models.py該腳本會(huì)自動(dòng)下載 Fish Speech 推理所需的模型權(quán)重包括 VQGAN、LLAMA 語(yǔ)音語(yǔ)言模型等。下載耗時(shí)取決于網(wǎng)絡(luò)狀況請(qǐng)耐心等待其完成。2.6 啟動(dòng) HTTP 接口服務(wù)模型下載完成后啟動(dòng)官方提供的 API 服務(wù)監(jiān)聽(tīng)所有網(wǎng)卡地址的 6006 端口python -m tools.api_server --listen 0.0.0.0:6006啟動(dòng)成功后服務(wù)會(huì)在0.0.0.0:6006上提供/v1/tts等接口即 xiaozhi-esp32-server 將要調(diào)用的 TTS 端點(diǎn)。2.7 配置端口轉(zhuǎn)發(fā)自定義服務(wù)由于 AutoDL 實(shí)例不直接對(duì)外暴露端口需要在 AutoDL 控制臺(tái)開(kāi)啟端口轉(zhuǎn)發(fā)打開(kāi) AutoDL 實(shí)例列表頁(yè)面https://autodl.com/console/instance/list找到剛才啟動(dòng)的機(jī)器點(diǎn)擊自定義服務(wù)按鈕開(kāi)啟端口轉(zhuǎn)發(fā)服務(wù)將實(shí)例內(nèi)6006端口映射到本地端口轉(zhuǎn)發(fā)配置完成后在本地電腦瀏覽器訪問(wèn)http://localhost:6006/即可看到 Fish Speech 的 API 服務(wù)預(yù)覽頁(yè)說(shuō)明服務(wù)已可以通過(guò)本地端口訪問(wèn)。部署驗(yàn)證提示訪問(wèn)http://localhost:6006/docs若服務(wù)啟用 Swagger 文檔可以直接在頁(yè)面上發(fā)起一次 TTS 請(qǐng)求用于驗(yàn)證模型推理與端口轉(zhuǎn)發(fā)是否正常再進(jìn)行下一步的服務(wù)器端配置。三、xiaozhi-esp32-server 端核心配置3.1 最小可用配置單模塊部署在 config.yaml 中FishSpeech提供方已經(jīng)預(yù)置了完整配置。單模塊部署時(shí)核心配置如下selected_module: TTS: FishSpeech TTS: FishSpeech: reference_audio: [config/assets/wakeup_words.wav,] reference_text: [哈啰啊我是小智啦聲音好聽(tīng)的臺(tái)灣女孩一枚超開(kāi)心認(rèn)識(shí)你耶最近在忙啥別忘了給我來(lái)點(diǎn)有趣的料哦我超愛(ài)聽(tīng)八卦的啦,] api_key: 123 api_url: http://127.0.0.1:6006/v1/tts配置修改完成后重啟 xiaozhi-esp32-server 服務(wù)即可生效。逐項(xiàng)說(shuō)明selected_module.TTS指定全局 TTS 提供方為FishSpeech。初始化時(shí) modules_initialize.py 會(huì)根據(jù)selected_module[TTS]從config[TTS]取出對(duì)應(yīng)配置節(jié)并交給 tts.py 的create_instance動(dòng)態(tài)實(shí)例化。reference_audio參考音頻路徑列表用于聲音克隆的樣本音頻。reference_text與參考音頻一一對(duì)應(yīng)的參考文本須是參考音頻中真實(shí)說(shuō)出的話。api_key接口鑒權(quán)密鑰。Fish Speech 的api_server默認(rèn)對(duì) key 校驗(yàn)較為寬松隨意填寫(xiě)一個(gè)字符串即可但不能缺失源碼會(huì)做 key 檢查見(jiàn)下文。api_urlFish Speech 服務(wù)的 TTS 端點(diǎn)地址。若 xiaozhi-esp32-server 與 Fish Speech 同機(jī)運(yùn)行填http://127.0.0.1:6006/v1/tts若 Fish Speech 部署在其他機(jī)器則改為該機(jī)器的實(shí)際 IP 與端口。3.2 完整配置參數(shù)參考默認(rèn)值一覽config.yaml 中預(yù)置的完整配置如下各項(xiàng)含義與默認(rèn)值均可在 fishspeech.py 的TTSProvider.__init__中找到對(duì)應(yīng)實(shí)現(xiàn)TTS: FishSpeech: type: fishspeech output_dir: tmp/ response_format: wav reference_id: null reference_audio: [config/assets/wakeup_words.wav,] reference_text: [哈啰啊我是小智啦聲音好聽(tīng)的臺(tái)灣女孩一枚超開(kāi)心認(rèn)識(shí)你耶最近在忙啥別忘了給我來(lái)點(diǎn)有趣的料哦我超愛(ài)聽(tīng)八卦的啦,] normalize: true max_new_tokens: 1024 chunk_length: 200 top_p: 0.7 repetition_penalty: 1.2 temperature: 0.7 streaming: false use_memory_cache: on seed: null channels: 1 rate: 44100 api_key: 你的api_key api_url: http://127.0.0.1:8080/v1/tts參數(shù)默認(rèn)值說(shuō)明typefishspeech提供方類型標(biāo)識(shí)工廠函數(shù)據(jù)此加載core/providers/tts/fishspeech.pyoutput_dirtmp/TTS 音頻文件的輸出目錄僅非刪除模式時(shí)生成文件response_formatwav返回音頻格式支持wav、pcm、mp3對(duì)應(yīng)服務(wù)端ServeTTSRequest.formatreference_idnullFish Audio 云端音色 ID使用本地參考音頻時(shí)保持null傳入官方示例 ID 時(shí)可用云端音色reference_audio見(jiàn)上參考音頻路徑列表支持;分隔字符串或列表見(jiàn)parse_string_to_listreference_text見(jiàn)上參考文本列表與參考音頻一一對(duì)應(yīng)normalizetrue是否對(duì)文本做歸一化對(duì)中英文數(shù)字等穩(wěn)定性有幫助max_new_tokens1024單次生成的最大 token 數(shù)chunk_length200分塊長(zhǎng)度服務(wù)端約束范圍 100–300top_p0.7采樣參數(shù)服務(wù)端約束范圍 0.1–1.0repetition_penalty1.2重復(fù)懲罰服務(wù)端約束范圍 0.9–2.0temperature0.7采樣溫度服務(wù)端約束范圍 0.1–1.0streamingfalse是否使用流式合成use_memory_cacheon服務(wù)端記憶緩存開(kāi)關(guān)on/offseednull隨機(jī)種子固定后可復(fù)現(xiàn)同一次合成結(jié)果channels1音頻聲道數(shù)rate44100音頻采樣率api_key—接口鑒權(quán)密鑰check_model_key會(huì)攔截含你字的未填寫(xiě)占位值api_urlhttp://127.0.0.1:8080/v1/ttsFish Speech 服務(wù) TTS 端點(diǎn)3.3 配置加載與參數(shù)解析的底層實(shí)現(xiàn)理解這些參數(shù)如何生效有助于排查問(wèn)題工廠加載core/utils/tts.py的create_instance會(huì)檢查core/providers/tts/下是否存在與class_name同名的.py文件存在則動(dòng)態(tài)importlib.import_module并實(shí)例化其中的TTSProvider因此type: fishspeech精確對(duì)應(yīng) fishspeech.py。鍵檢查check_model_key(FishSpeech TTS, self.api_key)見(jiàn) util.py會(huì)檢測(cè) api_key 是否包含你字——即配置模板中的占位符——從而在啟動(dòng)時(shí)直接給出API key 未設(shè)置的明確報(bào)錯(cuò)。列表解析reference_audio/reference_text經(jīng)parse_string_to_listutil.py處理兼容 YAML 列表與;分隔字符串兩種寫(xiě)法。類型兜底channels、rate、max_new_tokens、chunk_length、top_p、temperature、repetition_penalty等均對(duì)空字符串做了兜底處理缺省時(shí)回落為默認(rèn)值見(jiàn) fishspeech.py。四、請(qǐng)求協(xié)議與調(diào)用鏈路4.1 客戶端請(qǐng)求構(gòu)造TTSProvider.text_to_speakfishspeech.py是核心調(diào)用方法它做了三件事讀取參考音頻與參考文本audio_to_bytes將參考音頻文件讀為二進(jìn)制read_ref_text支持直接傳文本字符串或文本文件路徑兩者按序配對(duì)組裝成references列表。構(gòu)造請(qǐng)求體將text、references、reference_id、normalize、format、max_new_tokens、chunk_length、top_p、repetition_penalty、temperature、streaming、use_memory_cache、seed全部打包進(jìn)ServeTTSRequestPydantic 模型字段約束與服務(wù)端一致見(jiàn) fishspeech.py。發(fā)送 HTTP 請(qǐng)求以ormsgpackMessagePack序列化請(qǐng)求體請(qǐng)求頭攜帶Authorization: Bearer {api_key}與Content-Type: application/msgpackPOST 到api_url成功后把返回的音頻字節(jié)流寫(xiě)入output_file或直接返回。4.2 音頻回傳鏈路合成出的音頻字節(jié)流返回后進(jìn)入 base.py 基類定義的播放鏈路to_tts_stream或to_tts會(huì)按delete_audio全局配置決定直接轉(zhuǎn)音頻流還是落盤后流轉(zhuǎn)隨后audio_bytes_to_data_stream/audio_to_opus_data_stream將音頻重采樣并編碼為 Opus經(jīng)tts_audio_queue交給_audio_play_priority_thread消費(fèi)線程最終通過(guò)sendAudioMessage推送給 ESP32 設(shè)備播放見(jiàn) base.py 與 base.py。因此服務(wù)端返回的采樣率默認(rèn) 44100 Hz、單聲道與本機(jī)conn.sample_rate不一致時(shí)也會(huì)在數(shù)據(jù)流轉(zhuǎn)換階段統(tǒng)一處理。五、常見(jiàn)問(wèn)題排查啟動(dòng)報(bào)錯(cuò) FishSpeech TTS 的 API key 未設(shè)置api_key仍保留著配置模板中的你的api_key占位文本被check_model_key攔截改為任意非占位字符串如123即可。create_instance拋出 不支持的TTS類型說(shuō)明TTS.FishSpeech.type未設(shè)置為fishspeech或core/providers/tts/fishspeech.py文件缺失請(qǐng)核對(duì)type: fishspeech。本地?zé)o法訪問(wèn)localhost:6006確認(rèn) AutoDL 控制臺(tái)的自定義服務(wù)端口轉(zhuǎn)發(fā)已開(kāi)啟、實(shí)例內(nèi)api_server監(jiān)聽(tīng)的是0.0.0.0:6006而非僅回環(huán)地址。pip install -e.報(bào)編譯錯(cuò)誤多為缺少portaudio19-dev所致執(zhí)行apt-get install portaudio19-dev -y后重試。合成失敗/返回非 200text_to_speak會(huì)打印響應(yīng)狀態(tài)碼與服務(wù)端返回的 JSON 錯(cuò)誤信息fishspeech.py據(jù)此檢查參考音頻路徑是否有效、參考文本是否與音頻內(nèi)容一致、服務(wù)端模型是否已加載完成。聲音不像/音質(zhì)異常優(yōu)先檢查reference_audio與reference_text是否嚴(yán)格對(duì)應(yīng)參考文本必須是參考音頻中實(shí)際說(shuō)出的內(nèi)容并適當(dāng)增加參考音頻的清晰度與時(shí)長(zhǎng)。六、延伸參考完整集成教程原文檔docs/fish-speech-integration.md提供方源碼core/providers/tts/fishspeech.py配置預(yù)置節(jié)config.yamlTTS 工廠加載core/utils/tts.py模塊初始化鏈路core/utils/modules_initialize.pyTTS 基類與音頻流轉(zhuǎn)core/providers/tts/base.py若希望在同一實(shí)例上同時(shí)部署推理服務(wù)與使用其他 TTS 提供方可參考 docs/paddlespeech-deploy.md 了解同類自托管 TTS 的部署思路【免費(fèi)下載鏈接】xiaozhi-esp32-server本項(xiàng)目為xiaozhi-esp32提供后端服務(wù)幫助您快速搭建ESP32設(shè)備控制服務(wù)器。Backend service for xiaozhi-esp32, helps you quickly build an ESP32 device control server.項(xiàng)目地址: https://gitcode.com/gh_mirrors/xia/xiaozhi-esp32-server創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考