本仓库保存我在综合实训 C 方向中负责的个人代码,分为两部分:
完整团队产品位于 GPAUP/nlp_team。
C3 级联语音模型推理、C4 端到端语音模型推理与会议智能模块
C3 位于团队 C2 ASR 之后。它接收结构化 JSON 中的 prediction_text,使用 Qwen2.5-7B-Instruct 完成可选 ASR 后编辑和目标语言翻译。个人 C3 不运行语音识别模型;JSON 中的 WER、CER 和 ASR 时延来自团队 C2,C3 只保留这些字段用于分析错误传播。
C4 与 C2-C3 级联并行,直接接收音频。服务器实验使用 SeamlessM4T-v2-large 和 Qwen2.5-Omni-7B-AWQ 完成端到端语音到文本翻译,并使用 UniSS 探索保留源说话人音色和情感的语音到语音翻译。
本地会议智能模块把模型结果扩展为真实会议能力:根据最近对话纠正 ASR 文本,统一端到端实时事件,为字幕建立说话人和 turn_id,会后重新聚类说话人,并将会议内容保存、总结和建立混合 RAG 索引。
| 类型 | 完成情况 |
|---|---|
| 基础要求 | 完成 C3 英文 ASR 文本到中文译文;完成 C4 英文语音到中文文本端到端翻译 |
| C3 进阶要求 | 中/日/韩目标语言、Qwen 后编辑、质量评价、分阶段时延、C3/C4 对比和 TTS 上游接口 |
| C4 进阶要求 | 两类端到端模型全量实验、C1 音频变体鲁棒性、S2S、错误累计分析、UniSS 表达性语音翻译 |
| 本地扩展 | 上下文纠错、实时端到端事件、声纹聚类、会议纪要、会议库和混合 RAG |
| 可独立运行 | c3_cascade.py、c4_end2end.py、c4_qwen_omni_awq_end2end.py、评价脚本和本地模块评估脚本 |
| 团队集成 | 服务器通过稳定样本 ID 和 JSON 对接;实时系统通过 partial/final 事件、turn_id 和音频时间戳对接 |
| 项目 | 要求 |
|---|---|
| Python | 3.10 |
| 主要依赖 | PyTorch、Transformers、NumPy、SciPy、scikit-learn、SoundFile、FunASR、ModelScope、DashScope |
| GPU | 服务器模型推理建议使用 CUDA GPU;评价脚本可使用 CPU |
| 外部数据 | CREMA-D、TESS;本地会议功能使用 AMI 或用户会议录音 |
| 联网 | 首次下载模型和调用本地会议系统所用阿里云 API 时需要 |
| 模型 | 来源 | 用途 |
|---|---|---|
| Qwen2.5-7B-Instruct | Hugging Face / ModelScope | C3 ASR 后编辑与多语言翻译 |
| SeamlessM4T-v2-large | Hugging Face | C4 端到端 S2T |
| Qwen2.5-Omni-7B-AWQ | Hugging Face / ModelScope | C4 端到端 S2T 全量实验和 S2S 探索 |
| UniSS(论文) | 上游项目 | 表达性 S2S,保留源说话人音色和情感 |
| CAM++ / ERes2NetV2 / FSMN-VAD | ModelScope 3D-Speaker / FunASR | 本地说话人向量与语音活动检测 |
| qwen-plus / text-embedding-v4 | 阿里云 API | 本地上下文纠错、翻译、纪要和会议检索 |
模型权重及第三方模型源码不提交到本仓库。服务器脚本通过 --model_path 指定本地模型目录;UniSS 下载与环境脚本位于 server_c3_c4/c4/code/。
| 数据或文件 | 来源 | 路径 | 用途 |
|---|---|---|---|
| CREMA-D | 公开情感语音数据集 | 运行时自行配置 | 完整句子 C3/C4 和 S2S 实验 |
| TESS | 公开情感语音数据集 | 运行时自行配置 | 孤立词翻译与情感语音实验 |
| AMI Meeting Corpus | AMI 官方语料库 | 本地展示时下载到团队项目 meeting_system/data/raw/amicorpus/ | 多人会议回放、双语字幕、说话人标签、会议纪要和会议库展示 |
| C2 JSON 样例 | 本仓库提供 | examples/c2_asr_sample.json | 验证个人 C3 输入接口 |
| C4 manifest 样例 | 本仓库提供 | examples/c4_manifest_sample.json | 验证 C4 音频清单格式 |
| 轻量结果 | 实验汇总 | server_c3_c4/results/ | 复核指标、失败记录和对比结论 |
git clone https://github.com/GPAUP/nlp_personal.git
cd nlp_personal
conda create -n nlp_personal python=3.10 -y
conda activate nlp_personal
pip install -r requirements.txt
Qwen2.5-Omni-AWQ、UniSS 和 SeamlessM4T 的依赖存在差异,建议按 server_c3_c4/c4/code/setup_*.sh 建立独立环境,不要强行安装到同一个推理环境。
nlp_personal/
├── README.md
├── examples/ # C2 JSON 与 C4 manifest 样例
├── server_c3_c4/
│ ├── c3/code/ # C3 后编辑、翻译、评价和 C3/C4 比较
│ ├── c4/code/ # SeamlessM4T、Qwen-Omni、UniSS 和鲁棒性脚本
│ ├── c4/eval/ # 固定银标参考
│ └── results/ # 轻量实验汇总
├── meeting_intelligence/
│ ├── src/ # 声纹、端到端事件、会议库和 RAG
│ ├── integration/realtime_server.py
│ ├── evaluation/ # 上下文纠错、RAG 和声纹评估
│ └── tests/
└── docs/images/ # 架构图和结果图
meeting_intelligence/integration/realtime_server.py 来自团队共享后端调度文件。与个人工作直接对应的主要函数是:
run_local_diarization():会议级声纹处理和字幕回写。correct_transcript_text():最近对话上下文 ASR 纠错。generate_realtime_minutes():最终会议纪要。generate_stage_summary():阶段摘要。save_realtime_meeting():保存会议录音、字幕与纪要。meeting_search():会议知识库检索接口。| 类型 | 来源 / 去向 | 格式 | 说明 |
|---|---|---|---|
| C3 输入 | 团队 C2 | JSON 数组 | 必需字段为 id、prediction_text;可带 WER/CER、ASR 时延和状态 |
| C3 输出 | 评价脚本 / C5 | JSON | asr_text、corrected_asr_text、translation、阶段时延、状态和错误 |
| C4 输入 | C1 公共 manifest | JSON 数组 + WAV | 优先读取 processed_audio,否则读取 raw_audio |
| C4 输出 | 评价脚本 / C5 | JSON/WAV | end2end_translation、时延、状态;S2S 另输出目标 WAV |
| 实时输入 | 团队 WebSocket 总线 | 16 kHz PCM + JSON | 同源音频帧、语言、路线和会话控制 |
| 实时输出 | 前端与会议库 | JSON 事件 | partial/final、turn_id、speaker、音频时间戳和延迟 |
| RAG 输入输出 | 会议库 / 语音助手 | 文本与证据 JSON | 返回相关会议、说话人和音频时间位置 |
个人 C3 只使用 Qwen2.5-7B-Instruct。程序读取 C2 已生成的 prediction_text,按批次构造翻译提示,输出目标语言文本。模型只加载一次,生成时关闭随机采样,保证批量实验可复现。
C2 asr_predictions.json
-> 读取 prediction_text
-> Qwen2.5-7B-Instruct
-> translation + status + latency
| 文件 / 函数 | 作用 |
|---|---|
c3/code/c3_cascade.py::load_asr() | 读取并检查 C2 JSON 列表 |
batch_generate() | 统一执行后编辑或翻译并记录批次时延 |
main() | 保留稳定 ID、上游指标和输出状态 |
c3_evaluate_outputs.py | 计算翻译质量标签和分阶段指标 |
{
"id": "cremad_1001_dfa_ang_xx",
"prediction_text": "Don't forget a jacket.",
"wer": 0.0,
"cer": 0.0,
"latency_sec": 0.06,
"status": "ok"
}
WER、CER 和 ASR 时延由团队 C2 产生,不代表个人 C3 内部运行了 ASR。
python server_c3_c4/c3/code/c3_cascade.py \
--asr examples/c2_asr_sample.json \
--model_path /path/to/Qwen2.5-7B-Instruct \
--outdir outputs/c3_demo \
--target_lang zh \
--post_edit none \
--batch_size 1 \
--device cuda
开启 Qwen 后编辑:
python server_c3_c4/c3/code/c3_cascade.py \
--asr examples/c2_asr_sample.json \
--model_path /path/to/Qwen2.5-7B-Instruct \
--outdir outputs/c3_post_edit_demo \
--target_lang zh \
--post_edit qwen \
--batch_size 1 \
--device cuda
输出记录应保留 id,并包含 asr_text、translation、llm_model、translation_latency_sec、status 和 error;开启后编辑后增加 corrected_asr_text 和 post_edit_latency_sec。
C4 使用音频 manifest 直接运行端到端翻译,不读取 C3 的 ASR 文本。SeamlessM4T-v2-large 的独立命令:
python server_c3_c4/c4/code/c4_end2end.py \
--input examples/c4_manifest_sample.json \
--model_path /path/to/seamless-m4t-v2-large \
--target_lang zh \
--outdir outputs/c4_seamless_demo \
--limit 1 \
--batch_size 1
Qwen2.5-Omni-7B-AWQ 的独立命令:
python server_c3_c4/c4/code/c4_qwen_omni_awq_end2end.py \
--input examples/c4_manifest_sample.json \
--model_path /path/to/Qwen2.5-Omni-7B-AWQ \
--target_lang zh \
--outdir outputs/c4_qwen_demo \
--limit 1 \
--batch_size 1
主要输出字段为 id、audio、end2end_translation、latency_sec、status 和 error。批量失败时脚本会回退到逐条推理,避免整批样本丢失。
| 进阶要求 | 状态 | 对应文件 | 说明 |
|---|---|---|---|
| C3 多语言翻译 | 完成 | c3_cascade.py | 支持中文、日语和韩语目标语言 |
| C3 ASR 后编辑 | 完成 | c3_cascade.py | 同一 Qwen 模型先修正明显错误再翻译 |
| C3 质量评价 | 完成 | c3_evaluate_outputs.py | BLEU、字符相似度、关键词和任务特定标签 |
| C3/C4 同样本比较 | 完成 | c3_compare_c4.py | 按稳定 ID 对比质量、错误传播和时延 |
| C4 多模型端到端翻译 | 完成 | c4_end2end.py、c4_qwen_omni_awq_end2end.py | SeamlessM4T 与 Qwen2.5-Omni-AWQ |
| C1 音频变体鲁棒性 | 完成 | c4_run_c1_robustness.py 等 | 采样率、语速、音量、噪声和 VAD |
| C4 S2S | 完成探索 | Qwen S2S 与 UniSS 脚本 | 保留失败记录并部署表达性 S2S |
| 本地会议智能 | 完成 | meeting_intelligence/ | 上下文纠错、声纹、纪要、会议库和 RAG |
基础 C3 直接翻译 C2 的 ASR 文本。当识别结果包含同音错词、缩写或专有名词错误时,错误会继续进入译文。本功能使用同一个 Qwen2.5-7B-Instruct 先完成受约束后编辑,再将修正结果翻译为中文、日语或韩语。程序同时保存原始文本、修正文本和译文,便于复核修正是否有效。
本地会议系统在此基础上使用最近 8 个确认句段作为上下文,只纠正 ASR final,不对仍会变化的 partial 文本重复调用模型。16 条受控困难样例中,最近 8 句上下文方案的修正后 CER 为 4.30%,术语准确率为 92.86%,平均延迟为 0.832 秒。
| 文件 / 函数 / 脚本 | 作用 |
|---|---|
server_c3_c4/c3/code/c3_cascade.py::build_messages() | 为后编辑和翻译构造不同的系统提示 |
c3_cascade.py::batch_generate() | 批量调用 Qwen2.5-7B-Instruct,并记录生成时延 |
c3_cascade.py::main() | 连接后编辑与翻译,保留原文、修正文和译文 |
meeting_intelligence/integration/realtime_server.py::correct_transcript_text() | 在实时会议中使用最近对话完成上下文纠错 |
C2 prediction_text -> 可选 Qwen 后编辑 -> 多语言翻译 -> 原文/修正文/译文/时延
| 字段 / 配置项 | 格式 | 是否必需 | 说明 |
|---|---|---|---|
--asr | JSON 文件 | 是 | C2 输出列表,样例见 examples/c2_asr_sample.json |
id | 字符串 | 是 | 跨模块稳定样本编号 |
prediction_text | 字符串 | 是 | C2 生成的英文识别文本 |
--post_edit | none / qwen | 否 | 是否启用 ASR 后编辑 |
--target_lang | zh / ja / ko | 是 | 目标语言 |
python server_c3_c4/c3/code/c3_cascade.py \
--asr examples/c2_asr_sample.json \
--model_path /path/to/Qwen2.5-7B-Instruct \
--outdir outputs/c3_post_edit_ja \
--post_edit qwen \
--target_lang ja \
--batch_size 1 \
--device cuda
| 输出字段 | 格式 | 说明 |
|---|---|---|
asr_text | 文本 | C2 原始识别结果 |
corrected_asr_text | 文本或空值 | Qwen 后编辑结果 |
translation | 文本 | 指定目标语言的译文 |
post_edit_latency_sec | 浮点数 | 单条后编辑时延 |
translation_latency_sec | 浮点数 | 单条翻译时延 |
status / error | 字符串 | 运行状态和失败原因 |
中、日、韩 smoke test 和后编辑对比结果位于 server_c3_c4/results/c3/outputs/,评价汇总文件名为 c3_summary.json 或 c3_eval_summary.json。
级联路线保留显式 ASR 文本,便于定位错误,但识别错误可能继续影响翻译;端到端路线直接从音频生成译文,可以绕开显式文本错误。本功能用稳定样本 ID 对齐 C3 与 C4,使用同一套银标参考和质量标签比较两条路线,并在采样率、语速、音量、噪声和 VAD 等 C1 音频变体上检查鲁棒性。
CREMA-D 含 7442 条完整句子,TESS 含 2800 条孤立词语音。CREMA-D 使用 BLEU、字符相似度和关键词命中,TESS 使用严格词命中、音近或语义部分命中和载体短语标签。
| 文件 / 函数 / 脚本 | 作用 |
|---|---|
c3/code/c3_evaluate_outputs.py | 将 C3 结果转换为统一评价格式 |
c3/code/c3_compare_c4.py | 按 id 配对 C3/C4 结果并生成对比报告 |
c4/code/c4_evaluate_outputs.py | 提供 C3/C4 共用的银标和质量标签逻辑 |
c4/code/c4_run_c1_robustness.py | 批量运行 SeamlessM4T 音频变体实验 |
c4/code/c4_run_qwen_omni_c1_robustness.py | 批量运行 Qwen2.5-Omni-AWQ 鲁棒性实验 |
同一 id 的 C3 JSON + C4 JSON + manifest + 银标
-> 统一评价 -> 质量分布/时延/错误传播/典型样例
| 输入 | 格式 | 是否必需 | 说明 |
|---|---|---|---|
--c3 | 目录或 JSON | 是 | C3 输出目录 |
--c4 | 目录或 JSON | 是 | C4 输出目录或结果文件 |
--manifest | JSON | 是 | 包含稳定 ID、数据集和参考文本 |
--references | JSON | 是 | server_c3_c4/c4/eval/c4_silver_references.json |
python server_c3_c4/c3/code/c3_compare_c4.py \
--c3 /path/to/c3_output \
--c4 /path/to/c4_results.json \
--manifest /path/to/dataset.json \
--references server_c3_c4/c4/eval/c4_silver_references.json \
--outdir outputs/c3_vs_c4
| 输出 | 格式 | 说明 |
|---|---|---|
c3_vs_c4_summary.json | JSON | 样本数量、质量分布、平均时延和配对统计 |
c3_vs_c4_report.md | Markdown | 汇总表、典型成功与失败样例 |
quality_label | 字符串 | correct、partial、wrong 或任务特定标签 |
| 路线 / 数据 | 样本数 | 质量结果 | 平均时延 |
|---|---|---|---|
| C2-C3 / CREMA-D | 7442 | BLEU 0.4917;correct 84.68% | 0.0836 s/条(含上游 C2) |
| SeamlessM4T / CREMA-D | 7442 | correct 81.39% | 0.0409 s/条 |
| Qwen2.5-Omni-AWQ / CREMA-D | 7442 | 字符相似度 0.7819;correct 95.58% | 0.842 s/条 |
| C2-C3 / TESS | 2800 | 严格词命中 47.32% | 0.0832 s/条(含上游 C2) |
| SeamlessM4T / TESS | 2800 | 严格词命中 27.25% | 0.0310 s/条 |
| Qwen2.5-Omni-AWQ / TESS | 2800 | 严格词命中 25.00% | 0.714 s/条 |
鲁棒性实验中,CREMA-D clean_16k 的 WER 为 0.0108、字符相似度为 0.7056;speed_1_1 的 WER 上升到 0.2109、字符相似度下降到 0.5926;noise_snr_5 的 WER 为 0.1940、字符相似度为 0.5983。

