Transformers documentation
Pocket TTS
该模型于 2026-10-20 贡献至 Hugging Face Transformers。
Pocket TTS
概述
Pocket TTS 是 Kyutai 推出的 1 亿参数文本转语音模型,属于一种 Continuous Audio Language Model,可在 CPU 上以快于实时的速度运行。该因果 Transformer 通过单步流头(one-step flow head)每帧(12.5 Hz)输出一个连续音频潜在变量,并由语音结束头(end-of-speech head)决定何时停止。
处理器包含 Pocket TTS 音频分词器,这是一种基于 Mimi 的编解码器,用于对语音提示进行编码,并将生成的潜在变量解码为 24 kHz 音频。预定义的声音以 KV 缓存的形式提供(voices/)。
发布了两个 flow heads:Lagrangian 自蒸馏(flow_type="lsd",默认)和 drifting(flow_type="drifting",english_drifting_26-09)。支持微调,请参阅 Training。
该模型由 Eustache Le Bihan 贡献。原始代码位于 kyutai-labs/pocket-tts。
使用技巧
- 使用 apply_chat_template() 准备输入(每段文本对应一条
user消息,并设置add_generation_prompt=True)。分词器的 normalizer 会按照检查点语言的相关设置,以与原始方式相同的方式处理文本。 generate会返回audio_latents和audio_latents_mask;请使用 PocketTTSProcessor.decode() 对其进行解码。max_new_tokens的默认值基于文本长度设定的预算,当语音结束(end-of-speech)的 logit 超过eos_threshold后不久,生成即停止。do_sample=False在温度为 0 时与原始结果一致。启用采样时,temperature(默认值 0.3)表示流起始噪声的方差。- 使用 PocketTTSProcessor.split_text() 拆分长文本,每个分块对应一段对话。
用法
语音
语音可以通过三种方式指定。
1. 克隆录音:对话中的一个 audio 项。
from transformers import AutoModelForTextToWaveform, AutoProcessor
model_id = "eustlb/pocket-tts"
processor = AutoProcessor.from_pretrained(model_id, device_map="auto")
model = AutoModelForTextToWaveform.from_pretrained(model_id, device_map="auto")
url = "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/en-Alice_woman.wav"
conversation = [
{
"role": "user",
"content": [
{"type": "audio", "url": url},
{"type": "text", "text": "Hello world. I am Kyutai's Pocket TTS."},
],
}
]
inputs = processor.apply_chat_template(
conversation, tokenize=True, return_dict=True, add_generation_prompt=True
).to(model.device)
outputs = model.generate(**inputs)
audio = processor.decode(outputs.audio_latents, outputs.audio_latents_mask)
processor.save_audio(audio, "cloned.wav")2. 预计算潜在变量:一个空的 audio 项,潜在变量通过处理器传入。
from transformers import AutoModelForTextToWaveform, AutoProcessor
from transformers.audio_utils import load_audio
model_id = "eustlb/pocket-tts"
processor = AutoProcessor.from_pretrained(model_id, device_map="auto")
model = AutoModelForTextToWaveform.from_pretrained(model_id, device_map="auto")
# e.g. a recording encoded once by the processor's audio tokenizer,
# to reuse without re-encoding it
url = "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/en-Alice_woman.wav"
features = processor.feature_extractor(
load_audio(url, sampling_rate=24000), sampling_rate=24000
).to(processor.audio_tokenizer.device)
# (num_frames, latent_dim)
voice = processor.audio_tokenizer.encode(**features).latents[0]
conversation = [
{
"role": "user",
"content": [
{"type": "audio"},
{"type": "text", "text": "Hello world. I am Kyutai's Pocket TTS."},
],
}
]
inputs = processor.apply_chat_template(
conversation,
tokenize=True,
return_dict=True,
add_generation_prompt=True,
processor_kwargs={"audio_prompt_latents": [voice]},
).to(model.device)
outputs = model.generate(**inputs)
audio = processor.decode(outputs.audio_latents, outputs.audio_latents_mask)
processor.save_audio(audio, "latents.wav")3. 缓存的上下文:语音提示的 KV 缓存,通过 past_key_values 传入。随附的语音(voices/)使用此形式。
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
from transformers import AutoModelForTextToWaveform, AutoProcessor, DynamicCache
model_id = "eustlb/pocket-tts"
processor = AutoProcessor.from_pretrained(model_id, device_map="auto")
model = AutoModelForTextToWaveform.from_pretrained(model_id, device_map="auto")
voice = load_file(hf_hub_download(model_id, "voices/alba.safetensors"))
layers = []
for i, layer in enumerate(model.model.layers):
# each layer's cache on that layer's device
device = layer.self_attn.k_proj.weight.device
layers.append(
(voice[f"layers.{i}.keys"].to(device), voice[f"layers.{i}.values"].to(device))
)
voice_cache = DynamicCache(layers, config=model.config)
conversation = [
{
"role": "user",
"content": [{"type": "text", "text": "Hello world. I am Kyutai's Pocket TTS."}],
}
]
inputs = processor.apply_chat_template(
conversation, tokenize=True, return_dict=True, add_generation_prompt=True
).to(model.device)
outputs = model.generate(**inputs, past_key_values=voice_cache)
audio = processor.decode(outputs.audio_latents, outputs.audio_latents_mask)
processor.save_audio(audio, "cached.wav")批处理与长文本
批量处理多个文本和语音,并将长文本拆分为多个片段:
import torch
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
from transformers import AutoModelForTextToWaveform, AutoProcessor, DynamicCache
model_id = "eustlb/pocket-tts"
processor = AutoProcessor.from_pretrained(model_id, device_map="auto")
model = AutoModelForTextToWaveform.from_pretrained(model_id, device_map="auto")
def load_voices(names):
"""The shipped voices, one per conversation, as one cache, left-padded to the
longest voice, and the mask of their positions.
`generate` extends the cache: load it for every call.
"""
voices = [
load_file(hf_hub_download(model_id, f"voices/{name}.safetensors"))
for name in names
]
lengths = [voice["layers.0.keys"].shape[2] for voice in voices]
length = max(lengths)
layers = []
for i, layer in enumerate(model.model.layers):
device = layer.self_attn.k_proj.weight.device
keys, values = (
torch.cat(
[
torch.nn.functional.pad(voice[f"layers.{i}.{kind}"], (0, 0, length - n, 0))
for voice, n in zip(voices, lengths)
]
).to(device)
for kind in ("keys", "values")
)
layers.append((keys, values))
mask = torch.tensor([[0] * (length - n) + [1] * n for n in lengths])
return DynamicCache(layers, config=model.config), mask
text = (
"A first sentence that is long enough to be worth splitting. "
"Then a second one, and a third one for good measure."
)
chunks = processor.split_text(text)
conversations = [
[{"role": "user", "content": [{"type": "text", "text": chunk}]}]
for chunk in chunks + ["Hello world"]
]
inputs = processor.apply_chat_template(
conversations, tokenize=True, return_dict=True, add_generation_prompt=True
).to(model.device)
voice_cache, voice_mask = load_voices(["alba"] * len(chunks) + ["jean"])
# the mask covers the cached voices too
inputs["attention_mask"] = torch.cat(
[voice_mask.to(inputs["attention_mask"]), inputs["attention_mask"]], dim=-1
)
outputs = model.generate(**inputs, past_key_values=voice_cache)
audio = processor.decode(outputs.audio_latents, outputs.audio_latents_mask)
processor.save_audio(
[torch.cat(audio[: len(chunks)]), audio[-1]], ["long.wav", "hello.wav"]
)漂移检查点
用法相同,但使用检查点自身的语音:
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
from transformers import AutoModelForTextToWaveform, AutoProcessor, DynamicCache
model_id = "eustlb/pocket-tts-english-drifting"
processor = AutoProcessor.from_pretrained(model_id, device_map="auto")
model = AutoModelForTextToWaveform.from_pretrained(model_id, device_map="auto")
voice = load_file(hf_hub_download(model_id, "voices/alba.safetensors"))
layers = []
for i, layer in enumerate(model.model.layers):
device = layer.self_attn.k_proj.weight.device
layers.append(
(voice[f"layers.{i}.keys"].to(device), voice[f"layers.{i}.values"].to(device))
)
conversation = [
{
"role": "user",
"content": [{"type": "text", "text": "Hello world. I am Kyutai's Pocket TTS."}],
}
]
inputs = processor.apply_chat_template(
conversation, tokenize=True, return_dict=True, add_generation_prompt=True
).to(model.device)
outputs = model.generate(
**inputs, past_key_values=DynamicCache(layers, config=model.config)
)
audio = processor.decode(outputs.audio_latents, outputs.audio_latents_mask)
processor.save_audio(audio, "drifting.wav")训练
将目标音频放在 assistant 轮次中。处理器将其潜在表示作为 labels 返回,模型返回原始损失(LSD 流损失加上 config.eos_loss_weight 倍的语音结束损失)。语音提示通常是同一句话的开头部分。
import torch
from transformers import AutoModelForTextToWaveform, AutoProcessor
model_id = "eustlb/pocket-tts"
processor = AutoProcessor.from_pretrained(model_id, device_map="auto")
model = AutoModelForTextToWaveform.from_pretrained(model_id, device_map="auto")
model.train()
conversation = [
{
"role": "user",
"content": [
{"type": "audio", "audio": voice_prompt},
{"type": "text", "text": target_text},
],
},
{"role": "assistant", "content": [{"type": "audio", "audio": target_audio}]},
]
inputs = processor.apply_chat_template(
conversation, tokenize=True, return_dict=True
).to(model.device)
loss = model(**inputs).loss
loss.backward()- 以录音或潜在表示的形式提供语音,而不是缓存。
- 对于无分类器引导,请删除
user轮次中的audio或text项(原始实现以 0.2 的概率分别删除每一项)。 - 预计算的潜在变量应放入
processor_kwargs={"audio_prompt_latents": [...], "labels": [...]}中,并使用空的{"type": "audio"}项作为占位符。 - 原始配方:AdamW,
learning_rate=2e-5(新语言为 2e-4),adam_beta2=0.95,weight_decay=0.1,max_grad_norm=1.0,1000 步预热后保持恒定,权重 EMA(衰减系数 0.999)。
PocketTTSConfig
class transformers.PocketTTSConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Noneflow_head_config: dict | transformers.configuration_utils.PreTrainedConfig | None = Nonevocab_size: int = 4004hidden_size: int = 1024num_hidden_layers: int = 6num_attention_heads: int = 16num_key_value_heads: int | None = Nonehead_dim: int | None = Noneintermediate_size: int = 4096hidden_act: str = 'gelu_pytorch_tanh'layer_norm_eps: float = 1e-05attention_bias: bool = Falseattention_dropout: float = 0.0max_position_embeddings: int = 8192rope_parameters: transformers.modeling_rope_utils.RopeParameters | dict | None = Nonelatent_dim: int = 32pad_token_id: int = 3bos_token_id: int | None = Noneeos_token_id: int | None = Noneaudio_prompt_token_id: int = 4000audio_latent_token_id: int = 4001audio_prompt_bos_token_id: int = 4002audio_bos_token_id: int = 4003frame_rate: float = 12.5initializer_range: float = 0.02use_cache: bool = Trueeos_loss_weight: float = 0.1flow_loss_num_samples: int = 4lsd_distill_probability: float = 0.25lsd_diagonal_weight: float = 0.75lsd_time_logit_mean: float = 0.4lsd_time_logit_std: float = 1.0latent_stats_ema_steps: int = 1000latent_stats_ema_decay: float = 0.999 )
参数
- flow_head_config (
Union[PocketTTSFlowHeadConfig, dict], 可选) — 用于从主干隐藏状态中采样每个潜在变量的 flow head 配置。 - vocab_size (
int,可选,默认为4004) — 模型的词汇表大小。定义了input_ids可以表示的不同 token 的数量。 - hidden_size (
int,可选,默认为1024) — 隐藏表示的维度。 - num_hidden_layers (
int,可选,默认为6) — Transformer 解码器中的隐藏层数量。 - num_attention_heads (
int,可选,默认为16) — Transformer 解码器中每个注意力层的注意力头数量。 - num_key_value_heads (
int, 可选) — 这是用于实现 Grouped Query Attention 的 key_value 头数。如果num_key_value_heads=num_attention_heads,模型将使用 Multi Head Attention (MHA);如果num_key_value_heads=1,模型将使用 Multi Query Attention (MQA);否则使用 GQA。在将多头检查点转换为 GQA 检查点时,每个组的 key 和 value 头应通过对该组内所有原始头进行平均池化来构建。更多详情请参阅 这篇论文。如果未指定,则默认为num_attention_heads。 - head_dim (
int,可选) — 注意力头维度。如果为 None,则默认为 hidden_size // num_attention_heads - intermediate_size (
int,可选,默认为4096) — MLP 表示的维度。 - hidden_act (
str,可选,默认为gelu_pytorch_tanh) — 解码器中的非线性激活函数(函数或字符串)。例如,"gelu"、"relu"、"silu"等。 - layer_norm_eps (
float,可选,默认值为 1e-05) — 骨干网络中层归一化的 epsilon 值。 - attention_bias (
bool,可选,默认为False) — 在自注意力机制中,是否在 query、key、value 和 output 投影层中使用偏置。 - attention_dropout (
float,可选,默认为0.0) — 注意力概率的 dropout 比率。 - max_position_embeddings (
int,可选,默认为8192) — 该模型可能使用的最大序列长度。 - rope_parameters (
Union[~modeling_rope_utils.RopeParameters, dict], 可选) — 包含 RoPE 嵌入配置参数的字典。该字典应包含rope_theta的值,并且如果希望使用 RoPE 处理更长的max_position_embeddings,则可选地包含用于缩放的参数。 - latent_dim (
int,可选,默认为 32) — 主干网络接收的音频潜在变量维度(audio_prompt_latents、audio_latents);等于 flow head 和音频 tokenizer 的latent_dim。 - pad_token_id (
int,可选,默认为3) — 词表中用于填充的 token id。 - bos_token_id (
int, 可选) — 词汇表中用于表示流起始的 Token id。 - eos_token_id (
int, 可选) — 词汇表中用于表示流结束(end-of-stream)的 token id。 - audio_prompt_token_id (
int,可选,默认值为 4000) —input_ids中语音提示帧的占位符 token id。 - audio_latent_token_id (
int, 可选,默认为 4001) —input_ids中音频潜在位置占位符的 token id。 - audio_prompt_bos_token_id (
int,可选,默认值为 4002) — 放置在语音提示之前的 Token id;其嵌入向量是原始模型在语音前添加的学习向量。 - audio_bos_token_id (
int,可选,默认值为 4003) — 第一个音频位置的 Token id,用于闭合提示:它保存了学习到的 BOS 潜在向量,首帧即由此生成。 - frame_rate (
float,可选,默认值为 12.5) — 每秒音频对应的音频潜在变量数量:generate会基于此值推导其默认的帧预算。 - initializer_range (
float,可选,默认为0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - use_cache (
bool,可选,默认为True) — 模型是否应返回最后一次键/值注意力(并非所有模型都使用)。仅当config.is_decoder=True或模型为仅解码器生成式模型时相关。 - eos_loss_weight (
float,可选,默认值为 0.1) — 训练损失中语音结束损失的权重。 - flow_loss_num_samples (
int,可选,默认为 4) — 流损失中每个目标帧的噪声采样次数。 - lsd_distill_probability (
float,可选,默认值为 0.25) — 每个训练步中计算 LSD 损失自蒸馏项的概率(会进行重新加权以保持期望损失不变);设为 1 表示在每个训练步都计算该项。 - lsd_diagonal_weight (
float, 可选,默认值为 0.75) — LSD 损失中对角项(瞬时流项)的权重;自蒸馏项负责其余部分。 - lsd_time_logit_mean (
float, 可选,默认为 0.4) — LSD 损失所采样的流时间的 logit-normal 分布的均值。 - lsd_time_logit_std (
float, 可选,默认为 1.0) — LSD 损失所采样的流时间的 logit-normal 分布的标准差。 - latent_stats_ema_steps (
int,可选,默认为 1000) — 在最初多少个训练步骤中,latent_mean和latent_std会跟随目标潜变量的指数移动平均;设为 0 则保持它们冻结不变。 - latent_stats_ema_decay (
float,可选,默认值为 0.999) — 该移动平均的衰减系数。
这是用于存储 PocketTTSModel 配置的类。它根据指定的参数实例化 Pocket Tts 模型,并定义模型架构。使用默认值实例化配置,将得到与 eustlb/pocket-tts 类似的配置。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。
PocketTTSFlowHeadConfig
类 transformers.PocketTTSFlowHeadConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonehidden_size: int = 512num_hidden_layers: int = 6latent_dim: int = 32condition_dim: int = 1024frequency_embedding_size: int = 256hidden_act: str = 'silu'layer_norm_eps: float = 1e-06rms_norm_eps: float = 1e-05max_period: float = 10000.0flow_type: typing.Literal['lsd', 'drifting'] = 'lsd'loss_weighting_hidden_size: int = 32loss_weighting_num_layers: int = 3 )
参数
- hidden_size (
int,可选,默认为512) — 隐藏表示的维度。 - num_hidden_layers (
int,可选,默认为6) — Transformer 解码器中的隐藏层数量。 - latent_dim (
int,可选,默认为 32) — 头部所预测的连续音频潜变量的维度(即音频分词器的潜变量维度)。 - condition_dim (
int,可选,默认值为 1024) — 头部所依赖的骨干网络隐藏状态的维度(即骨干网络的hidden_size)。 - frequency_embedding_size (
int, 可选,默认为 256) — 流时间的正弦嵌入的维度。 - hidden_act (
str,可选,默认为silu) — 解码器中的非线性激活函数(函数或字符串)。例如,"gelu"、"relu"、"silu"等。 - layer_norm_eps (
float,可选,默认值为 1e-06) — 残差块内部及最终层中 layer normalization 的 epsilon 值。 - rms_norm_eps (
float,可选,默认值为 1e-05) — 用于结束时间嵌入的归一化的 epsilon 值。 - max_period (
float,可选,默认值为 10000.0) — 正弦时间嵌入的最大周期,检查点将其存储为freqs。 - flow_type (
str,可选,默认为"lsd") — 训练该 head 时所使用的目标函数,它决定了 head 的条件化方式和采样方式。"lsd"(Lagrangian self-distillation):以流步骤的起始时间和结束时间为条件,从高斯噪声出发,通过 Euler 步进行采样。"drifting":无时间条件,head 在一次调用中将噪声映射到潜在表示。 - loss_weighting_hidden_size (
int,可选,默认值为 32) — 用于从 LSD 损失项的流时间中学习不确定性加权的 MLP 的宽度(仅用于训练)。 - loss_weighting_num_layers (
int,可选,默认为 3) — 该 MLP 的隐藏层数量。
这是用于存储 PocketTTSModel 配置的类。它根据指定的参数实例化 Pocket Tts 模型,并定义模型架构。使用默认值实例化配置,将得到与 eustlb/pocket-tts 类似的配置。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。
PocketTTSFeatureExtractor
class transformers.PocketTTSFeatureExtractor
< source >( feature_size = 1sampling_rate = 24000padding_value = 0.0frame_size = 1920pad_to_multiple_of = 1920end_on_pause = Truepause_duration = 0.08fade_out_duration = 0.02silence_floor_db = 35.0analysis_frame_duration = 0.02**kwargs )
参数
- feature_size (
int,可选,默认为 1) — 通道数。 - sampling_rate (
int, 可选,默认为 24000) — 用于对音频波形进行数字化的采样率,以赫兹(Hz)为单位。 - padding_value (
float,可选,默认为 0.0) — 用于填充的值。 - frame_size (
int,可选,默认为 1920) — 音频分词器每个潜在帧的音频采样数(即其frame_size)。 - pad_to_multiple_of (
int, 可选,默认为 1920) — 将音频填充为该值的整数倍;填充为frame_size的整数倍可确保每个潜在帧保持完整。 - end_on_pause (
bool,可选,默认为True) — 是否让每个波形恰好以pause_duration秒的静音结束:将尾部静音(比最响帧高出analysis_frame_duration秒且低于silence_floor_db的帧)切除,对剩余部分的最后fade_out_duration秒进行淡出处理,并追加pause_duration秒的零值。 - pause_duration (
float,可选,默认值为 0.08) —end_on_pause所添加的静音时长,单位为秒。 - fade_out_duration (
float,可选,默认值为 0.02) —end_on_pause在暂停前应用的淡出持续时间,以秒为单位。 - silence_floor_db (
float,可选,默认值为 35.0) — 相对于最响分析帧的幅度(以 dB 为单位),低于该值时,end_on_pause会将尾部帧视为静音。 - analysis_frame_duration(
float,可选,默认值为 0.02)—end_on_pause所测量的帧持续时间,单位为秒。
构建 Pocket TTS 特征提取器,用于为音频分词器的编码器准备语音提示波形。
每个波形可选地以一段短暂停顿结尾(对应原始数据中的 end_on_pause:训练提示词结束于两个单词之间的停顿内,在语音处停止的提示词会使模型继续生成,而在较长静音处结束的提示词则会延迟起始),随后该批次数据会在右侧填充至分词器帧大小的整数倍。
__call__
< source >( audio: typing.Union[numpy.ndarray, ForwardRef('torch.Tensor'), collections.abc.Sequence[numpy.ndarray], collections.abc.Sequence['torch.Tensor']]sampling_rate: int | None = Noneend_on_pause: bool | None = Nonepadding: bool | str | transformers.utils.generic.PaddingStrategy | None = Truepad_to_multiple_of: int | None = Nonemax_length: int | None = Nonereturn_attention_mask: bool | None = Truereturn_tensors: str | None = 'pt'**kwargs )
参数
- audio (
np.ndarray,torch.Tensor,list[np.ndarray],list[torch.Tensor]) — 语音提示的单声道波形或单声道波形批次。 - sampling_rate (
int, 可选) —audio输入被采样时的采样率。强烈建议在 forward 调用时传入sampling_rate,以避免静默错误。 - end_on_pause (
bool, 可选) — 是否在每个波形的末尾添加一段短暂的停顿,详见类文档字符串。默认值为self.end_on_pause。 - padding(
bool、str或 PaddingStrategy,可选,默认为True)— 批次的填充策略,参见 pad()。 - pad_to_multiple_of (
int,可选) — 将批次填充为该值的整数倍。默认值为self.pad_to_multiple_of。
PocketTTSProcessor
class transformers.PocketTTSProcessor
< source >( feature_extractortokenizeraudio_tokenizer = Nonechat_template = Noneshort_text_max_words: int = 4frames_after_eos_short_text: int = 4frames_after_eos: int = 2fade_in_duration: float = 0.005 )
参数
- feature_extractor (
PocketTTSFeatureExtractor) — 特征提取器是必需的输入。 - tokenizer (
TokenizersBackend) — 分词器是必需的输入。 - audio_tokenizer(
PocketTTSAudioTokenizerModel,可选)— 编解码器:将音频编码为潜在表示,并将生成的潜在表示解码为音频。 - chat_template (
str) — 一个 Jinja 模板,用于将聊天中的消息列表转换为可分词的字符串。 - short_text_max_words(
int,可选,默认值为 4)— 词数不超过该值的文本,在语音结束帧之后会追加frames_after_eos_short_text帧。 - frames_after_eos_short_text (
int,可选,默认为 4) — 对于短文本,在语音结束帧之后生成的帧数。 - frames_after_eos (
int,可选,默认为 2) — 在语音结束帧之后生成的帧数,用于处理较长的文本。 - fade_in_duration (
float,可选,默认值为 0.005) — 应用于每个解码波形起始处的线性淡入持续时间(以秒为单位):新的解码器状态会以一个较小的步长开始,听起来像是一个咔哒声。
构建一个 PocketTTSProcessor,它将特征提取器和分词器封装为单个处理器。
PocketTTSProcessor 提供了 PocketTTSFeatureExtractor 和 TokenizersBackend 的所有功能。有关更多信息,请参阅 ~PocketTTSFeatureExtractor 和 ~TokenizersBackend。
__call__
< source >( text: str | list[str] | None = Noneaudio: typing.Union[numpy.ndarray, ForwardRef('torch.Tensor'), collections.abc.Sequence[numpy.ndarray], collections.abc.Sequence['torch.Tensor'], NoneType] = Noneaudio_prompt_latents: list[torch.Tensor] | None = Nonelabels: list[torch.Tensor] | None = None**kwargs: *<class 'transformers.models.pocket_tts.processing_pocket_tts.PocketTTSProcessorKwargs'> )
参数
- text (
str或list[str]) — 由 apply_chat_template() 渲染的提示词。 - audio (
np.ndarray、torch.Tensor或它们的列表,可选) — 对话的波形,单声道,采样率为 24 kHz,按对话顺序排列:每个语音,以及在训练中的每个目标。 - audio_prompt_latents (
list[torch.Tensor], 可选) — 预计算的语音,每个语音占位符对应一个(num_frames, latent_dim)张量,而非波形。 - labels (
list[torch.Tensor],可选) — 预计算的目标(用于训练),每个目标占位符对应一个(num_frames, latent_dim)张量,而非波形。 - end_on_pause (
bool,kwargs,可选) — 是否在每个语音提示波形末尾添加一个短暂的停顿,就像原始实现在克隆语音之前所做的那样。 默认值为特征提取器的end_on_pause。 - return_tensors (
str或 TensorType, 可选) — 如果设置,将返回特定框架的张量。可接受的值为:'pt':返回 PyTorchtorch.Tensor对象。'np':返回 NumPynp.ndarray对象。
- **kwargs (ProcessingKwargs,可选) — 每种模态(文本、图像、视频、音频)的额外处理选项。模型特定参数已在上方列出;有关支持参数的完整列表,请参阅 TypedDict 类。
split_text
< source >( text: strmax_tokens: int = 50 )
将 text 拆分为最多包含 max_tokens 个 token 的按句子对齐的块,与原始版本的 split_into_best_sentences 行为一致:预处理后的文本在句子末尾处截断(而非在小数点处截断),对于长度超过 max_tokens 的句子则在子句末尾处截断,随后对各片段进行贪心分组。每个块对应一个批次中的一轮对话。
decode
< source >( audio_latents: torch.Tensoraudio_latents_mask: torch.Tensor | None = None )
参数
- audio_latents(形状为
(batch_size, num_frames, latent_dim)或(num_frames, latent_dim)的torch.Tensor)—generate返回的潜变量(PocketTTSGenerateOutput.audio_latents),解码为一个批次,或单个样本的潜变量。 - audio_latents_mask(形状为
(batch_size, num_frames)的torch.Tensor,可选) — 每个样本帧的掩码(PocketTTSGenerateOutput.audio_latents_mask)。如果未提供,则每一行都会按完整长度进行解码。
使用音频分词器将生成的潜在变量解码为波形,并像原始实现一样,对每个波形的开头 fade_in_duration 秒进行淡入处理。
save_audio
< source >( audio: typing.Union[numpy.ndarray, ForwardRef('torch.Tensor'), collections.abc.Sequence[numpy.ndarray], collections.abc.Sequence['torch.Tensor']]saving_path: str | pathlib.Path | list[str | pathlib.Path]sampling_rate: int | None = None )
将生成的波形写入 WAV 文件。
audio (torch.Tensor、np.ndarray 或它们的列表):
由 decode() 返回的波形。
saving_path (str、Path 或它们的列表):
每个波形对应一个路径。
sampling_rate (int,可选):
波形的采样率,默认为特征提取器(即音频分词器)的采样率。
PocketTTSModel
class transformers.PocketTTSModel
< source >( config: PocketTTSConfig )
参数
- config (PocketTTSConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
Pocket TTS 骨干网络:一个因果 Transformer,作用于由语音提示、文本 token 和音频潜在变量组成的单一序列,并返回归一化后的隐藏状态。语音提示和音频潜在变量均为音频分词器的潜在变量,由处理器持有。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneaudio_prompt_latents: typing.Optional[torch.Tensor] = Noneaudio_prompt_latents_mask: typing.Optional[torch.Tensor] = Noneaudio_latents: typing.Optional[torch.Tensor] = Noneaudio_latents_mask: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneposition_ids: typing.Optional[torch.LongTensor] = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneinputs_embeds: typing.Optional[torch.Tensor] = Noneuse_cache: bool | None = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → BaseModelOutputWithPast or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length), ,可选) — 输入序列中各 token 在词汇表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- audio_prompt_latents (
torch.Tensor,形状为(batch_size, num_prompt_frames, latent_dim),可选) — 音频分词器的语音提示潜在表示(由处理器编码,或来自检查点的voices/), 右侧填充至批次中最长的语音,并散布到audio_prompt_token_id对应的位置。 - audio_prompt_latents_mask(形状为
(batch_size, num_prompt_frames)的torch.Tensor,可选) —audio_prompt_latents中语音帧(1)与填充(0)的掩码。 - audio_latents(形状为
(batch_size, num_latents, latent_dim)的torch.Tensor,可选) — 归一化的音频潜在变量,分散到audio_latent_token_id位置。它们之前的audio_bos_token_id位置用于关闭提示并生成第一帧,始终获得学习到的 BOS 潜在变量。 - audio_latents_mask (
torch.Tensor,形状为(batch_size, num_latents),可选) — 当各行包含不同数量的潜在位置(训练时)时,audio_latents中每行潜在值(1)与填充(0)的掩码。 - attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- position_ids (
torch.LongTensor形状为(batch_size, sequence_length), 可选) — 输入序列中每个 token 在位置嵌入中的位置索引。取值范围为[0, config.n_positions - 1]. - past_key_values (
~cache_utils.Cache, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常由past_key_values在解码的先前阶段返回,当use_cache=True或config.use_cache=True.仅允许将 Cache 实例作为输入,请参阅我们的 kv cache 指南。 如果未传入
past_key_values,则默认会初始化 DynamicCache。模型将输出与输入相同的缓存格式。
如果使用了
past_key_values,用户应仅输入未处理的input_ids(即未向该模型提供其过去键值状态的那些),其形状为(batch_size, unprocessed_length),而不是形状为(batch_size, sequence_length)的全部input_ids。 - inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - use_cache (
bool,可选) — 如果设置为True,则会返回past_key_values键值状态,可用于加速解码(参见past_key_values)。
返回值
BaseModelOutputWithPast 或 tuple(torch.Tensor)
一个 BaseModelOutputWithPast 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(PocketTTSConfig)和输入。
PocketTTSModel 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
last_hidden_state(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor)— 模型最后一层输出的隐藏状态序列。如果使用了
past_key_values,则仅输出形状为(batch_size, 1, hidden_size)的序列的最后一个隐藏状态。past_key_values(
Cache,可选,在传入use_cache=True或config.use_cache=True时返回)—— 它是一个 Cache 实例。更多详情,请参阅我们的 kv cache 指南。包含预计算的隐藏状态(自注意力块中的键和值,以及如果
config.is_encoder_decoder=True则还包括交叉注意力块中的键和值),可用于(参见past_key_values输入)加速顺序解码。hidden_states (
tuple(torch.Tensor),可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层的输出,以及每一层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple(torch.Tensor),可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
PocketTTSForConditionalGeneration
class transformers.PocketTTSForConditionalGeneration
< source >( config: PocketTTSConfig )
参数
- config (PocketTTSConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
Pocket TTS 文本转语音模型:包括骨干网络、每步采样一个音频潜变量的流式头部,以及语音结束头部。它生成音频分词器潜变量,处理器将其解码为 24 kHz 音频。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneaudio_prompt_latents: typing.Optional[torch.Tensor] = Noneaudio_prompt_latents_mask: typing.Optional[torch.Tensor] = Noneaudio_latents: typing.Optional[torch.Tensor] = Nonelabels: typing.Optional[torch.Tensor] = Nonelabels_mask: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneposition_ids: typing.Optional[torch.LongTensor] = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneinputs_embeds: typing.Optional[torch.Tensor] = Noneuse_cache: bool | None = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → PocketTTSOutputWithPast or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length), ,可选) — 输入序列中各 token 在词汇表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- audio_prompt_latents (
torch.Tensor,形状为(batch_size, num_prompt_frames, latent_dim),可选) — 音频分词器的语音提示潜在表示,右侧填充,并分散到audio_prompt_token_id对应的位置。 - audio_prompt_latents_mask(形状为
(batch_size, num_prompt_frames)的torch.Tensor,可选) —audio_prompt_latents中语音帧(1)与填充(0)的掩码。 - audio_latents(形状为
(batch_size, num_latents, latent_dim)的torch.Tensor,可选) — 归一化的音频潜在变量,散布在audio_latent_token_id位置。 - labels (
torch.Tensor,形状为(batch_size, num_frames, latent_dim),可选) — 音频分词器的目标潜变量(用于训练),右侧填充。每一行的提示以audio_bos_token_id位置结尾,随后每个帧对应一个audio_latent_token_id位置:模型输入归一化后的目标(教师强制),对 BOS 及除最后一帧之外的所有帧的输出应用流损失,这些帧用于预测后续帧;并对所有帧应用语音结束损失,其中最后一帧即为语音结束。 - labels_mask(形状为
(batch_size, num_frames)的torch.Tensor,可选) —labels中每行目标帧(1)与填充(0)的掩码。 - attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- position_ids (
torch.LongTensor形状为(batch_size, sequence_length), 可选) — 输入序列中每个 token 在位置嵌入中的位置索引。取值范围为[0, config.n_positions - 1]. - past_key_values (
~cache_utils.Cache, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常由past_key_values在解码的先前阶段返回,当use_cache=True或config.use_cache=True.仅允许将 Cache 实例作为输入,请参阅我们的 kv cache 指南。 如果未传入
past_key_values,则默认会初始化 DynamicCache。模型将输出与输入相同的缓存格式。
如果使用了
past_key_values,用户应仅输入未处理的input_ids(即未向该模型提供其过去键值状态的那些),其形状为(batch_size, unprocessed_length),而不是形状为(batch_size, sequence_length)的全部input_ids。 - inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - use_cache (
bool,可选) — 如果设置为True,则会返回past_key_values键值状态,可用于加速解码(参见past_key_values)。
返回值
PocketTTSOutputWithPast 或 tuple(torch.Tensor)
PocketTTSOutputWithPast 或 torch.Tensor 元组(当传入 return_dict=False 或 config.return_dict=False 时),其包含的元素取决于配置(PocketTTSConfig)和输入。
PocketTTSForConditionalGeneration 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
loss (
torch.Tensor,形状为(),可选,在传入labels时返回) — 训练损失:目标潜变量的 LSD 流损失加上config.eos_loss_weight倍的语音结束损失。logits(形状为
(batch_size, sequence_length, 1)的torch.Tensor)— 语音结束 logits,每个位置一个。past_key_values(
Cache,可选,在传入use_cache=True或config.use_cache=True时返回)—— 它是一个 Cache 实例。更多详情,请参阅我们的 kv cache 指南。包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见
past_key_values输入)加速顺序解码。hidden_states (
tuple(torch.Tensor),可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层的输出,以及每一层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple(torch.Tensor),可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
last_hidden_state(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor)— 骨干网络的归一化隐藏状态,用于条件化流头。
示例:
>>> from transformers import AutoProcessor, PocketTTSForConditionalGeneration
>>> model = PocketTTSForConditionalGeneration.from_pretrained("eustlb/pocket-tts")
>>> processor = AutoProcessor.from_pretrained("eustlb/pocket-tts")
>>> inputs = processor(text="Hello, my dog is cute", return_tensors="pt")
>>> # generate speech
>>> speech = model(inputs["input_ids"])generate
< source >( inputs: typing.Optional[torch.Tensor] = None**kwargs )
参数
- inputs(形状为
(batch_size, sequence_length)的torch.LongTensor,可选)— 由 PocketTTSProcessor 准备好的input_ids。也可以以input_ids=的形式传入。 - kwargs (
dict[str, Any], 可选) —attention_mask、语音提示(audio_prompt_latents和audio_prompt_latents_mask,或作为语音前缀缓存的past_key_values,即随附的语音,仅包含文本提示)、来自处理器的frames_after_eos、生成参数(do_sample、temperature、max_new_tokens、……),以及 Pocket TTS 特有的num_flow_steps、eos_threshold和min_frames_before_eos,这些参数的默认值取自生成配置。
生成语音。此方法重写了 generate(),将 max_new_tokens 的默认值设为原始运行时的帧预算,即批次中最长文本对应的 ceil((num_text_tokens / 3 + 2) * frame_rate)。其余部分均通过常规生成钩子处理。
sample_latent
< source >( condition: Tensornoise: Tensornum_flow_steps: int ) → torch.Tensor of shape (batch_size, latent_dim)
参数
- condition (
torch.Tensor,形状为(batch_size, hidden_size)) — 正在生成的位置的 Backbone 隐藏状态。 - noise(形状为
(batch_size, latent_dim)的torch.Tensor)— 由sqrt(temperature)缩放的高斯噪声,或零。 - num_flow_steps (
int) — LSD 采样器的 Euler 步数(drifting head 会忽略此参数,因为它只调用一次)。
返回值
形状为 (batch_size, latent_dim) 的 torch.Tensor
在归一化空间中的采样潜在变量。
使用 flow head 从 noise 中采样下一个潜在变量。
将流头(flow head)的归一化空间中的潜在变量映射到音频分词器(audio tokenizer)的空间。
PocketTTSGenerateOutput
class transformers.models.pocket_tts.generation_pocket_tts.PocketTTSGenerateOutput
< source >( sequences: LongTensorscores: tuple[torch.Tensor] | None = Nonelogits: tuple[torch.Tensor] | None = Noneattentions: tuple[tuple[torch.Tensor]] | None = Nonehidden_states: tuple[tuple[torch.Tensor]] | None = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneaudio_latents: typing.Optional[torch.Tensor] = Noneaudio_latents_mask: typing.Optional[torch.LongTensor] = None )
参数
- sequences(形状为
(batch_size, sequence_length)的torch.LongTensor)— 提示词 token id,后接每个生成帧对应的一个audio_latent_token_id。音频本身位于audio_latents中。 - scores (
tuple(torch.Tensor)可选,当output_scores=True时返回) — 每个生成帧的语音结束 logit,每帧一个形状为(batch_size,)的张量。 - logits (
tuple(torch.Tensor)可选,当output_logits=True时返回) — 与scores相同:Pocket TTS 没有词汇表,因此两者之间没有需要处理的内容。 - attentions (
tuple(tuple(torch.Tensor)),可选,当output_attentions=True时返回) — 元组(每个生成的帧一个元素),其中每个元素是一个元组(每层一个元素),包含形状为(batch_size, num_heads, generated_length, sequence_length)的torch.Tensor。 - hidden_states (
tuple(tuple(torch.Tensor)),可选,当output_hidden_states=True时返回) — 元组(每个生成的帧一个元素),其中每个元素是一个元组(每层一个元素),包含形状为(batch_size, generated_length, hidden_size)的torch.Tensor。 - past_key_values (
Cache,可选,当use_cache=True时返回) — 生成结束时主干网络的键/值缓存。 - audio_latents (
torch.Tensor,形状为(batch_size, num_frames, latent_dim)) — 生成的潜在表示,位于音频分词器的潜在空间中,在每个样本自身的帧之后用零进行右侧填充。PocketTTSProcessor.decode() 会将其转换为波形。 - audio_latents_mask(形状为
(batch_size, num_frames)的torch.LongTensor)— 每个样本帧的掩码(1),包括语音结束帧及其后的帧,与填充(0)相对。
PocketTTSForConditionalGeneration.generate 的输出。