語音大模型速覽(三)- cosyvoice2

CosyVoice 2: Scalable Streaming Speech Synthesis with Large Language Models

  • 論文鏈接:https://arxiv.org/pdf/2412.10117
  • 代碼鏈接:https://github.com/FunAudioLLM/CosyVoice

一句話總結

CosyVoice 2 是一款改進的流式語音合成模型,其核心創新包括采用有限標量量化(FSQ) 提升語音令牌的碼本利用率,簡化文本 - 語音語言模型架構以直接使用預訓練大語言模型(如 Qwen2.5-0.5B)作為骨干,以及開發塊感知因果流匹配模型,實現單一模型支持流式和非流式合成。通過在大規模多語言數據集(中文 130,000 小時、英文 30,000 小時等)上訓練,該模型達到人類 parity 自然度,流式模式下響應延遲極低且合成質量幾乎無損,在內容一致性(WER 低至 2.45%)、 speaker 相似度(最高 0.812)和語音質量(NMOS 達 3.96)上表現優異,同時支持情感、口音等精細指令控制。

在這里插入圖片描述

模型結構

在這里插入圖片描述

核心創新

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

實驗數據

在這里插入圖片描述

核心代碼塊解讀

語音token和文本token是如何兼容輸入的

cosyvoice/llm/llm.py

@torch.inference_mode()def inference(self,text: torch.Tensor,text_len: torch.Tensor,prompt_text: torch.Tensor,prompt_text_len: torch.Tensor,prompt_speech_token: torch.Tensor,prompt_speech_token_len: torch.Tensor,embedding: torch.Tensor,sampling: int = 25,max_token_text_ratio: float = 20,min_token_text_ratio: float = 2,uuid: str = '',) -> Generator[torch.Tensor, None, None]:device = text.devicetext = torch.concat([prompt_text, text], dim=1)print('text: ', text.shape, )text_len += prompt_text_lentext = self.llm.model.model.embed_tokens(text)# 3. concat llm_inputsos_eos_emb = self.llm_embedding.weight[self.sos_eos].reshape(1, 1, -1)task_id_emb = self.llm_embedding.weight[self.task_id].reshape(1, 1, -1)if prompt_speech_token_len != 0:prompt_speech_token_emb = self.speech_embedding(prompt_speech_token)else:prompt_speech_token_emb = torch.zeros(1, 0, self.llm_input_size, dtype=text.dtype).to(device)lm_input = torch.concat([sos_eos_emb, text, task_id_emb, prompt_speech_token_emb], dim=1)# 4. cal min/max_lengthmin_len = int((text_len - prompt_text_len) * min_token_text_ratio)max_len = int((text_len - prompt_text_len) * max_token_text_ratio)# 5. step by step decodefor token in self.inference_wrapper(lm_input, sampling, min_len, max_len, uuid):yield token

主要內容:

  1. 把prompt文本和輸入文本拼接
    text = torch.concat([prompt_text, text], dim=1)
  2. 文本embedding映射 text = self.llm.model.model.embed_tokens(text)
  3. speech prompt token 映射:
    prompt_speech_token_emb = self.speech_embedding(prompt_speech_token)
  4. token embedding映射后拼接:
    lm_input = torch.concat([sos_eos_emb, text, task_id_emb, prompt_speech_token_emb], dim=1)
  5. 輸入到模型中,做 Next token prediction

怎么在 text prompt 里面做 instruct 的

cosyvoice/cli/frontend.py

def frontend_instruct2(self, tts_text, instruct_text, prompt_speech_16k, resample_rate, zero_shot_spk_id):model_input = self.frontend_zero_shot(tts_text, instruct_text + '<|endofprompt|>', prompt_speech_16k, resample_rate, zero_shot_spk_id)del model_input['llm_prompt_speech_token']del model_input['llm_prompt_speech_token_len']return model_input

做法非常樸素,就是直接把 instruct_text + '<|endofprompt|>' 作為 prompt text 輸入。值得注意的是,這種情況下,llm_prompt_speech_token 是會被刪除的,那么如果音色和semantic token 不解耦的情況下,是否會導致一些音色不相似問題。

如何做文本音頻混合流式

在這里插入圖片描述