SeamlessM4T-v2-large 和 Qwen2.5-Omni-7B-AWQ 已完成端到端 S2T 实验。继续使用 Qwen2.5-Omni-AWQ 尝试 S2S 时,中文文本有意义,但当前环境生成的 WAV 没有可理解内容;其预设音色也不等同于保留输入说话人的风格。为完成“尝试保留说话人风格或语音情感”的进阶要求,本模块调研并部署 UniSS。
UniSS 分别提取源语音的说话人表示和语言内容,在语言模型中生成目标文本与目标语音语义表示,再由 Codec Decoder 将目标语义和源说话人表示组合为目标波形。个人适配代码将其接入项目 manifest,并处理 16 kHz 单声道转换、任务 token、语言 token、结果解析和 WAV 保存。
| 文件 / 函数 / 脚本 | 作用 |
|---|---|
c4/code/download_uniss_hf_no_proxy.sh | 下载 UniSS 模型权重 |
c4/code/setup_uniss_minimal_env.sh | 建立 UniSS 独立运行环境 |
c4/code/c4_uniss_s2s_smoke.py | 运行 manifest 样本,输出转写、翻译和目标语音 |
c4/code/c4_uniss_s2s_cremad_compare.py | 整理 CREMA-D 六类情感的配对结果 |
源 WAV -> 16 kHz mono -> semantic/speaker tokens
-> 任务与目标语言控制 -> UniSS 生成
-> transcription + translation + target speech tokens -> WAV
| 参数 / 字段 | 格式 | 是否必需 | 说明 |
|---|---|---|---|
--uniss-src | 目录 | 是 | 上游 UniSS 源码目录 |
--model-path | 目录 | 是 | UniSS 权重目录 |
--manifest | JSON,可重复 | 是 | C1 clean manifest;至少包含 id 和音频路径 |
processed_audio / raw_audio | WAV 路径 | 是 | 输入语音,优先使用处理后音频 |
emotion | 字符串 | 否 | CREMA-D 情感标签,用于配对试听整理 |
--mode | Quality / Performance / S2ST | 否 | UniSS 推理模式 |
python server_c3_c4/c4/code/c4_uniss_s2s_smoke.py \
--uniss-src /path/to/UniSS-source \
--model-path /path/to/UniSS-model \
--manifest /path/to/CREMA-D/clean_16k/dataset.json \
--manifest /path/to/TESS/clean_16k/dataset.json \
--output-dir outputs/uniss_s2s_demo \
--mode Quality \
--target-lang '<|cmn|>' \
--max-chunks 1
| 输出 | 格式 | 说明 |
|---|---|---|
results.json | JSON | 样本 ID、源情感、源转写、目标翻译、时延和目标 WAV 路径 |
smoke_report.md | Markdown | 多数据集汇总表 |
output_wav | WAV | UniSS 生成的中文目标语音 |
chunks | JSON 数组 | 每个语音片段的转写、翻译和生成记录 |
服务器实验从 CREMA-D 中整理了覆盖 angry、disgust、fear、happy、neutral 和 sad 的 18 组配对元数据。仓库中保留 server_c3_c4/results/c4/outputs_uniss_s2s_cremad_compare/ 下的结果与报告。

