先日自動化業務で、Whisperで音声ファイル読み込み時に「FileNotFoundError:指定されたファイルが見つかりません。」となり原因の特定に少し苦労したので解決法をメモしておきます
関連記事【Python】whisperを使って音声動画からsrt形式の字幕ファイルを生成する
コード
import whisper model = whisper.load_model("large") path = "sample.mp3" result = model.transcribe(path, verbose=True, language='ja') print(result["text"])
エラーメッセージ
FileNotFoundError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_4848/290471416.py in 5 path = ".\\testsample.mp3" 6 ----> 7 result = model.transcribe(path, verbose=True, language='ja') 8 print(result["text"]) ~\anaconda3\envs\pip-env\lib\site-packages\whisper\transcribe.py in transcribe(model, audio, verbose, temperature, compression_ratio_threshold, logprob_threshold, no_speech_threshold, condition_on_previous_text, **decode_options) 82 decode_options["fp16"] = False 83 ---> 84 mel = log_mel_spectrogram(audio) 85 86 if decode_options.get("language", None) is None: ~\anaconda3\envs\pip-env\lib\site-packages\whisper\audio.py in log_mel_spectrogram(audio, n_mels) 109 if not torch.is_tensor(audio): 110 if isinstance(audio, str): --> 111 audio = load_audio(audio) 112 audio = torch.from_numpy(audio) 113 ~\anaconda3\envs\pip-env\lib\site-packages\whisper\audio.py in load_audio(file, sr) 42 ffmpeg.input(file, threads=0) 43 .output("-", format="s16le", acodec="pcm_s16le", ac=1, ar=sr) ---> 44 .run(cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True) 45 ) 46 except ffmpeg.Error as e: ~\anaconda3\envs\pip-env\lib\site-packages\ffmpeg\_run.py in run(stream_spec, cmd, capture_stdout, capture_stderr, input, quiet, overwrite_output) 318 pipe_stderr=capture_stderr, 319 quiet=quiet, --> 320 overwrite_output=overwrite_output, 321 ) 322 out, err = process.communicate(input) ~\anaconda3\envs\pip-env\lib\site-packages\ffmpeg\_run.py in run_async(stream_spec, cmd, pipe_stdin, pipe_stdout, pipe_stderr, quiet, overwrite_output) 283 stderr_stream = subprocess.PIPE if pipe_stderr or quiet else None 284 return subprocess.Popen( --> 285 args, stdin=stdin_stream, stdout=stdout_stream, stderr=stderr_stream 286 ) 287 ~\anaconda3\envs\pip-env\lib\subprocess.py in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors, text) 798 c2pread, c2pwrite, 799 errread, errwrite, --> 800 restore_signals, start_new_session) 801 except: 802 # Cleanup if the child failed starting. ~\anaconda3\envs\pip-env\lib\subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, unused_restore_signals, unused_start_new_session) 1205 env, 1206 os.fspath(cwd) if cwd is not None else None, -> 1207 startupinfo) 1208 finally: 1209 # Child is launched. Close the parent's copy of those pipe FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
ファイルが見つからないということは単純に読み込むMP3のパスが間違えていたのかなと思いきやMP3のパスは何度確認しても一致しており途方に暮れていました
原因
原因はWhisperの内部で使用されている「ffmpeg」が使用されていなかったことでした。ファイルが見つからないというのは読み込む音声ファイルのパスではなく「指定された(ffmpegの)ファイルが見つかりません。」という意味のメッセージだったようです。
下記サイトを参照して「ffmpeg」をダウンロードし、ファイルのパスを環境変数に通してPCを再起動したところ正常に動作しました(WINDOWSにて)
【5分でできる】Windowsにffmpegをインストールしてパスを通す方法を解説
どのffmpegをダウンロードすればよいかや、環境変数にffmpegを追加してPATHを設定する方法を丁寧に画像付きで解説します。きちんとインストールできたか簡単に確認する方法も紹介します。 1,公式サイトからffmpegをダウンロード ど
コメント