OpenAI 的 Whisper 提供漂亮、干净的成绩单。现在我希望它能生成更多原始记录,其中还包含填充词(ah、mh、mhm、uh、oh 等)。这里的帖子告诉我,可以通过将标准化设置为 false:https://huggingface.co/spaces/openai/whisper/discussions/30
我设法使用了这段代码,但我只得到了耳语转录 30 秒。如何让它处理更长的音频文件?
请注意,我是一个耳语和Python的初学者。
到目前为止我所做的:我主要使用来自 https://huggingface.co/spaces/openai/whisper/discussions/30 的代码由于我不想使用虚拟数据集,所以我加载本地数据集带有库的 mp3。我想还有其他方法可以做到这一点,我对此持开放态度。
据我了解,指示耳语处理器对于停用标准化是必要的。因此,这里使用的不是耳语 (
import whisper
),而是通过 transformers
耳语。相关开关是normalize = False
。
我的代码(myscript.py):
from transformers import WhisperProcessor, WhisperForConditionalGeneration
import librosa
speech, _ = librosa.load("myaudio.mp3", sr=16000, mono=True)
processor = WhisperProcessor.from_pretrained("openai/whisper-large")
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large")
model.config.forced_decoder_ids = processor.get_decoder_prompt_ids(language = "de", task = "transcribe")
input_features = processor(speech, return_tensors="pt", sampling_rate=16000).input_features
predicted_ids = model.generate(input_features)
transcription = processor.batch_decode(predicted_ids, skip_special_tokens = True, normalize = False)
print(transcription)
到目前为止效果很好。然而,只转录了前 30 秒。
可以使用
pipeline
转录较长的音频文件,如此处所述:
Whisper 模型本质上是为处理持续时间长达 30 秒的音频样本而设计的。然而,通过使用分块算法,它可以用于转录任意长度的音频样本。这可以通过 Transformers 管道方法实现。
根据这个网页,代码是
import torch
from transformers import pipeline
from datasets import load_dataset
device = "cuda:0" if torch.cuda.is_available() else "cpu"
pipe = pipeline(
"automatic-speech-recognition",
model="openai/whisper-base",
chunk_length_s=30,
device=device,
)
ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
sample = ds[0]["audio"]
prediction = pipe(sample.copy())["text"]
# we can also return timestamps for the predictions
prediction = pipe(sample, return_timestamps=True)["chunks"]
现在我在将我的代码与此代码组合时遇到问题。如何加载本地 mp3 而不是数据集? (librosa 在这里似乎不起作用。)在哪里可以将标准化设置为 false?
要使用本地文件运行 OpenAI Whisper 管道,只需使用
prediction = pipe("myaudio.mp3")
(假设 audio.mp3
位于您的工作目录中。
浏览
pipeline()
文档,似乎没有一种直接的方法将 normalize = False
传递给底层处理器。
您可以更深入地研究
pipeline()
类,进行一些自定义黑客攻击,从而获得访问权限,或者您可以使用 WhisperProcessor
和 WhisperForConditionalGeneration
类进行转录,恢复到最初的方法。
但是,使用这种方法,您需要自己将音频分成 30 秒的块(因为此函数与您没有使用的
pipeline
类捆绑在一起,因为它不允许您设置 normalize = False
) .