本地展示系统没有参会人的注册声纹,实时阶段只能根据当前已经收到的短语音建立临时身份。为提高最终会议记录的稳定性,本功能在会议结束后利用整场音频重新进行声纹聚类,并把最终标签写回字幕、纪要和历史会议。
| 文件 / 函数 / 脚本 | 作用 |
|---|---|
meeting_intelligence/src/online_vad.py | 过滤静音和非语音窗口 |
meeting_intelligence/src/online_diarization.py | CAM++ / ERes2NetV2 声纹向量和在线候选确认 |
meeting_intelligence/src/meeting_diarization.py::_spectral_cluster() | P-pruning 相似度图、特征值间隙和谱聚类 |
meeting_diarization.py::align_transcript_to_turns() | 按最大时间重叠将标签写回字幕 |
整场录音 -> FSMN-VAD -> 重叠窗口 -> CAM++ embedding
-> 长会议谱聚类 / 短片段 AHC -> 标签平滑与类别合并
-> 说话人时间线 -> 字幕回写
| 输入 | 格式 | 是否必需 | 说明 |
|---|---|---|---|
audio | 16 kHz WAV 或音频字节 | 是 | 整场会议录音,AMI 可用于本地展示 |
transcript | JSON 数组 | 否 | 包含开始、结束时间的字幕,用于标签回写 |
speaker_count | 整数 | 否 | 已知参会人数时可显式指定,否则由聚类估计 |
python -c "from meeting_intelligence.src.meeting_diarization import diarize_audio; import json; print(json.dumps(diarize_audio('/path/to/AMI.wav'), ensure_ascii=False, indent=2))"
python -m unittest discover \
-s meeting_intelligence/tests \
-p "test_*.py" -v
| 输出字段 | 格式 | 说明 |
|---|---|---|
turns | JSON 数组 | 每个说话人区间的起止时间和参会者标签 |
speaker_count | 整数 | 聚类得到的说话人数 |
speaker_centroids | 数组 | 各聚类的归一化声纹中心 |
speaker_source | 字符串 | 标签来源,如本地会议级声纹处理 |