def prepare_lm_input_target(self, text_token, text_token_emb, text_token_len, speech_token, speech_token_emb, speech_token_len):lm_target, lm_input = [], []text_token = unpad_sequence(text_token, text_token_len.cpu(), batch_first=True)speech_token = unpad_sequence(speech_token, speech_token_len.cpu(), batch_first=True)text_token_emb = unpad_sequence(text_token_emb, text_token_len.cpu(), batch_first=True)speech_token_emb = unpad_sequence(speech_token_emb, speech_token_len.cpu(), batch_first=True)for i in range(len(text_token)):# bistream sequenceif random.random() < 0.5 and speech_token_len[i] / text_token_len[i] > self.mix_ratio[1] / self.mix_ratio[0]: # 滿足音頻大于text的倍數長度關系this_lm_target, this_lm_input = [], []this_lm_target.append(IGNORE_ID)this_lm_input.append(self.llm_embedding.weight[self.sos_eos].reshape(1, -1))for j in range(((text_token_len[i] + 1) / self.mix_ratio[0]).ceil().int().item()):this_text_token = text_token[i][j * self.mix_ratio[0]: (j + 1) * self.mix_ratio[0]].tolist()    # 每mix_radio(5)個文本token切成一個塊this_speech_token = speech_token[i][j * self.mix_ratio[1]: (j + 1) * self.mix_ratio[1]].tolist()    # 每mix_radio(15)個語音token切成一個塊if len(this_text_token) == self.mix_ratio[0]:assert len(this_speech_token) == self.mix_ratio[1]this_lm_target += [IGNORE_ID] * (self.mix_ratio[0] - 1)this_lm_target += this_speech_token # target: ignore_id * (5-1) + 15個語音tokenthis_lm_target.append(self.speech_token_size + 2)   # target: + eosthis_lm_input.append(text_token_emb[i][j * self.mix_ratio[0]: (j + 1) * self.mix_ratio[0]]) # input: 5個文本token對應的embeddingthis_lm_input.append(speech_token_emb[i][j * self.mix_ratio[1]: (j + 1) * self.mix_ratio[1]])  # input: + 15個語音token對應的embeddingelse:# 處理最后一個文本token不足5個的情況this_lm_target += [-1] * len(this_text_token)this_lm_target += speech_token[i][j * self.mix_ratio[1]:].tolist()this_lm_target.append(self.speech_token_size)this_lm_input.append(text_token_emb[i][j * self.mix_ratio[0]:])this_lm_input.append(self.llm_embedding.weight[self.task_id].reshape(1, -1))this_lm_input.append(speech_token_emb[i][j * self.mix_ratio[1]:])# 整體上target是token, input是embeddingthis_lm_target, this_lm_input = torch.tensor(this_lm_target), torch.concat(this_lm_input, dim=0)# unistream sequenceelse:this_lm_target = torch.tensor([IGNORE_ID] * (1 + text_token_len[i]) + speech_token[i].tolist() + [self.speech_token_size])this_lm_input = torch.concat([self.llm_embedding.weight[self.sos_eos].reshape(1, -1), text_token_emb[i],self.llm_embedding.weight[self.task_id].reshape(1, -1), speech_token_emb[i]], dim=0)lm_target.append(this_lm_target)lm_input.append(this_lm_input)lm_input_len = torch.tensor([i.size(0) for i in lm_input], dtype=torch.int32)lm_input = pad_sequence(lm_input, batch_first=True, padding_value=IGNORE_ID)lm_target = pad_sequence(lm_target, batch_first=True, padding_value=IGNORE_ID)return lm_target, lm_input, lm_input_len

cosyvoice/llm/llm.py

chunk aware flow-matching

在這里插入圖片描述
兩個核心點:

  1. 由于 semantic token 到 mel 的映射使用的是因果的 transformer(即只能看到之前的信息,用 mask 實現的),所以可以用過 mask 來控制因果長度,即上圖提到的 chunk mask
  2. 由于 flow-matching 需要多步計算,直接把 unet 做成多次循環,看為多步計算。

遺留問題

  • instruct text 和 prompt text 的混用,只用 <|endofprompt|> 標識做區分,模型會混淆嗎?而且,llm_prompt_speech_token 被刪除,會導致音色一致性變差嗎?(根本的問題是 semantic token 是否能跟音色完全解耦),這種設計是否需要優化,或者在訓練模式上是否需要調整。
  • 文本和音頻按N:M的比例混合訓練,這種方式是否是比較合理的方式,因為N:M不能保證音頻和文本token一定對應,這是個問題。有沒有更好的設計方式?
  • chunk flow-matching 的訓練設計比較麻煩,整體上有沒有更簡潔的方案?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89368.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89368.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89368.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

