对于长视频转化出现乱序现象
Opened this issue · 1 comments
建议修改speech2text.py文件:
import whisper
import os
whisper_model = None
def is_cuda_available():
return whisper.torch.cuda.is_available()
def load_whisper(model="tiny"):
global whisper_model
whisper_model = whisper.load_model(model, device="cuda" if is_cuda_available() else "cpu")
print("Whisper模型:"+model)
def run_analysis(filename, model="tiny", prompt="以下是普通话的句子。"):
global whisper_model
print("正在加载Whisper模型...")
# 读取列表中的音频文件并排序
audio_dir = f"audio/slice/{filename}"
audio_list = os.listdir(audio_dir)
# 过滤出mp3文件并按数字排序
audio_list = [fn for fn in audio_list if fn.endswith('.mp3')]
audio_list.sort(key=lambda x: int(os.path.splitext(x)[0]))
print("加载Whisper模型成功!")
# 创建outputs文件夹
os.makedirs("outputs", exist_ok=True)
print("正在转换文本...")
i = 1
for fn in audio_list:
print(f"正在转换第{i}/{len(audio_list)}个音频... {fn}")
# 识别音频
result = whisper_model.transcribe(os.path.join(audio_dir, fn), initial_prompt=prompt)
print("".join([segment["text"] for segment in result["segments"] if segment is not None]))
with open(f"outputs/{filename}.txt", "a", encoding="utf-8") as f:
f.write("".join([segment["text"] for segment in result["segments"] if segment is not None]))
f.write("\n")
i += 1
————————————————————————————————————————————
修改说明:
——过滤和排序音频文件:
audio_list = [fn for fn in audio_list if fn.endswith('.mp3')]
audio_list.sort(key=lambda x: int(os.path.splitext(x)[0]))
过滤:首先过滤出所有以 .mp3 结尾的文件,避免处理非音频文件。
排序:使用 sort 方法,并通过 lambda 函数提取文件名中的数字部分进行排序。os.path.splitext(x)[0] 获取文件名(去除扩展名),然后 int() 转换为整数进行数值排序。
——路径拼接:
result = whisper_model.transcribe(os.path.join(audio_dir, fn), initial_prompt=prompt)
使用 os.path.join 拼接路径,增加代码的可读性和跨平台兼容性。