VoiceLabel 是一个专业的音频转录与标注工具,主要用于安全事件分析和音频内容的文字化处理。本工具提供了友好的用户界面,支持音频文件的上传、播放、区域选择、自动转写以及数据导出等功能。
- 音频文件管理:支持上传、播放和管理音频文件
- 音频区域选择:可视化波形界面,支持选择特定区域进行处理
- 自动语音识别:集成 ASR (自动语音识别) 系统,将选定音频区域自动转写为文字
- 静音检测:支持自动检测音频文件中的静音区域,并进行批量转写处理
- 数据标注:可为每段转写内容添加来源、时间等标签信息
- 内容编辑:支持对转写文本进行编辑、删除、标记等操作
- 区域管理:可对音频区域进行裁剪、合并等操作
- 内容导出:支持以简单或详细格式导出转写内容
- 训练数据生成:可生成用于训练语音识别模型的标准格式数据
- 工程管理:多工程支持,便于分类管理不同场景的音频资料
VoiceLabel 采用前后端分离架构:
- 前端:基于 Vue.js 开发的单页应用,提供直观的用户界面
- 后端:基于 Node.js 和 Express 框架开发的服务端,处理文件管理、音频处理和数据存储
- Node.js v16+
- FFmpeg(用于音频处理)
cd VoiceLabel/client
npm install
npm run buildcd VoiceLabel/server
npm install
node index.js前端环境配置 (.env):
VITE_SERVER_URL=http://localhost:6080
后端环境配置 (.env):
SERVER_PORT=6080
ASR_PORT=6081
- 点击右上角下拉菜单中的"创建新工程"
- 输入工程名称和描述
- 点击创建按钮完成工程创建
- 在右侧区域拖放或选择音频文件上传
- 上传完成后,文件将显示在右侧列表中
- 从右侧列表选择音频文件进行播放
- 在波形图上选择需要转写的区域
- 点击"将选定区域音频转文字"按钮
- 系统会自动将该区域的音频转为文字
- 可编辑转写结果并添加标注信息(如发言者)
- 点击"添加"或"更新"按钮保存信息
- 选择音频文件后点击"静音检测批量转换文字"
- 系统会自动检测音频中的非静音区域并进行转写
- 转写结果将自动添加到信息列表中
- 点击信息列表中的条目可进行编辑
- 使用操作按钮可进行删除、标记、上下移动等操作
- 可通过"往前插入"和"往前融合"功能管理条目顺序和内容
- 点击"导出内容"可导出当前工程的所有转写内容
- 简单模式:仅导出来源和文本
- 详细模式:包含时间戳和时长等完整信息
- 点击"导出训练数据"可导出用于语音识别模型训练的数据
工程数据存储在 server/projects 目录下,每个工程以唯一 ID 为名创建单独的目录,包含以下子目录:
uploads/:存储上传的原始音频文件data/:存储工程数据文件info.jsonl:主要信息数据文件,每行一条 JSON 格式记录mp3/:存储处理后的音频片段train.jsonl:训练数据格式文件(生成时创建)val.jsonl:验证数据格式文件(生成时创建)
annotations/:存储音频区域标注信息temp/:临时文件存储区域
{
"uuid": "唯一标识符",
"datetime": "时间戳",
"from": "发言人/来源",
"text": "转写文本内容",
"timelen": "时长",
"audioUrl": "音频文件URL",
"startTime": "开始时间(秒)",
"endTime": "结束时间(秒)",
"mark": "是否标记"
}{
"key": "唯一标识符",
"text_language": "<|zh|>",
"emo_target": "<|NEUTRAL|>",
"event_target": "<|Speech|>",
"with_or_wo_itn": "<|withitn|>",
"target": "文本内容",
"source": "音频文件路径",
"target_len": "文本长度",
"source_len": "特征长度"
}VoiceRecordClient 是一个 Windows 桌面应用程序,用于实时录制音频并自动进行语音转文字。它与 VoiceLabel/server 后端配合使用,实现实时语音识别和数据存储。
- 实时音频录制:支持麦克风和系统音频录制
- VAD 语音活动检测:自动检测语音开始和结束,智能分段
- RNNoise 降噪:可选的实时降噪处理
- 自动语音识别:录制完成后自动发送到服务器进行转写
- 波形可视化:实时显示音频波形和音量阈值
- 设备心跳包:定期向服务器发送心跳包,监控设备状态
- 自动恢复:设备断开后自动尝试恢复录制
VoiceRecordClient VoiceLabel/server
│ │
│ 1. 录制音频 + VAD检测 │
│ 2. 转换为MP3格式 │
│ │
├──── POST /api/v1/transcribe_and_save ───────>│
│ (上传音频文件) │
│ │
│ 3. 调用 SenseVoice ASR 服务
│ 4. 保存音频和转写结果到数据库
│ │
│<─────────── 返回转写结果 ────────────────────┤
│ │
VoiceRecordClient 发送的音频和转写结果保存在 VoiceLabel/server 的 NeDB 数据库中:
| 存储项 | 位置 | 说明 |
|---|---|---|
| 数据库文件 | VoiceLabel/server/database/Voice.db |
NeDB 格式的轻量级数据库 |
| 设备信息 | 内存 | 不持久化,服务重启后丢失 |
| 心跳记录 | 内存 | 不持久化,服务重启后丢失 |
每条转写记录包含以下字段:
{
"id": "uuid-唯一标识符",
"datetime": "2025-01-26T08:30:00.000Z",
"from": "来源标识(可选)",
"text": "语音识别的文字结果",
"len": 5,
"audio": "Base64编码的MP3音频数据"
}| 字段 | 类型 | 说明 |
|---|---|---|
id |
string | UUID 唯一标识符 |
datetime |
string | 创建时间(ISO 8601格式) |
from |
string | 来源标识,用于区分不同设备或场景 |
text |
string | 语音识别的文字结果 |
len |
number | 音频时长(秒) |
audio |
string | Base64 编码的 MP3 音频数据 |
如果启用了本地保存选项,VoiceRecordClient 会在本地保存音频副本:
| 文件类型 | 路径 | 文件名格式 |
|---|---|---|
| 原始音频 | VoiceRecordClient/save/ |
audio_original_时间戳.mp3 |
| 降噪音频 | VoiceRecordClient/save/ |
audio_denoised_时间戳.mp3 |
客户端配置文件 config.json:
{
"BaseUrl": "http://服务器地址:6012"
}VoiceRecordClient 使用以下 API 接口与服务器通信:
| 接口 | 方法 | 说明 |
|---|---|---|
/api/v1/transcribe_and_save |
POST | 上传音频并保存转写结果 |
/api/v1/device/heartbeat |
POST | 发送设备心跳包 |
/api/v1/transcriptions |
GET | 获取转写记录列表 |
/api/v1/transcriptions/:id |
GET | 获取单条转写记录 |
/api/v1/transcriptions/:id/audio |
GET | 获取转写记录的音频数据 |
- 使用 FFmpeg 处理音频文件(裁剪、格式转换等)
- 波形显示基于 wavesurfer.js 库
- 支持 MP3, WAV, M4A 等常见音频格式
- 通过 HTTP API 调用外部 ASR 服务
- 支持中文语音识别
- 可配置识别语言和其他参数
- 使用基于文件的轻量级数据存储(JSONL格式)
- 工程配置信息存储在 projects.json 文件中
- 音频区域信息存储在对应的标注文件中
- 会议记录转写
- 安全事件分析与记录
- 语音内容归档
- 语音识别模型训练数据准备
- 音频内容标注与分类
start_webapi.sh 用于启动 SenseVoice 的 WebAPI 服务,提供 HTTP API 接口供其他应用调用语音识别功能。
- 自动激活 conda 环境(py310)
- 从
.env文件读取端口配置 - 使用 uvicorn 启动 FastAPI 服务
- 支持热重载(代码修改后自动重启)
- 日志输出到控制台和文件
-
配置环境变量
在
SenseVoice目录下创建或编辑.env文件:SENSEVOICE_PORT=6014 SENSEVOICE_DEVICE=cuda:0 -
启动服务
cd SenseVoice chmod +x start_webapi.sh ./start_webapi.sh -
服务访问
服务启动后,API 文档可通过以下地址访问:
- API 文档:
http://localhost:6014/docs - 健康检查:
http://localhost:6014/health
- API 文档:
- 确保已安装 conda 并配置了 py310 环境
- 确保
.env文件中配置了正确的端口号 - 服务默认监听
0.0.0.0,允许外部访问 - 日志文件保存在
webapi.log
generate_jsonl.py 用于从音频文件生成训练数据集,支持单个数据集生成和多个数据集合并功能。
- 自动数据集分割:将音频文件按 7:3 比例分割为训练集和验证集
- 音频长度计算:自动计算音频文件的特征长度(source_len)
- 去重功能:合并数据集时自动检测并去除重复的音频文件(基于音频内容哈希)
- 文件名处理:自动处理文件名冲突,生成唯一标识符
- 多格式支持:支持多种音频格式(需要 librosa 支持)
将 MP3 音频文件放入 ./data/mp3 目录,文件名应为转写文本(不含扩展名),然后运行:
cd SenseVoice
python3 generate_jsonl.py脚本会自动:
- 读取
./data/mp3目录下的所有 MP3 文件 - 随机打乱文件顺序
- 按 7:3 比例分割为训练集和验证集
- 生成
./data/train.jsonl和./data/val.jsonl文件
数据格式示例:
{
"key": "uuid-唯一标识符",
"text_language": "<|zh|>",
"emo_target": "<|NEUTRAL|>",
"event_target": "<|Speech|>",
"with_or_wo_itn": "<|withitn|>",
"target": "转写文本内容",
"source": "./data/mp3/音频文件名.mp3",
"target_len": 文本长度,
"source_len": 音频特征长度
}合并多个数据集目录的训练和验证数据:
# 方式1:自动发现基础目录下的所有数据集
python3 generate_jsonl.py --output_dir ./data --input_base_dir ./data合并
# 方式2:手动指定要合并的数据集目录
python3 generate_jsonl.py --output_dir ./data --input_dirs ./data/数据集1 ./data/数据集2 ./data/数据集3参数说明:
--output_dir:输出合并后的数据集目录(默认:./data)--input_base_dir:包含多个数据集的基础目录(默认:./data合并)--input_dirs:手动指定输入数据集目录列表(可选)
合并功能特性:
- 自动检测并跳过重复的音频文件(基于音频内容哈希)
- 处理文件名冲突,自动重命名
- 处理 key 冲突,确保唯一性
- 重新计算所有音频文件的 source_len
- 复制音频文件到输出目录
- 必需:Python 3.x
- 推荐:
librosa(用于音频处理和长度计算) - 可选:
pydub(用于 MP3 处理)
如果未安装 librosa,脚本会使用默认值(1000)作为音频长度。
- 音频文件名应直接包含转写文本(不含扩展名),例如:
你好世界.mp3 - 确保音频文件格式正确,脚本会尝试多种方法加载音频
- 合并数据集时,确保有足够的磁盘空间存储复制的音频文件
- 大量音频文件处理可能需要较长时间,请耐心等待
CosyVoice/api.py 提供基于 CosyVoice2 的文本转语音 WebAPI 服务,默认监听 0.0.0.0:5050,供前端或其他后端通过 HTTP 调用。
- 提供说话人列表接口:
GET /list_spk - 提供文本转语音接口:
GET/POST /tts - 支持按说话人名称合成音频,返回 WAV 流或音频文件 URL
- 按照
CosyVoice/README.md中的说明,完成以下步骤:- 克隆并初始化子模块
- 创建并激活 Conda 环境(推荐环境名:
cosyvoice,Python 3.10) - 安装
requirements.txt中的依赖 - 下载并放置预训练模型到
CosyVoice/pretrained_models/CosyVoice2-0.5B
- 确保
CosyVoice/asset目录下的示例音频存在(如叶倩彤.wav、郭德纲.wav)。
在项目根目录下已提供启动脚本 CosyVoice/start_webapi.sh,脚本会自动激活 py310 conda 环境并运行 api.py:
cd CosyVoice
chmod +x start_webapi.sh
./start_webapi.sh首次使用前,请在 py310 环境中安装 CosyVoice 依赖和 WebAPI 依赖(需在已激活的 py310 环境下执行):
cd CosyVoice
pip install -r requirements.txt
pip install flask flask-cors服务启动后,CosyVoice WebAPI 默认地址为:
- 说话人列表:
http://<服务器IP>:5050/list_spk - 文本转语音:
http://<服务器IP>:5050/tts
JavaScript/public/test_api.html 用于测试 CosyVoice WebAPI,原来固定写死为 http://175.178.72.101:5050,已改为可配置的 API 地址:
- 默认使用:
http://localhost:5050 - 支持在页面顶部输入自定义 API 基地址(例如
http://192.168.0.10:5050),并保存到浏览器localStorage中 - 所有接口调用都会使用该配置的基地址:
${API_BASE}/list_spk${API_BASE}/tts
使用流程:
-
启动 CosyVoice WebAPI(参考上文启动脚本)。
-
在
JavaScript目录启动本地测试服务:cd JavaScript npm install # 如已安装可略过 node server.js
-
浏览器访问
http://localhost:3000/public/test_api.html:- 在页面顶部配置
API 基地址(如不修改则使用http://localhost:5050) - 点击“获取说话人列表”确认后端可用
- 输入文本与说话人名称,点击“合成语音”进行测试
- 在页面顶部配置
- 确保系统有足够的存储空间处理音频文件
- 为获得最佳转写效果,建议使用噪音较少的录音
- ASR 服务需单独部署或配置
- 频繁导出大量数据可能影响系统性能
监控命令 watch -n 5 rocm-smi radeontop
python3 -c "import torch; print('CUDA是否可用:', torch.cuda.is_available(), '\n设备数量:', torch.cuda.device_count() if torch.cuda.is_available() else 0, '\n当前设备:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else '无GPU')"