实时字幕在会议结束后被保存为结构化会议记录。本功能把最终纪要和连续发言转换为证据块,通过语义向量和关键词联合检索历史会议,为会议语音助手提供带来源的回答依据。摘要单独形成证据块,字幕每 4 个连续发言形成一个证据块,同时保存会议 ID、日期、主题、说话人和音频时间位置。
| 文件 / 函数 / 脚本 | 作用 |
|---|---|
meeting_intelligence/src/meeting_library.py | 保存和读取会议索引、字幕、纪要及录音元数据 |
meeting_intelligence/src/meeting_rag.py::_chunk_text() | 将纪要和连续发言切成证据块 |
meeting_rag.py::build_index() | 使用 text-embedding-v4 建立 1024 维向量索引 |
meeting_rag.py::retrieve() | 融合语义相似度和关键词得分并返回来源 |
meeting_intelligence/evaluation/evaluate_rag.py | 对比关键词、纯向量与混合检索 |
会议字幕/纪要 -> 证据块 + 元数据 -> 向量索引
用户问题 -> 0.78 × 语义相似度 + 0.22 × 关键词
-> Top-K 会议证据 -> 带会议名称、说话人和时间位置的结果
| 输入 / 配置 | 格式 | 是否必需 | 说明 |
|---|---|---|---|
meeting_index.json | JSON 数组 | 是 | 已完成会议的索引 |
| 单场会议详情 | JSON | 是 | 包含 transcript 和 minutes |
DASHSCOPE_API_KEY | 环境变量 | 是 | 调用 text-embedding-v4 |
| 查询文本 | 字符串 | 是 | 例如“最近有讨论台风吗” |
本地展示使用 AMI 历史会议和浏览器实时会议。运行个人评估前,将团队系统生成的已完成会议目录放入 meeting_intelligence/outputs/meetings/。
cp .env.example meeting_intelligence/.env
# 在 meeting_intelligence/.env 中填写 DASHSCOPE_API_KEY 后执行:
cd meeting_intelligence
python evaluation/evaluate_rag.py
| 输出 | 格式 | 说明 |
|---|---|---|
outputs/meetings/rag/chunks.json | JSON | 会议证据块与来源元数据 |
outputs/meetings/rag/vectors.npz | NumPy 压缩文件 | 归一化语义向量 |
| 检索结果 | JSON 数组 | 得分、会议、日期、说话人和时间位置 |
| 方法 | Recall@1 | Recall@3 | MRR@5 |
|---|---|---|---|
| 证据块关键词 | 86.67% | 100.00% | 92.22% |
| 纯向量 | 80.00% | 86.67% | 85.78% |
| 混合 RAG | 100.00% | 100.00% | 100.00% |

