Whisper

模型理解

model.py

ModelDimensions的含义如下:

  • n_mels:Mel频率的数量,用于音频处理,通常设置为80。
  • n_audio_ctx:输入音频的上下文大小,即处理音频的窗口大小,通常设置为1500。
    音频帧的数量指定了模型在处理音频时要考虑多少帧的上下文。在每个时间步,模型会接收一个音频帧和它前面和后面的 n_audio_ctx 个音频帧作为输入。因此,每个时间步的音频输入包括 (2 * n_audio_ctx + 1) 个音频帧。
    在模型的Encoder中,这些音频帧通过卷积和自注意力机制进行处理,最终生成一个包含所有时间步输出的音频表示。由于这个表示是基于整个音频序列计算的,因此它对于每个时间步都是相同的大小,即 (num_audio_frames, hidden_size),其中 num_audio_frames 是输入音频帧的总数量,hidden_size 是模型的隐藏状态的大小。
  • n_audio_state:音频编码器的隐藏状态大小,通常设置为1024。
  • n_audio_head:音频自注意力头的数量,用于音频编码器,通常设置为16。
  • n_audio_layer:音频编码器的层数,通常设置为24。
  • n_vocab:词汇表的大小,用于文本处理,即模型可以处理的单词数量,通常设置为51865。
  • n_text_ctx:输入文本的上下文大小,即处理文本的窗口大小,通常设置为448。
  • n_text_state:文本编码器的隐藏状态大小,通常设置为1024。
  • n_text_head:文本自注意力头的数量,用于文本编码器,通常设置为16。
  • n_text_layer:文本编码器的层数,通常设置为24。

这些参数定义了Whisper模型的基本架构和各层的大小。通常,这些参数需要根据您的数据集和任务进行调整。例如,如果您的数据集包含更多单词,您可能需要增加词汇表的大小。如果您的输入音频和文本的长度更长,您可能需要增加音频和文本的上下文大小。

sinusoids()

Sinusoidal Positional Encodings(正弦位置编码)是一种用于向输入序列中的每个位置添加一种固定的位置嵌入的技术。具体来说,ta是一种基于正弦函数的位置编码方式,它的目的是将每个位置转化为一个固定长度的向量,然后将其添加到输入嵌入向量中。这种编码方式允许模型在不知道序列长度的情况下,学习一种通用的序列建模技能。这种技术被广泛应用于Transformer等序列建模模型中,用于将序列中每个元素的位置信息显式地编码到模型的输入中。

在Whisper模型中,Sinusoidal Positional Encodings被应用于文本序列和音频序列的编码过程中。具体来说,每个位置的编码是由一个固定的向量计算得出的,这个向量的每个元素都是由一个正弦函数和一个余弦函数组成的。这些函数的参数是位置嵌入向量的维度。在计算每个位置的编码时,这些正弦函数和余弦函数会生成一组定期变化的值,这些值被组合成一个向量,作为该位置的位置嵌入。

通过将Sinusoidal Positional Encodings添加到输入嵌入向量中,模型能够对序列中每个位置的相对距离进行编码,并将其作为一种额外的输入特征供模型使用。这种编码方式被证明对序列建模任务有很大的帮助,尤其是对于长序列建模任务来说,它能够更好地捕捉输入序列中的时间相关信息。

AudioEncoder()

  • self.register_buffer("positional_embedding", sinusoids(n_ctx, n_state))
    self.register_buffer函数用于将一个张量(Tensor)注册为模型的缓存参数(buffer)。具体来说,这行代码的作用是将由sinusoids函数生成的正弦位置编码矩阵注册为模型的一个缓存参数(buffer),并将其命名为positional_embedding。通过将这个参数注册为缓存参数,这个矩阵就会被自动保存和加载,而不需要像训练参数一样显式地指定。在模型的前向计算过程中,这个矩阵会被用来计算每个位置的位置嵌入向量,从而实现正弦位置编码的作用。
    需要注意的是,缓存参数(buffer)与模型的训练参数有所不同。缓存参数不参与模型的训练过程,而是作为模型的固定参数存在,用于存储模型中的一些中间结果或者模型的状态信息。因此,这些参数也不会在反向传播时被更新。在Whisper模型中,正弦位置编码矩阵是一个固定的参数,不需要参与模型的训练过程,因此将其注册为缓存参数是一种合理的做法。

TextDecoder()

TextDecoder是一个由多层Transformer组成的解码器,用于将音频特征序列和文本嵌入序列进行对齐和融合,生成对应的文本输出序列。

