Skip to content

link-wind/MAO

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MAO - 媒体分析优化系统

MAO (Media Analysis Optimizer) 是一个综合性的媒体内容分析系统,能够自动处理视频、音频等媒体内容,提取关键信息,并生成结构化的数据输出。系统集成了人脸识别、语音识别、字幕提取和文本处理等多种技术,适用于影视内容分析、字幕生成、视频归档等多种场景。

🌟 主要功能

  • 人脸处理

    • 人脸检测与提取
    • 基于LGCN的人脸分组
    • 人脸识别与标注
    • 群组优化与管理
  • 音频处理

    • 音频提取与降噪
    • 说话人验证与分析
    • 音频模板匹配
    • 音频分割与分组
  • 自动语音识别 (ASR)

    • 视频转MP3转换
    • FunASR引擎支持
    • 支持热词优化
    • 说话人分离
  • 光学字符识别 (OCR)

    • 视频帧提取
    • 字幕位置智能识别
    • 文本校正与优化
    • OCR与ASR结果融合
  • 脚本生成

    • 根据提取的文本生成脚本
    • 文本质量评估
    • 脚本格式化输出
  • API服务

    • RESTful API接口
    • MongoDB数据库集成
    • 系列、剧集、音频、帧、脚本和任务管理
    • Flask Web服务

🔍 API服务使用指南

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上运行。

API接口说明

系列管理 (Series)

# 获取所有系列
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

剧集管理 (Episode)

# 获取所有剧集
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)

音频处理 (Audio)

# 获取所有音频记录
GET /audio

# 获取特定剧集的音频记录
GET /audio/getByEpisode?episodeID={episode_id}

# 处理ASR(自动语音识别)
POST /audio/processASR
参数:
  - audioID: 音频ID
  - hotword: 热词(可选)
  - people: 人物字典(可选)

# 更新音频记录
PUT /audio/updateAudio
参数:
  - audioID: 音频ID
  - audioName: 音频名称(可选)
  - audioPath: 音频路径(可选)

帧处理 (Frame)

# 获取所有帧记录
GET /frames

# 获取特定剧集的帧记录
GET /frames/getByEpisode?episodeID={episode_id}

# 处理OCR(光学字符识别)
POST /frames/processOCR
参数:
  - frameID: 帧ID
  - mode: OCR模式(可选,默认为'mobile')
  - dropScore: 分数阈值(可选,默认为0.5)

脚本生成 (Script)

# 获取所有脚本记录
GET /scripts

# 获取特定剧集的脚本记录
GET /scripts/getByEpisode?episodeID={episode_id}

# 生成剧本
POST /scripts/generateScript
参数:
  - episodeID: 剧集ID
  - ocrJsonPath: OCR结果JSON路径
  - asrJsonPath: ASR结果JSON路径(可选)

工作流任务 (Task)

# 执行完整工作流
POST /task/runWorkflow
参数:
  - episodeID: 剧集ID
  - hotword: 热词(可选)
  - people: 人物字典(可选)

API使用示例

Python客户端示例

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命令示例

# 创建新系列
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 (用于视频处理)

步骤

  1. 克隆仓库

    git clone https://github.com/yourusername/MAO.git
    cd MAO
  2. 创建虚拟环境 (可选但推荐):

    python -m venv venv
    # Windows
    venv\Scripts\activate
    # Linux/Mac
    source venv/bin/activate
  3. 安装依赖

    pip install -r requirements.txt
  4. 安装额外组件

    • FFmpeg (确保已添加到系统PATH)
    • Demucs (用于音频分离): pip install demucs

🚀 使用方法

基本使用

  1. 修改 main.py 中的路径和参数:

    video_name = "your_video_name"
    episode = "episode_number"
    video_path = "path/to/your/video.mp4"
    people = {0: "人物名称"}
    hotword = "关键词"
  2. 运行主程序:

    python main.py

流程说明

处理流程包含以下步骤:

  1. 视频转MP3转换
  2. ASR语音识别处理
  3. 视频帧提取
  4. 字幕OCR识别
  5. 智能识别字幕位置
  6. OCR文本处理与校正
  7. OCR与ASR结果对齐与融合
  8. 剧本生成
  9. 质量评估

高级用法

人脸处理

# 人脸检测与提取
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)

相关文件

音频处理

# 音频提取与处理
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)

相关文件

自动语音识别 (ASR)

# 视频转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: "说话人"}
)

相关文件

光学字符识别 (OCR)

# 视频帧提取
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
)

相关文件

脚本生成

# 生成剧本
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"
)

相关文件

API服务使用

启动API服务:

cd api
python app.py

API接口示例:

# 获取所有系列
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的说话人验证模型
  • 基于相似度的音频模板匹配
  • 音频波形分析与分割

ASR处理

  • FunASR引擎进行语音识别
  • Demucs用于人声分离
  • 基于热词的识别优化

OCR处理

  • 智能字幕位置检测
  • 基于分数的文本质量评估
  • OCR与ASR结果智能对齐

API服务

  • 基于Flask框架的RESTful API
  • MongoDB数据库存储与检索
  • 蓝图(Blueprint)模式组织路由
  • 支持系列、剧集、音频、帧和脚本等资源管理
  • 支持文件上传与任务调度

📊 性能评估

系统在以下方面进行了性能评估:

  • 字幕识别准确率
  • 人脸分组效果
  • 音频说话人识别准确性
  • 处理速度与资源占用

🤝 贡献指南

  1. Fork 本仓库
  2. 创建功能分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m 'Add some amazing feature')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 开启Pull Request

📄 许可证

本项目采用 MIT 许可证 - 详情请参阅LICENSE文件

📧 联系方式

项目维护者 - [email protected]


MAO - 让媒体内容分析更简单、更高效

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published