服务器模块通过统一 JSON 和稳定样本 ID 联调:
asr_predictions.json。id 读取 prediction_text,输出 translation。id 直接读取音频,输出 end2end_translation。--text_field translation 或 --text_field end2end_translation 接入两条路线。本地产品通过统一事件协议集成:C3 和 C4 的不同服务事件被转换为 partial/final;所有字幕、翻译和说话人更新携带 turn_id,避免异步结果覆盖下一轮发言。会议结束后,录音、字幕、会议级说话人时间线和纪要写入同一会议对象,再供 RAG 和语音助手调用。
联调时最主要的问题是模块返回结构和时序不同。解决方式不是让前端分别适配每个模型,而是在后端统一字段、状态和轮次编号,使前端只维护一套字幕卡片和会议保存逻辑。
| 问题 | 当前原因 | 后续改进 |
|---|---|---|
| C3 后编辑可能改写原本正确的文本 | 大模型倾向进行语义等价改写 | 增加文本差异门控、术语白名单和置信度回退 |
| Qwen2.5-Omni-AWQ 的 S2S 音频未通过验收 | 当前环境与语音生成分支存在适配问题,且预设音色不满足源风格保持 | 保留失败记录,以 UniSS 为表达性 S2S 主线 |
| UniSS 风格保持目前以配对试听为主 | 尚未建立统一客观评价集 | 补充说话人相似度、情感分类和人工听测 |
2 commits
Python
97.3%
Shell
2.7%
本仓库保存我在综合实训 C 方向中负责的个人代码,分为两部分:
完整团队产品位于 GPAUP/nlp_team。
C3 级联语音模型推理、C4 端到端语音模型推理与会议智能模块
C3 位于团队 C2 ASR 之后。它接收结构化 JSON 中的 prediction_text,使用 Qwen2.5-7B-Instruct 完成可选 ASR 后编辑和目标语言翻译。个人 C3 不运行语音识别模型;JSON 中的 WER、CER 和 ASR 时延来自团队 C2,C3 只保留这些字段用于分析错误传播。
C4 与 C2-C3 级联并行,直接接收音频。服务器实验使用 SeamlessM4T-v2-large 和 Qwen2.5-Omni-7B-AWQ 完成端到端语音到文本翻译,并使用 UniSS 探索保留源说话人音色和情感的语音到语音翻译。
本地会议智能模块把模型结果扩展为真实会议能力:根据最近对话纠正 ASR 文本,统一端到端实时事件,为字幕建立说话人和 turn_id,会后重新聚类说话人,并将会议内容保存、总结和建立混合 RAG 索引。
| 类型 | 完成情况 |
|---|---|
| 基础要求 | 完成 C3 英文 ASR 文本到中文译文;完成 C4 英文语音到中文文本端到端翻译 |
| C3 进阶要求 | 中/日/韩目标语言、Qwen 后编辑、质量评价、分阶段时延、C3/C4 对比和 TTS 上游接口 |
| C4 进阶要求 | 两类端到端模型全量实验、C1 音频变体鲁棒性、S2S、错误累计分析、UniSS 表达性语音翻译 |
| 本地扩展 | 上下文纠错、实时端到端事件、声纹聚类、会议纪要、会议库和混合 RAG |
| 可独立运行 | c3_cascade.py、c4_end2end.py、c4_qwen_omni_awq_end2end.py、评价脚本和本地模块评估脚本 |
| 团队集成 | 服务器通过稳定样本 ID 和 JSON 对接;实时系统通过 partial/final 事件、turn_id 和音频时间戳对接 |
| 项目 | 要求 |
|---|---|
| Python | 3.10 |
| 主要依赖 | PyTorch、Transformers、NumPy、SciPy、scikit-learn、SoundFile、FunASR、ModelScope、DashScope |
| GPU | 服务器模型推理建议使用 CUDA GPU;评价脚本可使用 CPU |
| 外部数据 | CREMA-D、TESS;本地会议功能使用 AMI 或用户会议录音 |
| 联网 | 首次下载模型和调用本地会议系统所用阿里云 API 时需要 |
| 模型 | 来源 | 用途 |
|---|---|---|
| Qwen2.5-7B-Instruct | Hugging Face / ModelScope | C3 ASR 后编辑与多语言翻译 |
| SeamlessM4T-v2-large | Hugging Face | C4 端到端 S2T |
| Qwen2.5-Omni-7B-AWQ | Hugging Face / ModelScope | C4 端到端 S2T 全量实验和 S2S 探索 |
| UniSS(论文) | 上游项目 | 表达性 S2S,保留源说话人音色和情感 |
| CAM++ / ERes2NetV2 / FSMN-VAD | ModelScope 3D-Speaker / FunASR | 本地说话人向量与语音活动检测 |
| qwen-plus / text-embedding-v4 | 阿里云 API | 本地上下文纠错、翻译、纪要和会议检索 |
模型权重及第三方模型源码不提交到本仓库。服务器脚本通过 --model_path 指定本地模型目录;UniSS 下载与环境脚本位于 server_c3_c4/c4/code/。
| 数据或文件 | 来源 | 路径 | 用途 |
|---|---|---|---|
| CREMA-D | 公开情感语音数据集 | 运行时自行配置 | 完整句子 C3/C4 和 S2S 实验 |
| TESS | 公开情感语音数据集 | 运行时自行配置 | 孤立词翻译与情感语音实验 |
| AMI Meeting Corpus | AMI 官方语料库 | 本地展示时下载到团队项目 meeting_system/data/raw/amicorpus/ | 多人会议回放、双语字幕、说话人标签、会议纪要和会议库展示 |
| C2 JSON 样例 | 本仓库提供 | examples/c2_asr_sample.json | 验证个人 C3 输入接口 |
| C4 manifest 样例 | 本仓库提供 | examples/c4_manifest_sample.json | 验证 C4 音频清单格式 |
| 轻量结果 | 实验汇总 | server_c3_c4/results/ | 复核指标、失败记录和对比结论 |
git clone https://github.com/GPAUP/nlp_personal.git
cd nlp_personal
conda create -n nlp_personal python=3.10 -y
conda activate nlp_personal
pip install -r requirements.txt
Qwen2.5-Omni-AWQ、UniSS 和 SeamlessM4T 的依赖存在差异,建议按 server_c3_c4/c4/code/setup_*.sh 建立独立环境,不要强行安装到同一个推理环境。
nlp_personal/
├── README.md
├── examples/ # C2 JSON 与 C4 manifest 样例
├── server_c3_c4/
│ ├── c3/code/ # C3 后编辑、翻译、评价和 C3/C4 比较
│ ├── c4/code/ # SeamlessM4T、Qwen-Omni、UniSS 和鲁棒性脚本
│ ├── c4/eval/ # 固定银标参考
│ └── results/ # 轻量实验汇总
├── meeting_intelligence/
│ ├── src/ # 声纹、端到端事件、会议库和 RAG
│ ├── integration/realtime_server.py
│ ├── evaluation/ # 上下文纠错、RAG 和声纹评估
│ └── tests/
└── docs/images/ # 架构图和结果图
meeting_intelligence/integration/realtime_server.py 来自团队共享后端调度文件。与个人工作直接对应的主要函数是:
run_local_diarization():会议级声纹处理和字幕回写。correct_transcript_text():最近对话上下文 ASR 纠错。generate_realtime_minutes():最终会议纪要。generate_stage_summary():阶段摘要。save_realtime_meeting():保存会议录音、字幕与纪要。meeting_search():会议知识库检索接口。| 类型 | 来源 / 去向 | 格式 | 说明 |
|---|---|---|---|
| C3 输入 | 团队 C2 | JSON 数组 | 必需字段为 id、prediction_text;可带 WER/CER、ASR 时延和状态 |
| C3 输出 | 评价脚本 / C5 | JSON | asr_text、corrected_asr_text、translation、阶段时延、状态和错误 |
| C4 输入 | C1 公共 manifest | JSON 数组 + WAV | 优先读取 processed_audio,否则读取 raw_audio |
| C4 输出 | 评价脚本 / C5 | JSON/WAV | end2end_translation、时延、状态;S2S 另输出目标 WAV |
| 实时输入 | 团队 WebSocket 总线 | 16 kHz PCM + JSON | 同源音频帧、语言、路线和会话控制 |
| 实时输出 | 前端与会议库 | JSON 事件 | partial/final、turn_id、speaker、音频时间戳和延迟 |
| RAG 输入输出 | 会议库 / 语音助手 | 文本与证据 JSON | 返回相关会议、说话人和音频时间位置 |
个人 C3 只使用 Qwen2.5-7B-Instruct。程序读取 C2 已生成的 prediction_text,按批次构造翻译提示,输出目标语言文本。模型只加载一次,生成时关闭随机采样,保证批量实验可复现。
C2 asr_predictions.json
-> 读取 prediction_text
-> Qwen2.5-7B-Instruct
-> translation + status + latency
| 文件 / 函数 | 作用 |
|---|---|
c3/code/c3_cascade.py::load_asr() | 读取并检查 C2 JSON 列表 |
batch_generate() | 统一执行后编辑或翻译并记录批次时延 |
main() | 保留稳定 ID、上游指标和输出状态 |
c3_evaluate_outputs.py | 计算翻译质量标签和分阶段指标 |
{
"id": "cremad_1001_dfa_ang_xx",
"prediction_text": "Don't forget a jacket.",
"wer": 0.0,
"cer": 0.0,
"latency_sec": 0.06,
"status": "ok"
}
WER、CER 和 ASR 时延由团队 C2 产生,不代表个人 C3 内部运行了 ASR。
python server_c3_c4/c3/code/c3_cascade.py \
--asr examples/c2_asr_sample.json \
--model_path /path/to/Qwen2.5-7B-Instruct \
--outdir outputs/c3_demo \
--target_lang zh \
--post_edit none \
--batch_size 1 \
--device cuda
开启 Qwen 后编辑:
python server_c3_c4/c3/code/c3_cascade.py \
--asr examples/c2_asr_sample.json \
--model_path /path/to/Qwen2.5-7B-Instruct \
--outdir outputs/c3_post_edit_demo \
--target_lang zh \
--post_edit qwen \
--batch_size 1 \
--device cuda
输出记录应保留 id,并包含 asr_text、translation、llm_model、translation_latency_sec、status 和 error;开启后编辑后增加 corrected_asr_text 和 post_edit_latency_sec。
C4 使用音频 manifest 直接运行端到端翻译,不读取 C3 的 ASR 文本。SeamlessM4T-v2-large 的独立命令:
python server_c3_c4/c4/code/c4_end2end.py \
--input examples/c4_manifest_sample.json \
--model_path /path/to/seamless-m4t-v2-large \
--target_lang zh \
--outdir outputs/c4_seamless_demo \
--limit 1 \
--batch_size 1
Qwen2.5-Omni-7B-AWQ 的独立命令:
python server_c3_c4/c4/code/c4_qwen_omni_awq_end2end.py \
--input examples/c4_manifest_sample.json \
--model_path /path/to/Qwen2.5-Omni-7B-AWQ \
--target_lang zh \
--outdir outputs/c4_qwen_demo \
--limit 1 \
--batch_size 1
主要输出字段为 id、audio、end2end_translation、latency_sec、status 和 error。批量失败时脚本会回退到逐条推理,避免整批样本丢失。
| 进阶要求 | 状态 | 对应文件 | 说明 |
|---|---|---|---|
| C3 多语言翻译 | 完成 | c3_cascade.py | 支持中文、日语和韩语目标语言 |
| C3 ASR 后编辑 | 完成 | c3_cascade.py | 同一 Qwen 模型先修正明显错误再翻译 |
| C3 质量评价 | 完成 | c3_evaluate_outputs.py | BLEU、字符相似度、关键词和任务特定标签 |
| C3/C4 同样本比较 | 完成 | c3_compare_c4.py | 按稳定 ID 对比质量、错误传播和时延 |
| C4 多模型端到端翻译 | 完成 | c4_end2end.py、c4_qwen_omni_awq_end2end.py | SeamlessM4T 与 Qwen2.5-Omni-AWQ |
| C1 音频变体鲁棒性 | 完成 | c4_run_c1_robustness.py 等 | 采样率、语速、音量、噪声和 VAD |
| C4 S2S | 完成探索 | Qwen S2S 与 UniSS 脚本 | 保留失败记录并部署表达性 S2S |
| 本地会议智能 | 完成 | meeting_intelligence/ | 上下文纠错、声纹、纪要、会议库和 RAG |
基础 C3 直接翻译 C2 的 ASR 文本。当识别结果包含同音错词、缩写或专有名词错误时,错误会继续进入译文。本功能使用同一个 Qwen2.5-7B-Instruct 先完成受约束后编辑,再将修正结果翻译为中文、日语或韩语。程序同时保存原始文本、修正文本和译文,便于复核修正是否有效。
本地会议系统在此基础上使用最近 8 个确认句段作为上下文,只纠正 ASR final,不对仍会变化的 partial 文本重复调用模型。16 条受控困难样例中,最近 8 句上下文方案的修正后 CER 为 4.30%,术语准确率为 92.86%,平均延迟为 0.832 秒。
| 文件 / 函数 / 脚本 | 作用 |
|---|---|
server_c3_c4/c3/code/c3_cascade.py::build_messages() | 为后编辑和翻译构造不同的系统提示 |
c3_cascade.py::batch_generate() | 批量调用 Qwen2.5-7B-Instruct,并记录生成时延 |
c3_cascade.py::main() | 连接后编辑与翻译,保留原文、修正文和译文 |
meeting_intelligence/integration/realtime_server.py::correct_transcript_text() | 在实时会议中使用最近对话完成上下文纠错 |
C2 prediction_text -> 可选 Qwen 后编辑 -> 多语言翻译 -> 原文/修正文/译文/时延
| 字段 / 配置项 | 格式 | 是否必需 | 说明 |
|---|---|---|---|
--asr | JSON 文件 | 是 | C2 输出列表,样例见 examples/c2_asr_sample.json |
id | 字符串 | 是 | 跨模块稳定样本编号 |
prediction_text | 字符串 | 是 | C2 生成的英文识别文本 |
--post_edit | none / qwen | 否 | 是否启用 ASR 后编辑 |
--target_lang | zh / ja / ko | 是 | 目标语言 |
python server_c3_c4/c3/code/c3_cascade.py \
--asr examples/c2_asr_sample.json \
--model_path /path/to/Qwen2.5-7B-Instruct \
--outdir outputs/c3_post_edit_ja \
--post_edit qwen \
--target_lang ja \
--batch_size 1 \
--device cuda
| 输出字段 | 格式 | 说明 |
|---|---|---|
asr_text | 文本 | C2 原始识别结果 |
corrected_asr_text | 文本或空值 | Qwen 后编辑结果 |
translation | 文本 | 指定目标语言的译文 |
post_edit_latency_sec | 浮点数 | 单条后编辑时延 |
translation_latency_sec | 浮点数 | 单条翻译时延 |
status / error | 字符串 | 运行状态和失败原因 |
中、日、韩 smoke test 和后编辑对比结果位于 server_c3_c4/results/c3/outputs/,评价汇总文件名为 c3_summary.json 或 c3_eval_summary.json。
级联路线保留显式 ASR 文本,便于定位错误,但识别错误可能继续影响翻译;端到端路线直接从音频生成译文,可以绕开显式文本错误。本功能用稳定样本 ID 对齐 C3 与 C4,使用同一套银标参考和质量标签比较两条路线,并在采样率、语速、音量、噪声和 VAD 等 C1 音频变体上检查鲁棒性。
CREMA-D 含 7442 条完整句子,TESS 含 2800 条孤立词语音。CREMA-D 使用 BLEU、字符相似度和关键词命中,TESS 使用严格词命中、音近或语义部分命中和载体短语标签。
| 文件 / 函数 / 脚本 | 作用 |
|---|---|
c3/code/c3_evaluate_outputs.py | 将 C3 结果转换为统一评价格式 |
c3/code/c3_compare_c4.py | 按 id 配对 C3/C4 结果并生成对比报告 |
c4/code/c4_evaluate_outputs.py | 提供 C3/C4 共用的银标和质量标签逻辑 |
c4/code/c4_run_c1_robustness.py | 批量运行 SeamlessM4T 音频变体实验 |
c4/code/c4_run_qwen_omni_c1_robustness.py | 批量运行 Qwen2.5-Omni-AWQ 鲁棒性实验 |
同一 id 的 C3 JSON + C4 JSON + manifest + 银标
-> 统一评价 -> 质量分布/时延/错误传播/典型样例
| 输入 | 格式 | 是否必需 | 说明 |
|---|---|---|---|
--c3 | 目录或 JSON | 是 | C3 输出目录 |
--c4 | 目录或 JSON | 是 | C4 输出目录或结果文件 |
--manifest | JSON | 是 | 包含稳定 ID、数据集和参考文本 |
--references | JSON | 是 | server_c3_c4/c4/eval/c4_silver_references.json |
python server_c3_c4/c3/code/c3_compare_c4.py \
--c3 /path/to/c3_output \
--c4 /path/to/c4_results.json \
--manifest /path/to/dataset.json \
--references server_c3_c4/c4/eval/c4_silver_references.json \
--outdir outputs/c3_vs_c4
| 输出 | 格式 | 说明 |
|---|---|---|
c3_vs_c4_summary.json | JSON | 样本数量、质量分布、平均时延和配对统计 |
c3_vs_c4_report.md | Markdown | 汇总表、典型成功与失败样例 |
quality_label | 字符串 | correct、partial、wrong 或任务特定标签 |
| 路线 / 数据 | 样本数 | 质量结果 | 平均时延 |
|---|---|---|---|
| C2-C3 / CREMA-D | 7442 | BLEU 0.4917;correct 84.68% | 0.0836 s/条(含上游 C2) |
| SeamlessM4T / CREMA-D | 7442 | correct 81.39% | 0.0409 s/条 |
| Qwen2.5-Omni-AWQ / CREMA-D | 7442 | 字符相似度 0.7819;correct 95.58% | 0.842 s/条 |
| C2-C3 / TESS | 2800 | 严格词命中 47.32% | 0.0832 s/条(含上游 C2) |
| SeamlessM4T / TESS | 2800 | 严格词命中 27.25% | 0.0310 s/条 |
| Qwen2.5-Omni-AWQ / TESS | 2800 | 严格词命中 25.00% | 0.714 s/条 |
鲁棒性实验中,CREMA-D clean_16k 的 WER 为 0.0108、字符相似度为 0.7056;speed_1_1 的 WER 上升到 0.2109、字符相似度下降到 0.5926;noise_snr_5 的 WER 为 0.1940、字符相似度为 0.5983。

