Transformers documentation

Pocket TTS

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

该模型于 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

< >

( 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

< >

( 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

< >

( 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__

< >

( 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

< >

( 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__

< >

( 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':返回 PyTorch torch.Tensor 对象。
    • 'np':返回 NumPy np.ndarray 对象。
  • **kwargs (ProcessingKwargs,可选) — 每种模态(文本、图像、视频、音频)的额外处理选项。模型特定参数已在上方列出;有关支持参数的完整列表,请参阅 TypedDict 类。

split_text

< >

( text: strmax_tokens: int = 50 )

参数

  • text (str) — 要分割的文本。
  • max_tokens(int,可选,默认值为 50)— 每个块的最大 token 数。

将 text 拆分为最多包含 max_tokens 个 token 的按句子对齐的块,与原始版本的 split_into_best_sentences 行为一致:预处理后的文本在句子末尾处截断(而非在小数点处截断),对于长度超过 max_tokens 的句子则在子句末尾处截断,随后对各片段进行贪心分组。每个块对应一个批次中的一轮对话。

decode

< >

( 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

< >

( 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

< >

( config: PocketTTSConfig )

参数

  • config (PocketTTSConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。

Pocket TTS 骨干网络:一个因果 Transformer,作用于由语音提示、文本 token 和音频潜在变量组成的单一序列,并返回归一化后的隐藏状态。语音提示和音频潜在变量均为音频分词器的潜在变量,由处理器持有。

该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。

该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。

forward

< >

( 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()。

    什么是输入 ID?

  • 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].

    什么是位置 ID?

  • 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

< >

( config: PocketTTSConfig )

参数

  • config (PocketTTSConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。

Pocket TTS 文本转语音模型:包括骨干网络、每步采样一个音频潜变量的流式头部,以及语音结束头部。它生成音频分词器潜变量,处理器将其解码为 24 kHz 音频。

该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。

该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。

forward

< >

( 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()。

    什么是输入 ID?

  • 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].

    什么是位置 ID?

  • 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

< >

( 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

< >

( 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 中采样下一个潜在变量。

denormalize_latents

< >

( audio_latents: Tensor )

将流头(flow head)的归一化空间中的潜在变量映射到音频分词器(audio tokenizer)的空间。

PocketTTSGenerateOutput

class transformers.models.pocket_tts.generation_pocket_tts.PocketTTSGenerateOutput

< >

( 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 的输出。

Update on GitHub