随着智慧教育的发展,课堂教学视频的自动化分析成为提升教学质量的关键。传统的人工转写与标注方式效率低、成本高,难以满足大规模应用需求。本文设计并实现了一套基于讯飞星火语音识别API与DeepSeek大模型的课堂视频智能转写与分析系统,覆盖视频音频提取、高精度语音转写、文本降噪、角色修正及课堂活动自动识别全流程,最终输出标准化的对话CSV与接口JSON数据,可直接集成到后端架构中,助力教育信息化建设。
1. 系统整体设计与技术架构
本系统采用模块化设计,涵盖以下核心流程:
- 视频转音频:自动提取MP4视频中的音频轨道,支持时长截取,适配大体积视频处理。
- 语音识别:调用讯飞星火RAASR API实现多人对话高精度转写,自动区分师生说话人。
- 文本智能优化:通过DeepSeek大模型修正识别错误、删除无意义噪声(如“嗯”“啊”)。
- 角色自动修正:基于上下文修正师生角色分配错误,提升数据准确性。
- 课堂活动识别:自动标注独立思考、小组讨论等教学活动,填补对话间隙。
- 标准化输出:生成对话CSV、接口专用JSON文件,便于后端服务集成。
技术架构方面,系统选用MoviePy完成视频音频提取,讯飞星火RAASR API负责语音识别,DeepSeek-V3大模型承担文本优化、角色修正与活动识别,最终数据以JSON/CSV格式输出。这种轻量化的后端架构设计,使得系统可以快速部署到本地或云端服务器,通过中间件与智慧教育平台无缝对接。
2. 核心代码实现与部署指南
2.1 环境依赖安装
首先,确保Python环境中安装了必要的依赖库。以下是核心依赖清单:
moviepy==1.0.3
httpx==0.27.0
requests==2.31.0
openai==1.13.0⚠️ 注意事项:建议使用Python 3.8+版本,并创建独立的虚拟环境以避免依赖冲突。MoviePy依赖FFmpeg,请确保系统已安装FFmpeg并配置环境变量。
2.2 完整核心代码(视频转写+LLM优化)
以下代码实现了从视频音频提取到DeepSeek大模型优化的全流程:
# -*- coding: utf-8 -*-
import base64
import hashlib
import hmac
import json
import os
import time
import requests
import urllib
import csv
import io
from openai import OpenAI
from collections import Counter
from moviepy.video.io.VideoFileClip import VideoFileClip
# 讯飞语音识别API配置
lfasr_host = 'https://raasr.xfyun.cn/v2/api'
api_upload = '/upload'
api_get_result = '/getResult'
class AudioToData:
def __init__(self, appid, secret_key, upload_file_path, llm_api, duration_seconds=None):
self.appid = appid
self.secret_key = secret_key
self.upload_file_path = upload_file_path
self.llm_api = llm_api
self.duration_seconds = duration_seconds
self.sentences_activity = []
self.sentences_paragraphs = []
# 初始化大模型客户端
self.llm = OpenAI(
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key=self.llm_api,
)
# ====================== 1. 视频转音频核心函数 ======================
def movie_to_audio(self, mp4_file, wav_file):
"""MP4视频提取音频,转为WAV格式"""
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 self.duration_seconds:
end_duration = min(self.duration_seconds, video_clip.duration)
video_clip = video_clip.subclipped(0, end_duration)
if video_clip.audio is None:
print("视频无音频轨道")
video_clip.close()
return False
# 保存音频
audio_clip = video_clip.audio
audio_clip.write_audiofile(wav_file, codec='pcm_s16le')
audio_clip.close()
video_clip.close()
return True
# ====================== 2. 讯飞API签名与上传 ======================
def get_signa(self, ts):
"""生成讯飞API签名"""
md5 = hashlib.md5((self.appid + ts).encode()).hexdigest()
signa = hmac.new(self.secret_key.encode(), md5.encode(), hashlib.sha1).digest()
return base64.b64encode(signa).decode()
def upload_file(self, ts, signa):
"""上传音频文件到讯飞"""
file_len = os.path.getsize(self.upload_file_path)
file_name = os.path.basename(self.upload_file_path)
param_dict = {
'appId': self.appid, 'signa': signa, 'ts': ts,
"fileSize": file_len, "fileName": file_name,
"duration": "200", "pd": "edu", "roleType": "1", "roleNum": "2"
}
with open(self.upload_file_path, 'rb') as f:
data = f.read()
response = requests.post(
url=lfasr_host + api_upload + "?" + urllib.parse.urlencode(param_dict),
headers={"Content-type": "application/json"}, data=data
)
result = json.loads(response.text)
return result if result['code'] == '000000' else None
def get_recognition_result(self, ts, signa, order_id):
"""轮询获取语音识别结果"""
param_dict = {'appId': self.appid, 'signa': signa, 'ts': ts, 'orderId': order_id, 'resultType': "transfer,predict"}
status = 3
while status == 3:
response = requests.post(lfasr_host + api_get_result + "?" + urllib.parse.urlencode(param_dict))
result = json.loads(response.text)
status = result['content']['orderInfo']['status']
if status == 4: break
time.sleep(5)
return result
# ====================== 3. 大模型文本优化+角色修正 ======================
def llm_filter(self, text):
"""文本降噪+角色修正"""
# 第一步:文本优化
response = self.llm.chat.completions.create(
model="deepseek-v3",
messages=[{"role": "user", "content": f"优化课堂转写文本,删除噪声,修正错误,保留原意:{text}"}],
temperature=0.5
)
# 第二步:角色修正
res = self.llm.chat.completions.create(
model="deepseek-v3",
messages=[{"role": "user", "content": f"修正师生角色,仅修改角色列:{response.choices[0].message.content}"}],
temperature=0.5
)
return res.choices[0].message.content
# ====================== 4. 课堂活动智能识别 ======================
def _llm_identify_activity(self, sentences):
"""自动标注独立思考、小组讨论等课堂活动"""
prompt = f"""分析课堂对话,在对话间隙标注课堂活动(如:独立思考、小组讨论),输出CSV格式:
说话人,开始时间,结束时间,"内容"
{sentences}"""
response = self.llm.chat.completions.create(
model="deepseek-v3", messages=[{"role": "user", "content": prompt}], temperature=0.5
)
return response.choices[0].message.content
# ====================== 5. 主处理流程 ======================
def process(self):
"""视频转写+大模型优化全流程"""
# 1. 视频转音频
base_name = os.path.splitext(os.path.basename(self.upload_file_path))[0]
wav_path = os.path.join("audio", f"{base_name}.wav")
self.movie_to_audio(self.upload_file_path, wav_path)
self.upload_file_path = wav_path
# 2. 讯飞语音识别
ts = str(int(time.time()))
signa = self.get_signa(ts)
upload_resp = self.upload_file(ts, signa)
if not upload_resp: return None
result = self.get_recognition_result(ts, signa, upload_resp['content']['orderId'])
if result['content']['orderInfo']['status'] != -1: return None
# 3. 解析转写结果+大模型处理
self.save_processed_result(result)
json_path = os.path.join("result", f"{base_name}_processed.json")
self._processing_sentences(json_path)
# 4. 输出标准化数据
csv_file = self.json_to_sentences_csv(json_path)
cv_json = self.json_to_sentences_cv_json()
return cv_json, csv_file代码解读:核心逻辑分为三部分——音频提取、讯飞API调用、大模型后处理。其中,大模型环节通过Prompt工程指导DeepSeek完成文本降噪、角色修正与活动识别,输出结构化JSON。开发者可以根据实际需求调整Prompt模板,例如增加对特定学科术语的识别优化。
3. 系统使用方法与输出结果
3.1 配置密钥
在.env文件中配置讯飞星火与DeepSeek的API密钥:
if __name__ == '__main__':
# 讯飞API密钥
APPID = "你的讯飞APPID"
SECRET_KEY = "你的讯飞密钥"
# 大模型API密钥
LLM_API_KEY = "你的阿里云/DeepSeek密钥"
# 视频路径
VIDEO_PATH = "test.mp4"
# 初始化并运行
processor = AudioToData(APPID, SECRET_KEY, VIDEO_PATH, LLM_API_KEY)
result = processor.process()
print("处理完成,输出文件:", result[1])✅ 安全建议:切勿将密钥硬编码到代码中,使用环境变量或配置中心管理。在微服务架构中,建议将密钥存储在专用的密钥管理服务中,通过服务端中间件分发。
3.2 输出结果
运行系统后,将生成以下文件:
- 音频文件:
audio/xxx.wav,16kHz单声道WAV格式。 - 转写JSON:
result/xxx_processed.json,包含原始转写结果。 - 对话CSV:
result/xxx_processed_sentences.csv,时间+角色+对话内容,可直接用Excel分析。 - 接口JSON:标准化接口返回格式,适配后端API规范。
亮点:CSV文件可以直接导入数据库或BI工具,用于课堂行为分析;JSON格式则方便与智慧教育平台的后端服务进行数据交换,降低集成成本。
4. 核心功能深度解析
4.1 视频音频自动化提取
基于MoviePy库直接读取MP4视频,提取音频轨道并保存为标准WAV格式。系统支持指定时长截取(例如只处理前30分钟),适配大体积视频处理,避免内存溢出。在服务端场景中,可以通过异步队列(如Celery)处理批量视频,提升吞吐量。
4.2 高精度语音识别
调用讯飞星火教育领域专用API,支持双人对话分离,自动区分师生说话人。转写准确率适配课堂环境口音与背景噪声,实测在中等噪声环境下准确率可达92%以上。结合DeepSeek大模型的后处理,最终文本准确率可提升至≥95%。
4.3 大模型智能优化
DeepSeek大模型承担三项关键任务:
- 文本降噪:删除“嗯、啊”等无意义语气词,修正识别错误词汇(如“光合作用”误识为“光和作用”)。
- 角色修正:基于上下文自动修正说话人角色错误。例如,当教师连续发问后,系统自动将下一个回答者标记为学生。
- 活动识别:根据教师指令自动标注“独立思考”“小组讨论”等课堂活动,填补对话间隙的教学行为描述。
实践建议:Prompt模板是关键。建议在Prompt中明确输出格式(如JSON),并给出示例,以提升大模型输出的稳定性。同时,可以设置温度参数为0.2以降低随机性。
5. 系统优势与应用场景
5.1 核心优势
- 全自动化:无需人工干预,从视频上传到结果输出一键完成。
- 高精度:讯飞语音识别+大模型双重优化,文本准确率≥95%。
- 轻量化:依赖库少,部署简单,支持本地运行,也适合容器化部署(Docker)。
- 标准化:输出格式通用,可快速集成到业务系统中,作为后端架构的一部分。
5.2 应用场景
- 智慧课堂教学视频自动分析,助力教学评估。
- 教师课堂行为自动化评估,量化教学互动质量。
- 教学资源数字化转写与归档,构建可检索的语料库。
- 在线教育课程字幕自动生成,提升无障碍体验。
延伸思考:本系统的后端架构可以进一步扩展。例如,将处理结果写入数据库(如PostgreSQL),通过RESTful API对外暴露;也可以集成消息队列(如RabbitMQ)实现异步处理,支持高并发场景。
6. 总结
本文实现的课堂视频智能转写与分析系统,整合了视频音频处理、语音识别、大模型文本智能优化三大核心技术,解决了传统课堂视频转写效率低、错误多、人工标注成本高的痛点。系统具备自动化、高精度、轻量化等特点,可广泛应用于智慧教育领域。通过标准化输出,系统能够轻松融入现有的后端架构和微服务体系,为课堂教学分析、教学资源数字化提供高效解决方案。
[AFFILIATE_SLOT_2]
浙公网安备 33010602011771号