SeamlessM4T-v2-large 和 Qwen2.5-Omni-7B-AWQ 已完成端到端 S2T 实验。继续使用 Qwen2.5-Omni-AWQ 尝试 S2S 时,中文文本有意义,但当前环境生成的 WAV 没有可理解内容;其预设音色也不等同于保留输入说话人的风格。为完成“尝试保留说话人风格或语音情感”的进阶要求,本模块调研并部署 UniSS。
UniSS 分别提取源语音的说话人表示和语言内容,在语言模型中生成目标文本与目标语音语义表示,再由 Codec Decoder 将目标语义和源说话人表示组合为目标波形。个人适配代码将其接入项目 manifest,并处理 16 kHz 单声道转换、任务 token、语言 token、结果解析和 WAV 保存。
| 文件 / 函数 / 脚本 | 作用 |
|---|---|
c4/code/download_uniss_hf_no_proxy.sh | 下载 UniSS 模型权重 |
c4/code/setup_uniss_minimal_env.sh | 建立 UniSS 独立运行环境 |
c4/code/c4_uniss_s2s_smoke.py | 运行 manifest 样本,输出转写、翻译和目标语音 |
c4/code/c4_uniss_s2s_cremad_compare.py | 整理 CREMA-D 六类情感的配对结果 |
源 WAV -> 16 kHz mono -> semantic/speaker tokens
-> 任务与目标语言控制 -> UniSS 生成
-> transcription + translation + target speech tokens -> WAV
| 参数 / 字段 | 格式 | 是否必需 | 说明 |
|---|---|---|---|
--uniss-src | 目录 | 是 | 上游 UniSS 源码目录 |
--model-path | 目录 | 是 | UniSS 权重目录 |
--manifest | JSON,可重复 | 是 | C1 clean manifest;至少包含 id 和音频路径 |
processed_audio / raw_audio | WAV 路径 | 是 | 输入语音,优先使用处理后音频 |
emotion | 字符串 | 否 | CREMA-D 情感标签,用于配对试听整理 |
--mode | Quality / Performance / S2ST | 否 | UniSS 推理模式 |
python server_c3_c4/c4/code/c4_uniss_s2s_smoke.py \
--uniss-src /path/to/UniSS-source \
--model-path /path/to/UniSS-model \
--manifest /path/to/CREMA-D/clean_16k/dataset.json \
--manifest /path/to/TESS/clean_16k/dataset.json \
--output-dir outputs/uniss_s2s_demo \
--mode Quality \
--target-lang '<|cmn|>' \
--max-chunks 1
| 输出 | 格式 | 说明 |
|---|---|---|
results.json | JSON | 样本 ID、源情感、源转写、目标翻译、时延和目标 WAV 路径 |
smoke_report.md | Markdown | 多数据集汇总表 |
output_wav | WAV | UniSS 生成的中文目标语音 |
chunks | JSON 数组 | 每个语音片段的转写、翻译和生成记录 |
服务器实验从 CREMA-D 中整理了覆盖 angry、disgust、fear、happy、neutral 和 sad 的 18 组配对元数据。仓库中保留 server_c3_c4/results/c4/outputs_uniss_s2s_cremad_compare/ 下的结果与报告。