-lstdc++與-static-libstdc++的用法和差異

CMakeLists.txt 里寫了&#xff1a; target_link_libraries(${PROJECT_NAME} PRIVATEgccstdc ) target_link_options(${PROJECT_NAME} PRIVATE -static-libstdc)看起來像是“鏈接了兩次 C 標準庫”&#xff0c;其實它們的作用完全不同&#xff1a;1. target_link_libraries(...…

Redis學習其二(事務,SpringBoot整合,持久化RDB和AOF)

文章目錄5,事務5.1Redis 事務不保證原子性的原因5.2事務操作過程5.3監控6,SpringBoot整合Redis6.1Redis客戶端6.1.1Jedis簡單使用6.1.2Lettuce&Jedis6.2配置相關6.3使用6.3.1使用RedisTemplate6.3.2Redis工具類7,持久化RDB7.1RDB持久化原理7.2觸發機制save命令flushall命令…

springboot項目部署到K8S

java后臺 創建harbor鏡像拉取Secret&#xff1a;kubectl create secret docker-registry harbor-regcred \--docker-server \ #harbor倉庫地址--docker-username \ #harbor 賬號--docker-password \ #harbor密碼-n productionDockerfile FROM *harbor地址*/library/custom-jdk…

【FPGA開發】一文輕松入門Modelsim的基本操作

Modelsim仿真的步驟 &#xff08;1&#xff09;創建新的工程。 &#xff08;2&#xff09;在彈出的窗口中&#xff0c;確定項目名和工作路徑&#xff0c;庫保持為work不變(如有需要可以根據需求進行更改)。 &#xff08;3&#xff09;添加已經存在的文件&#xff08;rtl代碼和t…

服務攻防-Java組件安全FastJson高版本JNDI不出網C3P0編碼繞WAF寫入文件CI鏈

服務攻防-Java組件安全&FastJson&高版本JNDI&不出網C3P0&編碼繞WAF&寫入文件CI鏈26天 原創 朝陽 Sec朝陽 2025年07月18日 09:23 湖北 標題已修改 演示環境&#xff1a; https://github.com/lemono0/FastJsonParty FastJson全版本Docker漏洞環境(涵蓋1.…

【Python】DRF核心組件詳解:Mixin與Generic視圖

在 Django REST Framework (DRF) 中&#xff0c;mixins.CreateModelMixin、mixins.ListModelMixin、GenericAPIView 和 GenericViewSet 是構建 API 視圖的核心組件。以下是對這些組件的主要方法及其職責的簡要說明&#xff0c;內容清晰且結構化&#xff1a;1. mixins.CreateMod…

HTML+CSS+JS基礎

文章目錄&#xff08;一&#xff09;html1.常見標簽&#xff08;1&#xff09;注釋&#xff08;2&#xff09;標題 h1~h6&#xff08;3&#xff09;段落 p&#xff08;4&#xff09;換行與空格 br \ &#xff08;5&#xff09;格式化標簽 b i s u&#xff08;6&#xff09;…

Vue導出Html為Word中包含圖片在Microsoft Word顯示異常問題

問題背景 碰到一個問題&#xff1a;將包含圖片和SVG數學公式的HTML內容導出為Word文檔時&#xff0c;將圖片都轉為ase64格式導出&#xff0c;在WPS Word中顯示正常&#xff0c;但是在Microsoft Word中出現圖片示異常。具體問題表現 WPS兼容性&#xff1a;在WPS中顯示正常&#…

橢圓曲線密碼學 Elliptic Curve Cryptography

密碼學是研究在存在對抗行為的情況下還能安全通信的技術。即算法加密信息&#xff0c;再算法解密出信息。加密分為兩類 1. Symmetric-key Encryption (secret key encryption) 即一種密鑰&#xff0c;加密和解密使用同一密鑰&#xff0c;可相互轉換 2. Asymmetric-key Encry…

wedo牛-----第47節(免費分享圖紙)

夸克網盤&#xff1a;https://pan.quark.cn/s/4b40a8d18979 高清圖紙源文件&#xff0c;需要的請自取

