利用DeepSeek进行代码调试,优化代码结构,提高代码的执行效率。

首先要明确优化目标,清洗阐述需要优化的方面,例如降低时间复杂度、空间复杂度、代码可读性等。

提示语示例:下列代码在处理大量数据时运行速度很慢,请优化代码结构降低时间复杂度,代码如下:

import subprocess
import os
import speech_recognition as sr
import imageio_ffmpeg as ffmpeg

def extract_audio_with_ffmpeg(video_path, audio_output="D:/program/DeepSeek/视频文件/temp_audio.wav"):
    """使用imageio-ffmpeg从视频中提取音频并保存为wav格式"""
    ffmpeg_path = ffmpeg.get_ffmpeg_exe()  # 获取ffmpeg的路径
    command = [
        ffmpeg_path, "-i", video_path, "-vn", "-acodec", "pcm_s16le", "-ar", "44100", "-ac", "2", audio_output
    ]
    try:
        subprocess.run(command, check=True)
        print(f"音频成功提取到 {audio_output}")
    except subprocess.CalledProcessError as e:
        print(f"提取音频时出错: {e}")
        return None
    return audio_output

def audio_to_text(audio_path, language="zh-CN"):
    """使用SpeechRecognition将音频转换为文字(支持中文)"""
    r = sr.Recognizer()

    try:
        with sr.AudioFile(audio_path) as source:
            audio = r.record(source)  # 加载整个音频文件

        # 使用Sphinx引擎进行离线语音识别
        text = r.recognize_sphinx(audio)
        return text
    except sr.UnknownValueError:
        return "无法识别音频"
    except sr.RequestError as e:
        return f"API请求失败: {e}"

def save_text_to_file(text, file_path):
    """将识别的文字保存到指定的文本文件"""
    with open(file_path, 'w', encoding='utf-8') as file:
        file.write(text)
    print(f"文字已保存到 {file_path}")

def main(video_file):
    # 步骤1:提取音频
    audio_file = extract_audio_with_ffmpeg(video_file)
    if not audio_file:
        return

    # 步骤2:语音识别
    result = audio_to_text(audio_file)

    # 将识别的文字保存到文件
    save_text_to_file(result, "recognized_text.txt")

    # 可选:删除临时音频文件
    if os.path.exists(audio_file):
        os.remove(audio_file)

    print("识别结果:")
    print(result)

if __name__ == "__main__":
    video_file = "D:/program/DeepSeek/视频文件/11.mp4"  # 替换为你的视频文件路径
    main(video_file)

大模型分析如下:

在处理大量数据时,代码运行速度慢的原因可能有多方面,比如视频音频提取过程、音频处理和语音识别等部分都可能是瓶颈。下面我提供一些优化建议,旨在提高运行效率,降低时间复杂度:

优化思路:

  1. 减少不必要的中间过程:如果提取的音频文件较大,且在多个视频中反复处理相同的部分(比如视频格式相同),你可以考虑缓存音频文件并重用,避免每次都重新提取音频。

  2. 并行化处理:如果是多个视频文件需要处理,可以考虑将提取音频和语音识别等任务并行化处理,从而提高整体效率。可以使用concurrent.futures模块来实现并行。

  3. 优化音频提取部分imageio-ffmpeg通过subprocess调用FFmpeg可能会导致一些性能损耗。考虑使用多线程或多进程来执行这些任务,以防止长时间阻塞。

  4. 优化语音识别过程:Sphinx虽然可以离线处理,但它的速度较慢,如果没有特别的需求,可以考虑使用一些更快速的API(例如Google的Speech-to-Text API)或并行处理。

优化后的代码:

import subprocess
import os
import speech_recognition as sr
import imageio_ffmpeg as ffmpeg
from concurrent.futures import ThreadPoolExecutor, as_completed

def extract_audio_with_ffmpeg(video_path, audio_output="D:/program/DeepSeek/视频文件/temp_audio.wav"):
    """使用imageio-ffmpeg从视频中提取音频并保存为wav格式"""
    ffmpeg_path = ffmpeg.get_ffmpeg_exe()  # 获取ffmpeg的路径
    command = [
        ffmpeg_path, "-i", video_path, "-vn", "-acodec", "pcm_s16le", "-ar", "44100", "-ac", "2", audio_output
    ]
    try:
        subprocess.run(command, check=True)
        print(f"音频成功提取到 {audio_output}")
    except subprocess.CalledProcessError as e:
        print(f"提取音频时出错: {e}")
        return None
    return audio_output

def audio_to_text(audio_path, language="zh-CN"):
    """使用SpeechRecognition将音频转换为文字(支持中文)"""
    r = sr.Recognizer()

    try:
        with sr.AudioFile(audio_path) as source:
            audio = r.record(source)  # 加载整个音频文件

        # 使用Sphinx引擎进行离线语音识别
        text = r.recognize_sphinx(audio)
        return text
    except sr.UnknownValueError:
        return "无法识别音频"
    except sr.RequestError as e:
        return f"API请求失败: {e}"

def save_text_to_file(text, file_path):
    """将识别的文字保存到指定的文本文件"""
    with open(file_path, 'w', encoding='utf-8') as file:
        file.write(text)
    print(f"文字已保存到 {file_path}")

def process_video(video_file):
    """处理单个视频的函数,提取音频、识别语音并保存文本"""
    # 步骤1:提取音频
    audio_file = extract_audio_with_ffmpeg(video_file)
    if not audio_file:
        return

    # 步骤2:语音识别
    result = audio_to_text(audio_file)

    # 将识别的文字保存到文件
    save_text_to_file(result, f"recognized_text_{os.path.basename(video_file)}.txt")

    # 可选:删除临时音频文件
    if os.path.exists(audio_file):
        os.remove(audio_file)

    print("识别结果:")
    print(result)

def main(video_files):
    # 使用线程池并行处理多个视频文件
    with ThreadPoolExecutor(max_workers=4) as executor:  # 根据系统性能调整max_workers
        futures = [executor.submit(process_video, video_file) for video_file in video_files]
        
        # 获取处理结果
        for future in as_completed(futures):
            future.result()  # 调用result()会阻塞,直到线程完成

if __name__ == "__main__":
    # 替换为你的视频文件路径列表
    video_files = [
        "D:/program/DeepSeek/视频文件/11.mp4", 
        "D:/program/DeepSeek/视频文件/12.mp4",
        "D:/program/DeepSeek/视频文件/13.mp4"
    ]
    main(video_files)

主要优化点:

  1. 并行化处理:使用ThreadPoolExecutor来并行处理多个视频文件。这样,当处理一个视频时,其他视频的音频提取和语音识别任务可以同时进行,大大提高处理速度。

  2. 改进存储路径:在保存识别结果时,使用os.path.basename(video_file)来根据视频文件的名字动态生成文本文件名,避免文件覆盖。

  3. 减少阻塞时间subprocess.run虽然同步执行,但你可以根据需求选择改成异步方式,以提高性能,尤其在多个视频文件需要处理时。

  4. 优化音频提取:如果音频提取和识别的时间非常长,可以考虑将音频提取和语音识别分开进行,或者考虑使用多进程(multiprocessing)进一步提高性能,尤其在多核CPU上。

附加建议:

  • 如果音频较长,建议对音频进行分段处理,以减小每次处理的负载。
  • 如果可能,使用高效的在线语音识别服务(如Google Speech-to-Text或Azure)来替代Sphinx,能大幅提高识别的速度和准确性。

通过这些优化,可以提高处理大量视频文件时的效率,尤其是在多视频文件的场景下。

Logo

一站式 AI 云服务平台

更多推荐