本项目旨在为内部团队(如BDA)提供一个高效、自动化的音频转文字与会议纪要生成解决方案。用户可通过网页上传会议、访谈等音频文件,系统将自动完成音频分割、语音转文字、逐字稿与纪要生成,并最终通过邮件将处理结果(DOCX格式的会议纪要)发送给指定人员。
该工具旨在提高处理音频记录的效率,确保信息的可追溯性,并支持每日约50条任务的处理量,同时具备良好的可扩展性和稳定性。
- 用户界面: 提供用户友好的网页界面。
- 音频上传: 支持多种常见音频格式(.mp3, .wav, .flac, .ogg, .aac, .m4a, .wma)的文件上传。
- 表单填写: 用户可以指定接收纪要的主送(To)和抄送(Cc)邮箱地址。
- 主送邮箱支持用户名输入,系统会自动补全
@bda.com后缀。 - 所有主送和抄送邮箱地址都会进行验证,确保为有效邮箱格式且必须使用
@bda.com域名。 - 抄送邮箱提供建议列表,并支持多选。
- 主送邮箱支持用户名输入,系统会自动补全
- 任务提交: 将音频文件和表单信息通过API异步提交到后端进行处理。
- 任务状态跟踪:
- 提交任务后,前端会收到任务ID,并可以快速得到任务已受理的反馈。
- 系统自动轮询
/api/tasks接口(每5秒),在界面左侧实时展示活动任务的列表及其详细处理状态(如:已提交、切分音频、转录中、生成逐字稿、纪要初稿、终版纪要、任务完成、任务失败)。 - 状态信息会从后端返回的英文状态码转换为用户易懂的中文描述。
- API接口:
POST /api/transcribe: 异步接收前端上传的音频文件和表单数据。快速验证输入,保存文件,创建任务记录到数据库(初始状态为 "submitted"),然后将耗时的处理工作交由后台任务执行,并立即返回任务ID。GET /api/tasks: 返回当前所有活动状态任务的列表(已按提交时间排序)。GET /api/task_status/{task_id}: 根据任务ID查询并返回单个任务的详细状态和信息。
- 异步任务处理: 使用 FastAPI 的
BackgroundTasks实现对整个音频处理管线的异步执行,确保API接口的快速响应。 - 任务管理:
- 为每个任务在指定的基础目录 (
AUDIO_TARGET_DIR) 下创建唯一的子目录,用于存放该任务的所有相关文件(原始音频、分割片段、转录文本、中间稿件、最终输出的DOCX等)。 - 在PostgreSQL数据库中为每个任务创建详细记录,跟踪其生命周期中的所有状态变更和元数据。
- 为每个任务在指定的基础目录 (
- 邮件通知:
- 成功通知: 任务成功完成后,向主送和抄送邮箱发送通知邮件,邮件附件中包含最终生成的会议纪要
.docx文件(该文件末尾会自动追加一个"."字符)。 - 失败通知: 任务处理失败时,仅向主送邮箱发送通知邮件,邮件内容包含错误信息摘要。
- 成功通知: 任务成功完成后,向主送和抄送邮箱发送通知邮件,邮件附件中包含最终生成的会议纪要
- 日志记录: 将关键操作和错误信息记录到
transcribe.log文件中。
该模块作为Git子模块集成在后端服务 (backend_fastapi/app/audio2memo) 中,负责实际的音频到纪要的转换工作,主要流程如下:
- 音频分割 (
process_audio.py): 将上传的原始音频文件分割成适合后续处理的小片段。 - 语音转文字 (
audio2text.py): 调用 OpenAI Whisper API 将音频片段批量转换为文本。 - 逐字稿生成 (
text_to_wordforword.py): 基于转录文本,调用大语言模型(如Gemini)生成初步的逐字稿。 - 纪要初稿生成 (
wordforword_to_memo.py): 基于转录文本和特定提示,调用大语言模型(如Gemini)生成会议纪要初稿。 - DOCX文档合并 (
combine_to_docx.py): 将纪要初稿和逐字稿内容,依据内部定义的文本结构 (memo_template.txt) 和输入的纪要/逐字稿内容,整合成结构化的.docx文档。
- 前端: Vue.js 3
- 后端: FastAPI (Python 3)
- 数据库: PostgreSQL
- AI模型API: OpenAI (Whisper), Google Gemini
- 主要Python库:
python-dotenv: 管理环境变量。SQLAlchemy: ORM,与PostgreSQL交互。pydub: 音频处理(依赖ffmpeg)。openai: OpenAI API客户端。google-generativeai: Google Gemini API客户端。python-docx: 生成和操作.docx文件。smtplib,email.mime: 发送邮件。requests: HTTP请求库。tiktoken: OpenAI Token计数库。
-
克隆仓库:
git clone <repository_url> cd AI_Frontend
-
初始化子模块: 由于
backend_fastapi/app/audio2memo是一个Git子模块,在克隆主仓库后需要初始化并更新子模块:git submodule init git submodule update
或者,在克隆时使用
--recurse-submodules选项:git clone --recurse-submodules <repository_url> cd AI_Frontend
-
前端设置:
cd frontend_vue npm install # 或 yarn install cd ..
-
后端设置:
- 确保您已安装 Python 3 (推荐 3.9+)。
- 安装
ffmpeg(pydub 依赖):- Debian/Ubuntu:
sudo apt update && sudo apt install ffmpeg - macOS (使用 Homebrew):
brew install ffmpeg - Windows: 下载预编译版本并添加到系统 PATH。
- Debian/Ubuntu:
- 创建并激活虚拟环境 (推荐):
cd backend_fastapi python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows
- 安装 Python 依赖:
pip install -r requirements.txt cd .. - 配置后端环境变量:参见下面的 "五、配置说明"。
-
启动服务:
- 启动后端 FastAPI 服务:
cd backend_fastapi # 确保虚拟环境已激活 uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
- 启动前端 Vue 开发服务:
cd frontend_vue npm run dev # 或 yarn dev
访问前端通常在
http://localhost:5173(或其他 Vite 指定的端口)。 - 启动后端 FastAPI 服务:
系统后端的核心配置通过环境变量进行管理。在开发环境中,可以在 AI_Frontend/backend_fastapi/ 目录下创建一个 .env 文件来定义这些变量。应用启动时,main.py 会使用 python-dotenv 自动加载此文件。
关键环境变量示例 (.env 文件格式):
# 后端音频文件存储根目录 (所有任务的父目录)
AUDIO_TARGET_DIR=/path/to/your/audio_storage_root
# OpenAI API 密钥
openai_key=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Gemini API 密钥
gemini_key=AIxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# (可选) Gemini 模型名称 (默认为 gemini-1.5-flash-latest)
# GEMINI_MODEL_NAME=gemini-1.5-pro-latest
# 邮件服务器配置 (用于发送通知邮件)
MAIL_USERNAME=your_email@example.com
MAIL_PASSWORD=your_email_password
MAIL_SMTP_SERVER=smtp.example.com
MAIL_SMTP_PORT=587
MAIL_SENDER_NAME="AI Transcribe Tool" # 邮件中显示的发件人名称
# 数据库连接URL (示例为PostgreSQL)
DATABASE_URL="postgresql://user:password@host:port/database"注意:
- 确保
.env文件不要提交到版本控制系统(如Git)。它已经被添加到根目录的.gitignore文件中。 - 前端的
node_modules/目录也已被添加到.gitignore。 - 对于生产部署,应通过系统环境变量或部署平台提供的配置管理服务来设置这些值。
ffmpeg需要在运行后端的服务器上正确安装,因为pydub依赖它进行音频处理。
- 用户交互: 用户通过前端网页上传音频文件并填写邮件等信息。
- 任务提交: 前端将数据
POST到后端的/api/transcribe接口。 - 后端接收与初步处理:
- FastAPI 接收请求,验证数据,保存音频文件到基于
AUDIO_TARGET_DIR的任务专属目录。 - 在PostgreSQL数据库中创建一条任务记录,初始状态为 "submitted"。
- 将核心的
audio2memo处理流程作为一个后台任务启动。 - 立即向前端返回任务ID和任务已受理的消息。
- FastAPI 接收请求,验证数据,保存音频文件到基于
- 后台处理 (
audio2memo流程):- 后台任务按顺序执行音频分割、转录、逐字稿生成、纪要初稿生成、DOCX文档生成。
- 每完成一个关键步骤,后端会更新数据库中对应任务的状态字段(如
processing_audio_split,transcribing, 等)。
- 前端状态轮询: 前端通过任务ID定期(每5秒)调用
/api/tasks(或/api/task_status/{task_id}) 接口获取最新任务状态。 - 任务完成与通知:
- 处理成功:更新数据库状态为 "completed",记录结果文件信息,并通过邮件发送包含
.docx附件的成功通知。 - 处理失败:更新数据库状态为 "failed",记录错误信息,并通过邮件发送失败通知。
- 处理成功:更新数据库状态为 "completed",记录结果文件信息,并通过邮件发送包含
- 结果展示: 前端根据轮询到的状态,向用户展示任务进度;任务完成后,用户将通过邮件收到结果。
系统使用 PostgreSQL 数据库存储所有任务的详细信息,以便进行任务追踪、状态管理和潜在的后续分析。
主要的任务记录字段包括(但不限于):
task_id: 任务的唯一标识符 (UUID)。submit_time: 任务提交时间。status: 任务当前的处理状态 (如submitted,transcribing,completed,failed等)。to_email,cc_emails: 邮件接收人。file_name,file_path,file_size,file_type: 上传文件的相关信息。result_files: 指向生成的.docx文件路径(以JSON格式存储)。error: 如果任务失败,记录错误信息。last_update_time: 任务状态最后更新的时间。
完整的字段列表和模型定义参见 AI_Frontend/backend_fastapi/app/db.py。
由于所有任务信息均完整记录在数据库中,支持后续通过SQL等方式进行查询、统计和分析,无需专门开发前端统计界面。
- 内网部署: 本系统设计为仅在公司内部网络环境部署和使用。所有API接口和Web服务不应暴露于公网。
- 防火墙: 强烈建议通过公司防火墙策略,限制只有授权的内网IP地址段或特定用户子网才能访问后端API服务端口和前端Web服务。
- 示例(Linux ufw):
# 允许内网用户访问前端和后端API端口 (假设FastAPI运行在8000) sudo ufw allow from 192.168.1.0/24 to any port 8000 # (根据实际前端端口和部署情况调整) # 允许后端API服务器访问数据库端口 (假设PostgreSQL运行在5432) # sudo ufw allow from <backend_server_ip> to any port 5432 sudo ufw default deny incoming # 拒绝所有其他入站连接 sudo ufw enable
- 具体的IP段、端口和防火墙配置命令请咨询公司IT或网络管理员。
- 示例(Linux ufw):
- 用户认证: 鉴于内网部署和防火墙的保护,当前版本的系统未实现应用层级的用户认证和复杂的权限管理功能,以简化开发和运维。如未来需求变化,可再行考虑。
以下是当前项目中一些待进一步完善或未来可以考虑扩展的方向:
-
audio2memo内部日志记录与错误定位:- 当前状态:
main.py对audio2memo模块的调用有顶层的错误捕获。当任务失败时,数据库会记录失败状态 (failed) 以及捕获到的异常信息字符串。结合任务失败前最后一个成功的状态,可以定位到具体是哪个处理步骤出现问题。audio2memo内部各脚本已进行初步清理,大部分print语句已被移除或预留注释替换为logging。 - 改进建议:
- 全面推广日志记录: 在
audio2memo各模块内部全面、一致地使用Python标准的logging模块记录详细的执行信息和遇到的任何警告或错误(包括第三方API返回的原始错误信息)。确保日志级别和格式与主应用协调。这将为问题排查提供最直接和详细的上下文。 - (可选的未来增强) 如果未来需要更细致地区分错误类型或进行特定的错误处理逻辑(如重试),可以考虑引入自定义异常类来增强错误信号的结构性。目前,通过任务状态和记录的错误字符串已能满足基本的错误定位需求。
- 全面推广日志记录: 在
- 当前状态:
-
任务队列增强:
- 当前状态: 使用 FastAPI 的
BackgroundTasks来处理异步任务,能满足当前预估的中低等负载(如每日约20-50条任务)。 - 改进建议/未来考虑: 当前的
BackgroundTasks机制能满足中低等负载。若未来任务量大幅增加、单个任务处理时间极长,或对任务的持久化和自动重试有更高要求时,可以考虑迁移到更专业的分布式任务队列系统(如 Celery)。这将提供更强的可靠性、扩展性和管理能力。
- 当前状态: 使用 FastAPI 的
-
前端用户体验优化:
- 更丰富的错误提示: 当前端从API接收到错误时,可以提供更具体、用户友好的错误信息和处理建议。
A. 核心目标与原则:
- 配置统一管理:所有后端配置(API密钥、服务URL、文件路径等)均通过项目根目录下的
.env文件管理,由应用启动时加载。禁止在代码中硬编码配置。 - 本地优先:移除所有对外部云存储服务(如OSS/COS、Dropbox)的直接文件读写依赖,确保所有任务处理的中间文件和最终产物均存储在本地(通过
AUDIO_TARGET_DIR配置)。 - 功能纯化:移除已确认不再需要的功能模块(如DeepSeek AI、飞书通知),精简代码库和依赖。
audio2memo模块内部对齐:确保audio2memo子目录下的所有Python脚本遵循上述配置管理原则,不依赖独立的env.py或进行硬编码。
B. 当前已完成的对齐工作:
-
环境配置 (
.env):AI_Frontend/backend_fastapi/.env作为唯一的配置源。AI_Frontend/backend_fastapi/app/main.py已实现启动时加载.env。AI_Frontend/.gitignore已配置忽略.env文件。
-
API密钥管理:
- OpenAI 和 Gemini 的 API 密钥已统一为
openai_key和gemini_key,在.env中配置,并由audio2text.py和funcs.py正确加载。 GEMINI_MODEL_NAME环境变量已支持,并在funcs.py中有默认值。
- OpenAI 和 Gemini 的 API 密钥已统一为
-
文件路径配置:
AUDIO_TARGET_DIR从.env加载,用于所有任务文件的本地存储根路径。后端在启动和任务处理时会检查此配置的有效性。
-
移除的云服务与三方功能:
- DeepSeek AI:已从
funcs.py中移除相关代码和配置。 - OSS/COS (对象存储):已从
main.py和funcs.py中移除文件上传逻辑,boto3依赖已从主requirements.txt移除。 - Dropbox:已移除
audio2memo/dropbox_api.py,相关调用逻辑和dropbox依赖已从主requirements.txt移除。 - 飞书通知:已从
funcs.py移除feishu_bot及相关配置和依赖。
- DeepSeek AI:已从
-
audio2memo内部脚本规范化:funcs.py: 完成清理,移除废弃功能,配置通过环境变量加载。audio2text.py: API密钥通过环境变量加载。process_audio.py: 参数通过函数默认值或调用时传递,符合要求。text_to_wordforword.py: 依赖的提示词路径通过main.py构建并传递,符合要求。wordforword_to_memo.py: 已重构为接受参数化输入/输出路径和提示词路径。combine_to_docx.py:- 移除了云服务参数和最终Markdown生成。
- 修改为不再接收
.docx模板路径,而是内部加载同目录下的memo_template.txt来构建初始文档结构。 - 其测试代码也已相应调整。
audio2memo/run.py: 已删除。audio2memo/requirements.txt: 已删除,相关必要依赖已在主requirements.txt中确认或添加。
C. 后续主要关注点(已在"九、待办事项与未来展望"中体现):
- 日志记录:全面推广使用
logging模块替换print语句。 - 错误处理:增强
audio2memo内部的错误捕获和向上传递机制。 - 邮件模板:考虑使用模板引擎优化邮件内容生成。
- 可选小清理:
- 手动移除
AI_Frontend/backend_fastapi/app/main.py中之前被模型注释掉的MEMO_TEMPLATE_DOCX_PATH定义和相关检查的注释行。 - 考虑删除
AI_Frontend/backend_fastapi/app/audio2memo/memo_template.docx文件(因已改用memo_template.txt)。
- 手动移除
我们已基本完成本次代码库对齐的核心目标。
May Father of Understanding Guide Us.