本地展示系统没有参会人的注册声纹,实时阶段只能根据当前已经收到的短语音建立临时身份。为提高最终会议记录的稳定性,本功能在会议结束后利用整场音频重新进行声纹聚类,并把最终标签写回字幕、纪要和历史会议。
| 文件 / 函数 / 脚本 | 作用 |
|---|---|
meeting_intelligence/src/online_vad.py | 过滤静音和非语音窗口 |
meeting_intelligence/src/online_diarization.py | CAM++ / ERes2NetV2 声纹向量和在线候选确认 |
meeting_intelligence/src/meeting_diarization.py::_spectral_cluster() | P-pruning 相似度图、特征值间隙和谱聚类 |
meeting_diarization.py::align_transcript_to_turns() | 按最大时间重叠将标签写回字幕 |
整场录音 -> FSMN-VAD -> 重叠窗口 -> CAM++ embedding
-> 长会议谱聚类 / 短片段 AHC -> 标签平滑与类别合并
-> 说话人时间线 -> 字幕回写
| 输入 | 格式 | 是否必需 | 说明 |
|---|---|---|---|
audio | 16 kHz WAV 或音频字节 | 是 | 整场会议录音,AMI 可用于本地展示 |
transcript | JSON 数组 | 否 | 包含开始、结束时间的字幕,用于标签回写 |
speaker_count | 整数 | 否 | 已知参会人数时可显式指定,否则由聚类估计 |
python -c "from meeting_intelligence.src.meeting_diarization import diarize_audio; import json; print(json.dumps(diarize_audio('/path/to/AMI.wav'), ensure_ascii=False, indent=2))"
python -m unittest discover \
-s meeting_intelligence/tests \
-p "test_*.py" -v
| 输出字段 | 格式 | 说明 |
|---|---|---|
turns | JSON 数组 | 每个说话人区间的起止时间和参会者标签 |
speaker_count | 整数 | 聚类得到的说话人数 |
speaker_centroids | 数组 | 各聚类的归一化声纹中心 |
speaker_source | 字符串 | 标签来源,如本地会议级声纹处理 |

