MAO (Media Analysis Optimizer) 是一个综合性的媒体内容分析系统,能够自动处理视频、音频等媒体内容,提取关键信息,并生成结构化的数据输出。系统集成了人脸识别、语音识别、字幕提取和文本处理等多种技术,适用于影视内容分析、字幕生成、视频归档等多种场景。
-
人脸处理:
- 人脸检测与提取
- 基于LGCN的人脸分组
- 人脸识别与标注
- 群组优化与管理
-
音频处理:
- 音频提取与降噪
- 说话人验证与分析
- 音频模板匹配
- 音频分割与分组
-
自动语音识别 (ASR):
- 视频转MP3转换
- FunASR引擎支持
- 支持热词优化
- 说话人分离
-
光学字符识别 (OCR):
- 视频帧提取
- 字幕位置智能识别
- 文本校正与优化
- OCR与ASR结果融合
-
脚本生成:
- 根据提取的文本生成脚本
- 文本质量评估
- 脚本格式化输出
-
API服务:
- RESTful API接口
- MongoDB数据库集成
- 系列、剧集、音频、帧、脚本和任务管理
- Flask Web服务
MAO系统提供了完整的RESTful API接口,可以通过HTTP请求方式来管理和处理媒体内容。
API服务使用MongoDB作为数据库,需要先设置环境变量。在api目录下创建.env文件:
MONGODB_URI=mongodb://localhost:27017/mao
UPLOAD_FOLDER=D:/Work/MAO/uploads
URL=http://localhost:5000
cd api
python app.py启动后,API服务将在默认端口5000上运行。
# 获取所有系列
GET /series
# 获取特定系列详情
GET /series/{series_id}
# 创建新系列
POST /series/addSeries
参数:
- seriesName: 系列名称
- seriesIntroduction: 系列介绍
- seriesTag: 系列标签(可多个)
# 更新系列信息
PUT /series/updateSeries
参数:
- seriesID: 系列ID
- seriesName: 系列名称(可选)
- seriesIntroduction: 系列介绍(可选)
- seriesTag: 系列标签(可选,可多个)
# 删除系列
DELETE /series/deleteSeries
参数:
- seriesID: 系列ID# 获取所有剧集
GET /episode
# 获取特定系列的所有剧集
GET /episode/getBySeries?seriesID={series_id}
# 上传剧集视频
POST /episode/addEpisode
参数:
- seriesID: 系列ID
- episodeName: 剧集名称
- episodeVideo: 视频文件(multipart/form-data)
# 视频转换为MP3
POST /episode/convertToAudio
参数:
- episodeID: 剧集ID
# 视频抽帧
POST /episode/extractFrames
参数:
- episodeID: 剧集ID
- frameRate: 抽帧频率(可选,默认为1)# 获取所有音频记录
GET /audio
# 获取特定剧集的音频记录
GET /audio/getByEpisode?episodeID={episode_id}
# 处理ASR(自动语音识别)
POST /audio/processASR
参数:
- audioID: 音频ID
- hotword: 热词(可选)
- people: 人物字典(可选)
# 更新音频记录
PUT /audio/updateAudio
参数:
- audioID: 音频ID
- audioName: 音频名称(可选)
- audioPath: 音频路径(可选)# 获取所有帧记录
GET /frames
# 获取特定剧集的帧记录
GET /frames/getByEpisode?episodeID={episode_id}
# 处理OCR(光学字符识别)
POST /frames/processOCR
参数:
- frameID: 帧ID
- mode: OCR模式(可选,默认为'mobile')
- dropScore: 分数阈值(可选,默认为0.5)# 获取所有脚本记录
GET /scripts
# 获取特定剧集的脚本记录
GET /scripts/getByEpisode?episodeID={episode_id}
# 生成剧本
POST /scripts/generateScript
参数:
- episodeID: 剧集ID
- ocrJsonPath: OCR结果JSON路径
- asrJsonPath: ASR结果JSON路径(可选)# 执行完整工作流
POST /task/runWorkflow
参数:
- episodeID: 剧集ID
- hotword: 热词(可选)
- people: 人物字典(可选)import requests
# 创建新系列
def create_series():
url = "http://localhost:5000/series/addSeries"
data = {
"seriesName": "测试系列",
"seriesIntroduction": "这是一个测试系列",
"seriesTag": ["测试", "演示"]
}
response = requests.post(url, data=data)
return response.json()
# 上传剧集视频
def upload_episode(series_id, video_path):
url = "http://localhost:5000/episode/addEpisode"
data = {
"seriesID": series_id,
"episodeName": "测试剧集"
}
files = {
"episodeVideo": open(video_path, "rb")
}
response = requests.post(url, data=data, files=files)
return response.json()
# 执行完整处理工作流
def run_workflow(episode_id):
url = "http://localhost:5000/task/runWorkflow"
data = {
"episodeID": episode_id,
"hotword": "测试关键词",
"people": {"0": "测试人物"}
}
response = requests.post(url, data=data)
return response.json()更多详细示例请参阅 API示例目录,其中包含了完整的Python客户端实现。
# 创建新系列
curl -X POST http://localhost:5000/series/addSeries \
-F "seriesName=测试系列" \
-F "seriesIntroduction=这是一个测试系列" \
-F "seriesTag=测试" \
-F "seriesTag=演示"
# 上传剧集视频
curl -X POST http://localhost:5000/episode/addEpisode \
-F "seriesID=<系列ID>" \
-F "episodeName=测试剧集" \
-F "episodeVideo=@/path/to/video.mp4"
# 执行完整处理工作流
curl -X POST http://localhost:5000/task/runWorkflow \
-F "episodeID=<剧集ID>" \
-F "hotword=测试关键词" \
-F "people[0]=测试人物"API服务会返回标准的HTTP状态码:
- 200: 请求成功
- 400: 请求参数错误
- 404: 资源不存在
- 500: 服务器内部错误
错误响应格式:
{
"error": "错误详情"
}- Python 3.8+
- CUDA环境 (推荐用于加速处理)
- FFmpeg (用于视频处理)
-
克隆仓库:
git clone https://github.com/yourusername/MAO.git cd MAO -
创建虚拟环境 (可选但推荐):
python -m venv venv # Windows venv\Scripts\activate # Linux/Mac source venv/bin/activate
-
安装依赖:
pip install -r requirements.txt
-
安装额外组件:
- FFmpeg (确保已添加到系统PATH)
- Demucs (用于音频分离):
pip install demucs
-
修改
main.py中的路径和参数:video_name = "your_video_name" episode = "episode_number" video_path = "path/to/your/video.mp4" people = {0: "人物名称"} hotword = "关键词"
-
运行主程序:
python main.py
处理流程包含以下步骤:
- 视频转MP3转换
- ASR语音识别处理
- 视频帧提取
- 字幕OCR识别
- 智能识别字幕位置
- OCR文本处理与校正
- OCR与ASR结果对齐与融合
- 剧本生成
- 质量评估
# 人脸检测与提取
from face.extract_face import detect_face
# 检测图像中的人脸并保存
image_path = "img/sample.jpg"
output_folder = "output/faces/"
detect_face(image_path, output_folder)
# 基于LGCN的人脸分组
from face.lgcn_dbscan_group import group_faces, extract_face_features, create_graph
# 提取人脸特征
face_images = ["faces/1.jpg", "faces/2.jpg", "faces/3.jpg"]
features, valid_paths = extract_face_features(face_images)
# 构建图结构并进行分组
adjacency = create_graph(features, k=5)
groups = group_faces(features, valid_paths, epsilon=0.5)
# 人脸群组合并
from face.merge_group import merge_small_groups
merged_groups = merge_small_groups(groups, min_size=3)
# 人脸标注
from face.label import label_faces
label_faces(grouped_faces_directory, output_json_path)相关文件:
face/extract_face.py- 人脸检测与提取face/group.py- 基于LGCN的人脸分组face/merge_group.py- 人脸群组优化与合并face/delete_group.py- 人脸群组管理face/label.py- 人脸识别与标注
# 音频提取与处理
from audio.template import create_sv_pipeline, preprocess_audio_file, compute_similarity
# 创建说话人验证管道
sv_pipeline = create_sv_pipeline()
# 预处理音频文件
processed_audio = preprocess_audio_file("audio/sample.wav", target_sr=16000)
# 计算音频相似度
similarity = compute_similarity(sv_pipeline, "audio/speaker1.wav", "audio/speaker2.wav")
print(f"说话人相似度: {similarity}")
# 提取说话人模板
from audio.template import extract_speaker_templates
templates = extract_speaker_templates("audio/speakers/")
# 音频分组
from audio.group_audio import group_audio_segments
grouped_audio = group_audio_segments(audio_files, templates, "output/grouped_audio/")
# 基于模板音频分组
from audio.group_audio_by_template import group_audio_by_template_adaptive
grouped_audio = group_audio_by_template_adaptive(audio_files, templates, "output/grouped_audio/")
# 音频分割
from audio.spilt_audio import split_audio_by_silence
segments = split_audio_by_silence("audio/long_recording.wav",
min_silence_len=500,
silence_thresh=-40)相关文件:
audio/template.py- 音频模板提取与说话人验证audio/group_audio.py- 音频分组处理(不基于模板)audio/group_audio_by_template.py- 基于模板的音频分组处理audio/spilt_audio.py- 音频分割audio/fusion.py- 音频融合处理
# 视频转MP3转换
from asr.FunASR.tests.asr.asr_test import convert_video_to_mp3
mp3_path = convert_video_to_mp3("video/sample.mp4", "output/mp3/")
# ASR处理
from asr.FunASR.tests.asr.asr_test import process_audio_files_without_llm
asr_result = process_audio_files_without_llm(
video_name="sample",
mp3_path=mp3_path,
output_path="output/",
json_path="output/asr_results.json",
hotword="关键词1,关键词2",
people={0: "说话人1", 1: "说话人2"}
)
# 使用Demucs进行人声分离
from asr.FunASR.tests.asr.asr_test import process_audio_files
denoised_audio = process_audio_files(
audio_path=mp3_path,
output_dir="output/demucs/",
hotword="关键词",
people={0: "说话人"}
)相关文件:
asr/FunASR/tests/asr/asr_test.py- ASR核心功能asr/FunASR/README.md- FunASR引擎文档
# 视频帧提取
from ocr.OpenOCR.test.frame import extract_frames_from_video
frames_count = extract_frames_from_video(
video_path="video/sample.mp4",
output_dir="output/frames/",
frame_interval=1
)
# OCR识别
from ocr.OpenOCR.tools.infer_e2e import infer_e2e
ocr_results = infer_e2e(
img_path="output/frames/",
mode='mobile',
save_dir="output/ocr_results/",
result_filename="ocr_results.txt",
is_visualize=False,
drop_score=0.5
)
# 字幕位置智能识别
from ocr.OpenOCR.test.find_position import get_y_text
ystart, yend = get_y_text("output/ocr_results/ocr_results.txt")
# OCR文本处理与校正
from ocr.OpenOCR.test.extraction_text import process_and_correct_text_without_llm
json_path = process_and_correct_text_without_llm(
video_path="video/sample.mp4",
ocr_text_path="output/ocr_results/ocr_results.txt",
ocr_json_path="output/json/ocr_results.json",
ystart=ystart-10,
yend=yend+10
)
# OCR与ASR结果对齐
from ocr.OpenOCR.test.align_ocr_asr import align_ocr_asr
align_ocr_asr(
ocr_json_path="output/json/ocr_results.json",
asr_json_path="output/json/asr_results.json",
output_json_path="output/json/aligned_results.json"
)
# OCR与ASR结果融合
from ocr.OpenOCR.test.fusion import ocr_asr_fusion
ocr_asr_fusion(
ocr_json_path="output/json/ocr_results_updated.json",
asr_json_path="output/json/aligned_results.json",
output_json_path="output/json/low_score_results.json",
people={0: "说话人"},
threshold=0.95
)相关文件:
ocr/OpenOCR/test/frame.py- 视频帧提取ocr/OpenOCR/tools/infer_e2e.py- OCR推理ocr/OpenOCR/test/find_position.py- 字幕位置识别ocr/OpenOCR/test/extraction_text.py- 文本处理ocr/OpenOCR/test/align_ocr_asr.py- OCR与ASR对齐ocr/OpenOCR/test/fusion.py- OCR与ASR融合
# 生成剧本
from script.generate_script import generate_script_from_ocr
generate_script_from_ocr(
ocr_file="output/json/ocr_results_updated.json",
output_file="output/script/script.txt"
)
# 评估脚本质量
from script.evaluate import evaluate
evaluation_results = evaluate(
original_script_path="reference/original_script.txt",
generated_script_path="output/script/script.txt"
)相关文件:
script/generate_script.py- 脚本生成script/evaluate.py- 脚本评估
启动API服务:
cd api
python app.pyAPI接口示例:
# 获取所有系列
curl -X GET http://localhost:5000/series
# 创建新系列
curl -X POST http://localhost:5000/series/addSeries \
-F "seriesName=示例系列" \
-F "seriesIntroduction=这是一个示例系列介绍" \
-F "seriesTag=剧情" \
-F "seriesTag=悬疑"
# 上传剧集
curl -X POST http://localhost:5000/episode/addEpisode \
-F "seriesId=系列ID" \
-F "episodeName=第一集" \
-F "episodeFile=@/path/to/video.mp4"请参考下方的 API服务使用指南 获取更详细的API用法。
MAO/
├── main.py # 主程序入口
├── face/ # 人脸处理模块
│ ├── lgcn_dbscan_group.py # 人脸分组(基于LGCN和DBSCAN进行优化后)
│ ├── group.py # # 顺序分组
│ ├── merge_group.py # 人脸群组合并
│ ├── delete_group.py # 人脸群组删除
│ ├── label.py # 人脸标注
│ └── extract_face.py # 人脸提取
├── audio/ # 音频处理模块
│ ├── template.py # 音频模板提取
│ ├── group_audio.py # 音频分组(无模板)
│ ├── group_audio_by_template.py #基于模板的音频分组
│ ├── spilt_audio.py # 音频分割
│ └── fusion.py # 音频融合
├── asr/ # 语音识别模块
│ └── FunASR/ # FunASR引擎
│ └── tests/asr/ # ASR测试与应用
│ └── asr_test.py # ASR核心功能
├── ocr/ # 字符识别模块
│ └── OpenOCR/ # OCR引擎
│ ├── test/ # OCR测试与应用
│ │ ├── frame.py # 帧提取
│ │ ├── fusion.py # OCR融合
│ │ └── align_ocr_asr.py # OCR与ASR对齐
│ └── tools/ # OCR工具
│ └── infer_e2e.py # 端到端推理
├── script/ # 脚本生成模块
│ ├── generate_script.py # 脚本生成
│ └── evaluate.py # 脚本评估
└── llm/ # 大语言模型模块
└── llm.py # LLM接口
├── api/ # API服务模块
│ ├── app.py # Flask应用主入口
│ ├── config.py # 配置文件
│ └── routes/ # API路由定义
│ ├── series.py # 系列管理接口
│ ├── episode.py # 剧集管理接口
│ ├── audio.py # 音频管理接口
│ ├── frame.py # 帧管理接口
│ ├── script.py # 脚本管理接口
│ └── task.py # 任务管理接口
- 使用DeepFace的ArcFace提取人脸特征
- 采用LGCN (Local Graph Clustering Network) 进行人脸分组
- DBSCAN聚类算法优化分组结果
- 使用ModelScope的说话人验证模型
- 基于相似度的音频模板匹配
- 音频波形分析与分割
- FunASR引擎进行语音识别
- Demucs用于人声分离
- 基于热词的识别优化
- 智能字幕位置检测
- 基于分数的文本质量评估
- OCR与ASR结果智能对齐
- 基于Flask框架的RESTful API
- MongoDB数据库存储与检索
- 蓝图(Blueprint)模式组织路由
- 支持系列、剧集、音频、帧和脚本等资源管理
- 支持文件上传与任务调度
系统在以下方面进行了性能评估:
- 字幕识别准确率
- 人脸分组效果
- 音频说话人识别准确性
- 处理速度与资源占用
- Fork 本仓库
- 创建功能分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 开启Pull Request
本项目采用 MIT 许可证 - 详情请参阅LICENSE文件
项目维护者 - [email protected]
MAO - 让媒体内容分析更简单、更高效