如何在整个目录上运行 Whisper?

问题描述 投票:0回答:2

我想使用 Whisper 将语音转录为文本。我已经能够使用以下命令在单个文件上成功运行它:

whisper audio.wav

我想在桌面上一个名为“Audio”的目录中的大量文件上运行它。我尝试将其写入Python,如下所示:

import whisper
import os

model = whisper.load_model("base")

for filename in os.listdir('Audio'):   
    model.transcribe(filename)   

它似乎启动了,但随后给了我一些关于“没有这样的文件或目录”的错误。有什么方法可以纠正这个问题,以便在我的音频目录中的所有 .wav 文件上运行 Whisper?

错误:

/opt/homebrew/lib/python3.10/site-packages/whisper/transcribe.py:78: UserWarning: FP16 is not supported on CPU; using FP32 instead
  warnings.warn("FP16 is not supported on CPU; using FP32 instead")
/opt/homebrew/lib/python3.10/site-packages/whisper/transcribe.py:78: UserWarning: FP16 is not supported on CPU; using FP32 instead
  warnings.warn("FP16 is not supported on CPU; using FP32 instead")
Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.10/site-packages/whisper/audio.py", line 42, in load_audio
    ffmpeg.input(file, threads=0)
  File "/opt/homebrew/lib/python3.10/site-packages/ffmpeg/_run.py", line 325, in run
    raise Error('ffmpeg', out, err)
ffmpeg._run.Error: ffmpeg error (see stderr output for detail)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/user/Desktop/transcribe.py", line 7, in <module>
    model.transcribe(filename)
  File "/opt/homebrew/lib/python3.10/site-packages/whisper/transcribe.py", line 84, in transcribe
    mel = log_mel_spectrogram(audio)
  File "/opt/homebrew/lib/python3.10/site-packages/whisper/audio.py", line 111, in log_mel_spectrogram
    audio = load_audio(audio)
  File "/opt/homebrew/lib/python3.10/site-packages/whisper/audio.py", line 47, in load_audio
    raise RuntimeError(f"Failed to load audio: {e.stderr.decode()}") from e
RuntimeError: Failed to load audio: ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers
  built with Apple clang version 14.0.0 (clang-1400.0.29.202)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon
  libavutil      57. 28.100 / 57. 28.100
  libavcodec     59. 37.100 / 59. 37.100
  libavformat    59. 27.100 / 59. 27.100
  libavdevice    59.  7.100 / 59.  7.100
  libavfilter     8. 44.100 /  8. 44.100
  libswscale      6.  7.100 /  6.  7.100
  libswresample   4.  7.100 /  4.  7.100
  libpostproc    56.  6.100 / 56.  6.100
221211_1834.wav: No such file or directory
audio speech-to-text openai-whisper
2个回答
2
投票

这是您的一个选择。它执行以下操作:

1 - 查找“根文件夹”和子文件夹中的所有 .wav 文件。您需要将其更改为您的“音频”文件夹位置。

2 - 在转录文件时显示进度条(使用 tqdm 完成)。

3 - 将包含转录的 .txt 文件保存在 .wav 文件旁边。

代码:

import os
import whisper
from tqdm import tqdm

# Define the folder where the wav files are located
root_folder = "/Users/downloads"

# Set up Whisper client
print("Loading whisper model...")
model = whisper.load_model("base")
print("Whisper model complete.")

# Get the number of wav files in the root folder and its sub-folders
print("Getting number of files to transcribe...")
num_files = sum(1 for dirpath, dirnames, filenames in os.walk(root_folder) for filename in filenames if filename.endswith(".wav"))
print("Number of files: ", num_files)

# Transcribe the wav files and display a progress bar
with tqdm(total=num_files, desc="Transcribing Files") as pbar:
    for dirpath, dirnames, filenames in os.walk(root_folder):
        for filename in filenames:
            if filename.endswith(".wav"):
                filepath = os.path.join(dirpath, filename)
                result = model.transcribe(filepath, fp16=False, verbose=True)
                transcription = result['text']
                # Write transcription to text file
                filename_no_ext = os.path.splitext(filename)[0]
                with open(os.path.join(dirpath, filename_no_ext + '.txt'), 'w') as f:
                    f.write(transcription)
                pbar.update(1)

0
投票

您的代码运行良好,但如何将默认检测语言设置为英语?我对如何用 python 编码一无所知,但我知道它需要去某个地方。请帮忙。我有一百万个文件需要转录,而 Whisper 使用的是威尔士语。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.