大语言模型(LLM)还能涌现什么能力?
这次开源模型Orpheus,直接让LLM涌现人类情感!
对此,Canopy Labs 的开源开发者 Elias 称,Orpheus 如同人类一般,已然具备共情能力,能够从文本里生成潜在的线索,像叹息、欢笑以及嗤笑等。
Orpheus 是开源的文本转语音(Text to Speech)模型,它的性能超越了所有的开源模型以及像 ElevenLabs 和 OpenAI 这样的闭源模型。
Orpheus成功证明了LLM在语音合成领域的涌现能力。
Orpheus 展现出了共情的能力,他的情智与人类相当,甚至能够从文字自身之中生成叹息这种潜在的音调,还能够生成笑声、轻笑等潜在的音调。
开源 TTS 模型长久以来都难以与闭源模型展开竞争。然而,在今天,这种局面开始出现转变。Ophueus 给语音界带来了颠覆!
新开源的Orpheus有4大特点:
流式推理能够在音频生成的过程里逐步地输出结果,这样就使得延迟变得极低,并且这种方式适用于实时应用。
A100 40GB 显卡上,30 亿参数模型的流式推理速度很快。它快于音频播放速度。
项目地址:
模型地址:
4大模型
Orpheus 是一个系列,它由多个预训练模型和微调模型构成。这个系列拥有 30 亿参数。
未来几天内,开发者会发布一些规模较小的模型。这些模型包括参数为 10 亿的版本、参数为 5 亿的版本以及参数为 1.5 亿的版本。
开源开发者会基于 Llama 架构发布预训练和微调模型,并且会提供四种不同的规模。
Medium – 30 亿参数
Small – 10 亿参数
Tiny – 4 亿参数
Nano – 1.5 亿参数
在极小的模型规模下,也能够实现高质量且富有美感的语音生成。 极小的模型规模依然可以达成高质量、富有美感的语音生成。 模型规模即便极小,却能实现高质量且富有美感的语音生成。
微调模型适合用于对话场景,预训练模型能够用于多种下游任务,像语音克隆或者语音分类。
模型架构和设计
预训练模型以 Llama-3B 作为基础架构,它在超过 10 万小时的英语语音数据上进行了训练,同时也在数十亿个文本 token 上进行了训练。
训练文本 token 使得模型在 TTS 任务上的表现得到显著提升,让它具备了更强的语言理解能力。
模型采用了 LLM 架构,所以具备高精度。模型采用了 LLM 架构,所以具备强表现力。模型采用了 LLM 架构,所以具备高度可定制性。
新模型能够支持实时进行语音输出的流式推理,它的延迟非常低,大概只有 200 毫秒左右,这种特性适用于对话类的应用。
希望进一步降低延迟的话,就可以把文本流式输入到模型的 KV 缓存里,这样就能将延迟降低到约 25 到 50 毫秒。
在实时语音的设计方面,运用了两种对传统进行突破的方式:以 CNN 为基础的 tokenizer 。
使用Snac采样不同频率的token,并将其展平
每帧会生成 7 个 token ,这些 token 会被作为单个展平序列进行解码 ,而不是使用 7 个 LM 头来进行解码 。
模型生成的步数会增加。在 A100 或 H100 GPU 上,使用 vLLM 实现后,模型的 token 生成速度比实时播放还要快。所以,即使是较长的语音序列,也能够保持实时生成。
Orpheus 使用的是一种非流式的 tokenizer,这种 tokenizer 是基于 CNN 的。
其他使用 SNAC 当作解码器的语音 LLM,在进行去 tokenization 操作时,会有帧之间出现“弹跳(popping)”这种现象。
Orpheus 改进了去 token 化的实现,是通过滑动窗口的方式。这样做使得它能够支持流式推理,并且还完全消除了 popping 问题。
使用教程
本次发布包含三款模型。
此外,提供了数据处理脚本,也提供了示例数据集。这样方便用户能够轻松地进行自定义微调。
目前,共有两款模型:
针对日常 TTS 应用进行了微调的是高质量模型,这是适用于日常 TTS 应用微调的模型。
预训练基础模型,它是基于 10 万+小时的英语语音数据训练出来的,预设为条件生成模式,并且能够扩展至更多任务。
流式推理
1.克隆仓库
使用 git 命令克隆仓库 https://github.com/canopyai/Orpheus-TTS.git 。
2.安装依赖
使用 cd Orpheus-TTS 命令,然后通过 pip 安装 orpheus-speech,此过程在幕后使用 vllm 以实现快速推理。
pip install vllm==0.7.3
3.运行流式推理示例
使用 OrpheusTTS 库中的 OrpheusModel 。
import wave
import time
model 等于 OrpheusModel,其模型名称为 "canopylabs/orpheus-tts-0.1-finetune-prod"
start_time = time.monotonic()
模型生成语音的过程中会产生同步令牌。 模型会生成语音,在这个过程中会产生同步令牌。 模型生成语音时会产生同步令牌。 同步令牌是由模型在生成语音的过程中产生的。 模型生成语音就会产生同步令牌。 同步令牌是在模型生成语音的过程中被产生的。 模型生成语音的行为会导致同步令牌的产生。 同步令牌因模型生成语音而产生。 模型生成语音会使得同步令牌得以产生。 同步令牌是由模型生成语音这一行为所产生的。
prompt=prompt,
voice="tara",
)
使用 wave.open("output.wav", "wb") 来创建一个名为 wf 的文件对象,以进行写入操作。
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(24000)
total_frames = 0
chunk_counter = 0
对 syn_tokens 中的音频片段逐一进行处理
chunk_counter += 1
获取音频块的长度,用其除以音频文件的声道数与每个样本宽度的乘积,得到的结果赋值给 frame_count 。具体来说,先计算 wf.getsampwidth() 与 wf.getnchannels() 的乘积,再用 audio_chunk 的长度除以这个乘积,最后将结果赋给 frame_count 。
total_frames += frame_count
wf.writeframes(audio_chunk)
计算时长的公式为:时长等于总帧数除以视频帧率。即时长等于总帧数除以 wf 所获取到的帧率。
end_time = time.monotonic()
打印出(f"生成{duration:.2f}秒音频花费了{end_time - start_time}秒")
提示格式
1. 微调模型
主要的文本提示格式为:
{name}: I went to the ...
可供选择的姓名有:「tara」,「leah」,「jess」,「leo」,「dan」,「mia」,「zac」,「zoe」。这些姓名按照对话的自然度进行了排序,是经过主观评估的。