Unity | AmplifyShaderEditor插件基礎(第十集:噪聲的種類+火焰制作-下)

目錄 一、&#x1f44b;&#x1f3fb;前言 二、圓火焰 三、制作梯度 梯度成品預覽 1.GradientSample節點 2.gradient的用法 3.time節點 四、添加顏色 Color節點 五、火焰搖擺 1.X方向的移動 2.Y方向的移動 3.Z方向的移動 4.把xyz組合起來 Panner節點 六、擺放和…

黑馬Node.js全套入門教程,nodejs新教程含es6模塊化+npm+express+webpack+promise等_ts對象筆記

1.1 什么是運行環境&#xff1f; 運行環境是指代碼正常運行所需的必要環境&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; V8引擎負責解析和執行JavaScript代碼。內置API是由運行環境提供的特殊接口&#xff0c;只能在所屬的運行環境中被調用 1.2 JavaScrip…

React 項目環境變量使用指南

在 React 項目中正確使用環境變量是管理不同環境配置的關鍵技術。以下是完整的解決方案&#xff1a; 1. 創建環境變量文件 React 項目支持以下環境變量文件&#xff08;按優先級從高到低&#xff09;&#xff1a; .env.development.local (本地開發環境).env.development (開發…

Oracle 關于一些連接故障的總結

積累了幾次Oracle客戶端連接故障&#xff0c;做下總結。 文章目錄1、案例案例1&#xff1a;客戶端連接報錯ORA-12514案例2&#xff1a;客戶端連接報錯ORA-28547案例3&#xff1a;客戶端連接報錯&#xff1a;Got minus one from a read call案例4&#xff1a;客戶端連接報錯&…

V-USB USB設備模擬原理分析

V-USB USB設備模擬原理分析 通過分析V-USB項目的核心文件&#xff0c;詳細解釋這個項目是如何在AVR微控制器上模擬USB設備的&#xff1a; 1. 整體架構 V-USB是一個純軟件實現的USB低速設備驅動&#xff0c;主要由以下幾個核心文件組成&#xff1a; usbdrv.c : USB協議棧的C語言…

kafka3.6下載安裝(傳統架構/KRaft模式)+實例測試

知識補充&#xff1a; Kafka 和 ZooKeeper 的關系可以用 “協作依賴” 來概括。在 Kafka 的早期版本&#xff08;Kafka 2.8.0 之前&#xff09;中&#xff0c;ZooKeeper 是 Kafka 的核心依賴&#xff0c;用于管理集群元數據、協調 Broker 和 Controller 選舉等關鍵功能。但從 …

華控智能產品特點——產品生態全景與場景化創新

公司構建 “3X”產品戰略&#xff0c;以三大核心場景為基礎持續拓展技術外延&#xff1a; 1. 智能安防產品線軍工級指紋槍盒&#xff1a;采用6061-T6航空鋁材&#xff0c;內嵌震動報警模塊&#xff0c;非法開箱觸發90dB警鳴。為軍工企業定制的雙人認證版本需兩位授權人員同時驗…

爬蟲核心原理與入門技巧分析

一、爬蟲核心原理&#xff1a;模擬人類瀏覽的“自動化工具” 簡單來說&#xff0c;網絡爬蟲&#xff08;Web Crawler&#xff09;是一種按照一定規則&#xff0c;自動抓取互聯網信息的程序或腳本。其核心原理可以類比人類瀏覽網頁的過程&#xff0c;只不過將手動操作轉化為了代…

spring-cloud微服務部署-feign服務間調用

1 準備工作 需要安裝并啟動nacos&#xff0c;作為服務注冊中心。地址&#xff1a;https://nacos.io/ 2 項目結構 parent的pom.xml聲明依賴&#xff1a; <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</gr…

IDEA高效開發:Database Navigator插件安裝與核心使用指南

目錄 1.前言 2.正文 2.1安裝流程 2.1.1IDE內部安裝 2.1.2手動下載安裝 ?? 避坑指南 2.2使用教程 2.2.1連接數據庫 2.2.2查看數據庫/表 2.2.3查詢數據 2.2.4修改表結構 2.2.5生成代碼 2.2.6常見故障排除 3.小結 1.前言 “作為Java開發者&#xff0c;日常與數據…