from moviepy.editor import VideoFileClip import os from vosk import Model, KaldiRecognizer def recognize_audio(audio_path, model_path): # 加载模型 model = Model(model_path) rec = KaldiRecognizer(model, 16000) # 读取音频文件 with open(audio_path, 'rb') as audio_file: while True: data = audio_file.read(4000) # 读取数据块 if len(data) == 0: break if rec.AcceptWaveform(data): text = rec.Result() if text != '': print("识别到: {}".format(text)) final_result = rec.FinalResult() if final_result != '': print("最终识别结果: {}".format(final_result)) return final_result def process_mp4_files(folder_path, model_path, subtitles_folder): # 确保字幕文件夹存在 os.makedirs(subtitles_folder, exist_ok=True) # 遍历文件夹中的所有MP4文件 for filename in os.listdir(folder_path): if filename.endswith(".mp4"): video_path = os.path.join(folder_path, filename) video = VideoFileClip(video_path) audio_path = video_path.replace('.mp4', '.wav') # 临时保存音频文件 # 提取音频 video.audio.write_audiofile(audio_path) # 识别音频 text = recognize_audio(audio_path, model_path) # 写入字幕文件 subtitle_path = os.path.join(subtitles_folder, os.path.splitext(filename)[0] + '.txt') with open(subtitle_path, 'w', encoding='utf-8') as f: f.write(text) # 清理 os.remove(audio_path) folder_path = 'D:/Env/venv/jyxt/脚本/数据处理/测试' model_path = 'D:/Env/venv/jyxt/脚本/数据处理/语音模型/vosk-model-cn-0.22' # 请替换为实际的模型文件夹路径 subtitles_folder = 'D:/Env/venv/jyxt/脚本/数据处理/字幕输出' # 处理文件 process_mp4_files(folder_path, model_path, subtitles_folder) print("模型路径:", model_path) # 打印模型路径以进行调试 # 处理文件 process_mp4_files(folder_path, model_path, subtitles_folder)
运行后显示:
D:\Env\venv\Scripts\python.exe D:/Env/venv/jyxt/脚本/数据处理/MP3output/生成字幕txt.py
chunk: 0%| | 0/16445 [00:00<?, ?it/s, now=None]MoviePy - Writing audio in D:/Env/venv/jyxt/脚本/数据处理/测试\第30章-会计报表第5节.wav
chunk: 99%|█████████▉| 16251/16445 [00:07<00:00, 2393.88it/s, now=None]MoviePy - Done.
ERROR (VoskAPI:Model():model.cc:122) Folder 'D:/Env/venv/jyxt/脚本/数据处理/语音模型/vosk-model-cn-0.22' does not contain model files. Make sure you specified the model path properly in Model constructor. If you are not sure about relative path, use absolute path specification.
Traceback (most recent call last):
File "D:/Env/venv/jyxt/脚本/数据处理/MP3output/生成字幕txt.py", line 62, in <module>
process_mp4_files(folder_path, model_path, subtitles_folder)
File "D:/Env/venv/jyxt/脚本/数据处理/MP3output/生成字幕txt.py", line 43, in process_mp4_files
text = recognize_audio(audio_path, model_path)
File "D:/Env/venv/jyxt/脚本/数据处理/MP3output/生成字幕txt.py", line 8, in recognize_audio
model = Model(model_path)
File "D:\Env\venv\lib\site-packages\vosk\__init__.py", line 57, in __init__
raise Exception("Failed to create a model")
Exception: Failed to create a model
Process finished with exit code 1
如何解决这个问题