实时字幕在会议结束后被保存为结构化会议记录。本功能把最终纪要和连续发言转换为证据块,通过语义向量和关键词联合检索历史会议,为会议语音助手提供带来源的回答依据。摘要单独形成证据块,字幕每 4 个连续发言形成一个证据块,同时保存会议 ID、日期、主题、说话人和音频时间位置。
| 文件 / 函数 / 脚本 | 作用 |
|---|---|
meeting_intelligence/src/meeting_library.py | 保存和读取会议索引、字幕、纪要及录音元数据 |
meeting_intelligence/src/meeting_rag.py::_chunk_text() | 将纪要和连续发言切成证据块 |
meeting_rag.py::build_index() | 使用 text-embedding-v4 建立 1024 维向量索引 |
meeting_rag.py::retrieve() | 融合语义相似度和关键词得分并返回来源 |
meeting_intelligence/evaluation/evaluate_rag.py | 对比关键词、纯向量与混合检索 |
会议字幕/纪要 -> 证据块 + 元数据 -> 向量索引
用户问题 -> 0.78 × 语义相似度 + 0.22 × 关键词
-> Top-K 会议证据 -> 带会议名称、说话人和时间位置的结果
| 输入 / 配置 | 格式 | 是否必需 | 说明 |
|---|---|---|---|
meeting_index.json | JSON 数组 | 是 | 已完成会议的索引 |
| 单场会议详情 | JSON | 是 | 包含 transcript 和 minutes |
DASHSCOPE_API_KEY | 环境变量 | 是 | 调用 text-embedding-v4 |
| 查询文本 | 字符串 | 是 | 例如“最近有讨论台风吗” |
本地展示使用 AMI 历史会议和浏览器实时会议。运行个人评估前,将团队系统生成的已完成会议目录放入 meeting_intelligence/outputs/meetings/。
cp .env.example meeting_intelligence/.env
# 在 meeting_intelligence/.env 中填写 DASHSCOPE_API_KEY 后执行:
cd meeting_intelligence
python evaluation/evaluate_rag.py
| 输出 | 格式 | 说明 |
|---|---|---|
outputs/meetings/rag/chunks.json | JSON | 会议证据块与来源元数据 |
outputs/meetings/rag/vectors.npz | NumPy 压缩文件 | 归一化语义向量 |
| 检索结果 | JSON 数组 | 得分、会议、日期、说话人和时间位置 |
| 方法 | Recall@1 | Recall@3 | MRR@5 |
|---|---|---|---|
| 证据块关键词 | 86.67% | 100.00% | 92.22% |
| 纯向量 | 80.00% | 86.67% | 85.78% |
| 混合 RAG | 100.00% | 100.00% | 100.00% |

服务器模块通过统一 JSON 和稳定样本 ID 联调:
asr_predictions.json。id 读取 prediction_text,输出 translation。id 直接读取音频,输出 end2end_translation。--text_field translation 或 --text_field end2end_translation 接入两条路线。本地产品通过统一事件协议集成:C3 和 C4 的不同服务事件被转换为 partial/final;所有字幕、翻译和说话人更新携带 turn_id,避免异步结果覆盖下一轮发言。会议结束后,录音、字幕、会议级说话人时间线和纪要写入同一会议对象,再供 RAG 和语音助手调用。
联调时最主要的问题是模块返回结构和时序不同。解决方式不是让前端分别适配每个模型,而是在后端统一字段、状态和轮次编号,使前端只维护一套字幕卡片和会议保存逻辑。
| 问题 | 当前原因 | 后续改进 |
|---|---|---|
| C3 后编辑可能改写原本正确的文本 | 大模型倾向进行语义等价改写 | 增加文本差异门控、术语白名单和置信度回退 |
| Qwen2.5-Omni-AWQ 的 S2S 音频未通过验收 | 当前环境与语音生成分支存在适配问题,且预设音色不满足源风格保持 | 保留失败记录,以 UniSS 为表达性 S2S 主线 |
| UniSS 风格保持目前以配对试听为主 | 尚未建立统一客观评价集 | 补充说话人相似度、情感分类和人工听测 |
2 commits
Python
97.3%
Shell
2.7%