视频转写+LLM分析:课堂录音自动化处理实现

目录

一、工具核心功能

二、核心技术栈

三、核心代码逐模块讲解

[3.1 类初始化与基础配置](#3.1 类初始化与基础配置)

[3.2 视频转音频核心方法](#3.2 视频转音频核心方法)

[3.3 讯飞 API 鉴权与交互](#3.3 讯飞 API 鉴权与交互)

[3.4 大模型智能文本优化](#3.4 大模型智能文本优化)

[3.5 结果导出与主流程](#3.5 结果导出与主流程)

[3.6 程序入口](#3.6 程序入口)

四、运行步骤

五、处理效果展示

六、总结与优化方向

[6.1 核心价值](#6.1 核心价值)

[6.2 优化方向](#6.2 优化方向)


在教育数字化转型的背景下,课堂视频的音频转写、师生对话梳理、教学活动识别成为刚需。手动处理视频转写不仅效率低下,还存在语音识别噪声、角色混淆、课堂活动标注繁琐等问题。

本文基于 Python 实现一套端到端课堂视频处理工具,整合视频转音频、讯飞语音识别、大模型文本优化、课堂活动智能识别、多格式结果导出功能,代码模块化封装,可直接落地使用,以下是完整技术实现详解。

一、工具核心功能

本工具封装为audio_to_data类,实现从 MP4 视频文件到结构化教学数据的全自动处理,核心能力如下:

  1. 视频转音频:提取 MP4 音频轨道,转换为讯飞 API 兼容的 WAV 格式,支持截取测试时长
  2. 讯飞语音识别:API 签名生成、音频上传、轮询获取识别结果,支持多发言人区分
  3. 智能文本处理:大模型过滤识别噪声、修正师生角色分配,自动识别课堂教学活动
  4. 多格式导出:生成原始识别 JSON、句子级 CSV、CV 专用 JSON,适配不同业务场景
  5. 异常防护:文件校验、目录自动创建、接口异常捕获,提升工具稳定性

二、核心技术栈

  • 音视频处理:moviepy 视频转音频
  • 语音识别:讯飞语音转写 API(lfasr)
  • 大模型调用:OpenAI SDK 兼容调用 DeepSeek-V3(阿里云通义千问兼容模式)
  • 网络请求:requests/httpx API 交互
  • 数据处理:json/csv/collections.Counter 结构化数据处理
  • 加密签名:hashlib/hmac/base64 讯飞接口鉴权

三、核心代码逐模块讲解

3.1 类初始化与基础配置

初始化阶段完成 API 密钥配置、客户端初始化,同时适配阿里云通义千问的 OpenAI 兼容接口,为后续大模型调用做准备。

python

运行

复制代码
class audio_to_data():
    def __init__(self, appid, secret_key, upload_file_path, llm_api, duration_seconds=None):
        self.appid = appid
        self.secret_key = secret_key
        self.client = Client()
        self.upload_file_path = upload_file_path
        self.llm_api = llm_api
        self.duration_seconds = duration_seconds
        self.sentences_activity = []
        self.sentences_paragraphs = []
        # 通义千问OpenAI兼容模式初始化
        self.llm = OpenAI(
            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
            api_key=self.llm_api,
        )

3.2 视频转音频核心方法

使用VideoFileClip提取视频音频,校验文件有效性、自动创建输出目录,音频编码严格遵循讯飞 API 要求的pcm_s16le,同时支持截取测试时长,降低调试成本。

复制代码
def movie_to_audio(self, mp4_file, wav_file, duration_seconds=None):
    if not os.path.exists(mp4_file):
        print(f"错误:输入文件不存在:{mp4_file}")
        return False
    # 自动创建输出目录
    output_dir = os.path.dirname(wav_file)
    if output_dir and not os.path.exists(output_dir):
        os.makedirs(output_dir)
    # 加载视频并提取音频
    video_clip = VideoFileClip(mp4_file)
    if duration_seconds:
        end_duration = min(duration_seconds, video_clip.duration)
        video_clip = video_clip.subclip(0, end_duration)
    audio_clip = video_clip.audio
    audio_clip.write_audiofile(wav_file, codec='pcm_s16le')
    # 释放资源
    audio_clip.close()
    video_clip.close()
    return True

3.3 讯飞 API 鉴权与交互

讯飞语音识别接口需要签名鉴权,通过MD5+HAMC-SHA1生成签名,完成音频上传后,轮询查询识别状态,直到获取最终结果。

  1. 签名生成

    def get_signa(self, ts):
    m2 = hashlib.md5((self.appid + ts).encode('utf-8')).hexdigest()
    signa = hmac.new(self.secret_key.encode(), bytes(m2, 'utf-8'), hashlib.sha1).digest()
    return base64.b64encode(signa).decode('utf-8')

  2. 音频上传

    def upload_file(self, ts, signa):
    file_len = os.path.getsize(self.upload_file_path)
    param_dict = {'appId': self.appid, 'signa': signa, 'ts': ts, "fileSize": file_len, "pd": "edu"}
    with open(self.upload_file_path, 'rb') as f:
    data = f.read()
    response = requests.post(lfasr_host + api_upload, params=param_dict, data=data)
    return json.loads(response.text) if response.status_code == 200 else None

  3. 轮询获取识别结果

    def get_recognition_result(self, ts, signa, order_id):
    param_dict = {'appId': self.appid, 'signa': signa, 'ts': ts, 'orderId': order_id}
    status = 3 # 3=处理中
    while status == 3:
    result = json.loads(requests.post(lfasr_host + api_get_result, params=param_dict).text)
    status = result['content']['orderInfo']['status']
    time.sleep(5)
    return result

3.4 大模型智能文本优化

这是工具的核心亮点,通过 DeepSeek-V3 实现两大核心能力:过滤语音识别噪声修正师生角色分配识别课堂教学活动,批量处理避免接口限流,精准适配课堂场景。

复制代码
def llm_filter(self, text):
    # 第一步:修复识别噪声
    prompt_fix = f"修复课堂转写文本噪声,保持CSV格式:{text}"
    response_fix = self.llm.chat.completions.create(model="deepseek-v3", messages=[{"role":"user","content":prompt_fix}])
    # 第二步:修正角色分配
    prompt_role = f"修正师生角色,仅修改说话人字段:{response_fix.choices[0].message.content}"
    response_role = self.llm.chat.completions.create(model="deepseek-v3", messages=[{"role":"user","content":prompt_role}])
    return response_role.choices[0].message.content

# 课堂活动识别
def _llm_identify_activity(self, sentences):
    prompt = f"分析课堂对话,插入≥30秒的学生活动标签,输出严格CSV格式:{sentences}"
    return self.llm.chat.completions.create(model="deepseek-v3", messages=[{"role":"user","content":prompt}]).choices[0].message.content

3.5 结果导出与主流程

将处理后的文本导出为时间轴 + 角色 + 内容 的 CSV 格式,同时生成 CV 专用 JSON,主流程process_audio_file串联所有环节,实现一键处理。

复制代码
def json_to_sentences_csv(self, json_file_path):
    output_csv_path = os.path.splitext(json_file_path)[0] + '_sentences.csv'
    with open(output_csv_path, 'w', encoding='utf-8-sig') as f:
        writer = csv.writer(f)
        writer.writerow(['时间', '角色', '内容'])
        for s in self.sentences_activity:
            writer.writerow([self.ms_to_mmss(s['start_ms']), s['spk'], s['text']])
    return output_csv_path

# 主流程:视频→音频→识别→处理→导出
def process_audio_file(self):
    # 视频转音频
    wav_file = os.path.join("audio", f"{os.path.splitext(os.path.basename(self.upload_file_path))[0]}.wav")
    self.movie_to_audio(self.upload_file_path, wav_file, self.duration_seconds)
    # 讯飞识别
    ts, signa = str(int(time.time())), self.get_signa(ts)
    upload_resp = self.upload_file(ts, signa)
    result = self.get_recognition_result(ts, signa, upload_resp['content']['orderId'])
    # 文本处理与导出
    if result['content']['orderInfo']['status'] == -1:
        json_path = self.save_processed_result(result)
        self._processing_sentences(json_path)
        csv_path = self.json_to_sentences_csv(json_path)
        return {"status": "success", "csv_path": csv_path}
    return {"status": "fail"}

3.6 程序入口

配置 API 密钥与视频路径,一键启动全流程处理:

复制代码
if __name__ == '__main__':
    # 替换为个人密钥
    APPID = "471f6433"
    SECRET_KEY = "你的api"
    LLM_API_KEY = "你的api"
    VIDEO_FILE_PATH = r"test.mp4"

    processor = audio_to_data(APPID, SECRET_KEY, VIDEO_FILE_PATH, LLM_API_KEY)
    res = processor.process_audio_file()
    print(json.dumps(res, ensure_ascii=False, indent=4))

四、运行步骤

  1. 安装依赖

    pip install moviepy httpx requests openai

  2. 配置密钥:替换代码中的讯飞 APPID、SECRET_KEY、大模型 API_KEY

  3. 放入视频 :将待处理 MP4 视频路径填入VIDEO_FILE_PATH

  4. 执行程序 :运行代码,自动生成audio(音频)、result(处理结果)目录

五、处理效果展示

工具最终输出的 CSV 文件格式清晰,包含时间轴、师生角色、转写文本、课堂活动标签,示例如下:

时间 角色 内容
00:05 老师 现在请大家自主思考这道题
00:10 学生 (自主思考活动,持续 40 秒)
00:50 老师 接下来我们一起讲解思路

同时输出的 JSON 文件包含完整的时间戳、角色统计、句子总数,可直接用于教学数据分析、CV 模型训练等场景。

六、总结与优化方向

6.1 核心价值

  1. 全流程自动化:从视频到结构化数据无需人工干预,效率提升 90% 以上
  2. 场景化适配:针对课堂教学优化,自动区分师生、识别教学活动
  3. 高兼容性:多格式导出,适配教学分析、数据标注、二次开发等场景

6.2 优化方向

  1. 增加日志系统,替代 print 输出,便于问题排查
  2. 支持更多音视频格式(MOV、MKV 等),扩展适用范围
  3. 优化大模型批量逻辑,降低 API 调用成本
  4. 增加 GUI 界面,非技术人员也可便捷使用

本工具基于 Python 生态成熟组件实现,代码可读性强、扩展性高,可直接应用于教育视频处理、课堂数据分析等场景,也可根据业务需求二次开发定制功能。

相关推荐
坚果派·白晓明2 小时前
在 macOS 中搭建鸿蒙 PC 三方库交叉编译开发环境
macos·华为·harmonyos
2501_915918412 小时前
有没有Xcode 替代方案?在快蝎 IDE 中完成 iOS 开发的过程
ide·vscode·ios·个人开发·xcode·swift·敏捷流程
blackorbird2 小时前
通过攻陷合法网站传播的新型iOS漏洞利用工具包DarkSword
macos·ios·objective-c·cocoa
for_ever_love__5 小时前
Objective-C学习 NSSet 和 NSMutableSet 功能详解
开发语言·学习·ios·objective-c
ricky_fan17 小时前
(OpenAI)Codex 安装、部署使用方式
python·macos·conda·vim
songgeb17 小时前
Compositional layout in iOS
ios·swift·设计
UTF_818 小时前
iOS动画浅谈
ios·客户端
2501_9160074719 小时前
HTTPS 抓包的流程,代理抓包、设备数据线直连抓包、TCP 数据分析
网络协议·tcp/ip·ios·小程序·https·uni-app·iphone
音源部落20 小时前
Cubase15 R2R/VR一键安装完整版本下载安装Nuendo 14最新版本下载安装支持Win/Mac 双系统版本加104G原厂音源Mac系统不关SIP安装编曲软件Cubase 15.0.10下载
macos·vr·cubase·cubase15·nuendo·nuendo14