这不是代码的一部分,所以用!
运算符表示它,因为它是 Google Colab 命令行的命令(因为我首先在笔记本上测试此代码,然后可以在本地 PC 上使用相同的代码)。
! pip install -q transformers
这里的代码:
import librosa
import torch
#for download Wav2Vec2 from the Transformers library of Hugging Face
from transformers import Wav2Vec2ForCTC, Wav2Vec2Tokenizer
在这种情况下,我加载标记器和这个预先训练的模型
#load model and tokenizer
tokenizer = Wav2Vec2Tokenizer.from_pretrained("facebook/wav2vec2-base-960h")
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h")
这里是问题,因为我加载完整的音频文件,它可能饱和 RAM 内存时,试图处理一个.mp3 文件与 14:18 分钟(6,54 Mb)的持续时间。
我选择 16000 Hz 频率,因为这个 facebook Wav2Vec2 模型是以 16 kHz 速率预训练的。
我不确定导致 RAM 饱和的问题是文件的重量还是音频文件的长度?在任何情况下,我认为解决方案是将其切成 5 秒或 10 秒或 30 秒的部分(因此,使用带有参数的函数来调整它将很方便)。
input_audio_file = "CLASE 9 HOMBRE MAQUINA.mp3"
speech, rate = librosa.load(input_audio_file, sr=16000)
最后是音频处理过程,这是我的 RAM 堵塞的地方,所以我需要一些帮助来创建某种循环,如果输入音频长于X 秒,则算法将此原始音频拆分为n 个部分X 秒(也许最后一部分较短,因为它小于 X 秒)。
在这里,我标记输入(在这种情况下,它是完整的音频,但我认为这将是最好的,如果他们从 X 秒持续时间的音频片段传递每个),我会配置包含 PyTorch 对象中的音频信息的张量。
这里的处理过程:
input_values = tokenizer(speech, return_tensors = 'pt').input_values
#Store logits (non-normalized predictions)
logits = model(input_values).logits
#Store predicted id's
predicted_ids = torch.argmax(logits, dim =-1)
#decode the audio to generate text
transcriptions = tokenizer.decode(predicted_ids[0])
#And finally I would print the text after this text-to-speech process
print(transcriptions)
这里导致连接关闭的 RAM 的饱和度(我想如果我在我的电脑上尝试这个音频文件的代码,它会冻结)
我认为对于这个问题,Wav2Vec2 algorith 操作可以作为程序将要工作的上下文的信息,但是我需要的是如何将音频分段并将其逐个部分发送到处理代码(也许可以方便地将其放在循环内调用的函数中),并在控制台中逐行打印转换为文本的内容。
我已经能够使用librosa
方法以秒为单位确定音频文件的长度,以决定是否拆分它
speech, rate = librosa.load(input_audio_file)
x = 10
len_data = len(speech) # holds length of the numpy array
duration_in_seconds = int( len_data / rate ) # returns duration in seconds but in floats
print(duration_in_seconds)
if(duration_in_seconds >= x):
#split the audio file in x secs audio chunks
else:
#dont split the audio file
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(52条)