init参数意义
  • n_vocab: 词表大小,即文本序列的嵌入向量维度。在Whisper模型中,文本序列的嵌入向量是通过嵌入层(Embedding Layer)进行生成的。
  • n_ctx: 上下文窗口大小,即每个时间步考虑的上下文窗口大小。在Whisper模型中,TextDecoder的输入序列是由一个固定长度的音频特征序列和一个可变长度的文本嵌入序列拼接而成的。n_ctx参数指定了在当前时间步进行文本嵌入计算时需要考虑的上下文窗口大小,具体来说,就是文本嵌入序列中当前token的前后各n_ctx个token的嵌入向量。
  • n_state: 隐藏状态的维度,即Transformer中注意力机制和前馈神经网络的隐层维度。在Whisper模型中,TextDecoder的每一层都是一个多头注意力机制和一个前馈神经网络的组合,其中多头注意力机制和前馈神经网络的输入和输出的维度都等于n_state。
  • n_layer: Transformer的层数。在Whisper模型中,TextDecoder由多层Transformer组成,每一层都是一个多头注意力机制和一个前馈神经网络的组合。
  • n_head: 注意力头的个数。

decoding.py

DecodingOptions

  • task:字符串,指定模型是进行转录任务("transcribe")还是翻译任务("translate");
  • language:字符串,表示音频所在的语言,如果为None,则使用自动检测的语言;
  • temperature:浮点数,用于控制解码时的随机性,值越大生成的文本越随机,值越小生成的文本越确定;
  • sample_len:整数,用于限制解码输出的最大长度; best_of:整数,用于控制集束搜索时的独立采样数量;
  • beam_size:整数,用于控制集束搜索时的束宽大小;
  • patience:浮点数,用于控制集束搜索时的停止条件;
  • length_penalty:浮点数,用于惩罚生成文本的长度;
  • prompt:字符串或整数列表,表示上下文信息,用于提示模型生成文本;
  • prefix:字符串或整数列表,表示前缀信息,用于指导模型生成文本;
  • suppress_blank:布尔值,用于控制是否在解码过程中抑制空输出;
  • suppress_tokens:字符串或整数迭代器,用于指定要抑制的标记id;
  • without_timestamps:布尔值,用于指示是否要在生成的文本中包含时间戳;
  • max_initial_timestamp:浮点数,表示生成的文本的最大时间戳;
  • fp16:布尔值,用于指示是否使用FP16进行计算。

tokenizer.py

all_tokens:list[int]

get_tokenizer()

点击查看代码
def get_tokenizer(
    multilingual: bool,
    *,
    task: Optional[str] = None,  # Literal["transcribe", "translate", None]
    language: Optional[str] = None,
) -> Tokenizer:
用于获取训练过程中使用的分词器。在NLP任务中,分词是将文本分割成单独的标记(token)的过程。在训练NLP模型时,通常需要使用一个分词器来将文本转换为一系列标记,这些标记可以作为模型的输入。

在Whisper模型中,分词器是在训练过程中使用的,用于将输入的文本转换为一系列标记。该函数返回训练过程中使用的分词器对象[nltk.tokenize.RegexpTokenizer],可以将其用于在推理时对新的文本使用正则表达式进行分词。在Whisper模型中,分词器的正则表达式用于分割文本,并将其转换为标记序列。这些标记序列可以用于模型的输入,从而进行推理。

audio.py

load_audio

load_audio函数的作用是将音频文件加载到内存中,并返回其采样率和音频信号数据。具体而言,该函数使用Python的wave库来读取.wav格式的音频文件,并使用scipy库中的resample函数将采样率转换为指定的采样率。最终,load_audio函数返回一个包含音频采样率和信号数据的元组。

log_mel_spectrogram

log_mel_spectrogram函数的作用是将音频信号数据转换为对数梅尔频谱图。具体而言,该函数使用Python的librosa库来计算音频信号的短时傅里叶变换(STFT),并使用librosa.filters.mel函数将频率轴划分为一系列Mel频率带。然后,将每个Mel频率带内的能量求和,并取对数,以得到对数梅尔频谱图。最终,log_mel_spectrogram函数返回对数梅尔频谱图。

这两个函数是Whisper模型中预处理音频数据的重要组成部分。load_audio函数用于加载和采样音频文件,而log_mel_spectrogram函数用于将采样后的音频信号转换为一种适合于语音识别的表示方式。在训练和推理过程中,将会调用这两个函数来对音频数据进行预处理,以便于后续的模型训练和预测。

模型运行

命令行:whisper /home/mgtv/test_whisper/test2.mp4 --model medium --language zh

posted @ 2023-03-07 17:50  不要肥宅  阅读(1828)  评论(2编辑  收藏  举报