Skip to content

ErrorGz/llm_audio

Repository files navigation

VoiceLabel - 音频转录与标注工具

VoiceLabel 是一个专业的音频转录与标注工具,主要用于安全事件分析和音频内容的文字化处理。本工具提供了友好的用户界面,支持音频文件的上传、播放、区域选择、自动转写以及数据导出等功能。

功能特点

  • 音频文件管理:支持上传、播放和管理音频文件
  • 音频区域选择:可视化波形界面,支持选择特定区域进行处理
  • 自动语音识别:集成 ASR (自动语音识别) 系统,将选定音频区域自动转写为文字
  • 静音检测:支持自动检测音频文件中的静音区域,并进行批量转写处理
  • 数据标注:可为每段转写内容添加来源、时间等标签信息
  • 内容编辑:支持对转写文本进行编辑、删除、标记等操作
  • 区域管理:可对音频区域进行裁剪、合并等操作
  • 内容导出:支持以简单或详细格式导出转写内容
  • 训练数据生成:可生成用于训练语音识别模型的标准格式数据
  • 工程管理:多工程支持,便于分类管理不同场景的音频资料

系统架构

VoiceLabel 采用前后端分离架构:

  • 前端:基于 Vue.js 开发的单页应用,提供直观的用户界面
  • 后端:基于 Node.js 和 Express 框架开发的服务端,处理文件管理、音频处理和数据存储

安装与部署

前提条件

  • Node.js v16+
  • FFmpeg(用于音频处理)

前端部署

cd VoiceLabel/client
npm install
npm run build

后端部署

cd VoiceLabel/server
npm install
node index.js

环境配置

前端环境配置 (.env):

VITE_SERVER_URL=http://localhost:6080

后端环境配置 (.env):

SERVER_PORT=6080
ASR_PORT=6081

使用方法

1. 创建工程

  1. 点击右上角下拉菜单中的"创建新工程"
  2. 输入工程名称和描述
  3. 点击创建按钮完成工程创建

2. 上传音频文件

  1. 在右侧区域拖放或选择音频文件上传
  2. 上传完成后,文件将显示在右侧列表中

3. 音频转写

  1. 从右侧列表选择音频文件进行播放
  2. 在波形图上选择需要转写的区域
  3. 点击"将选定区域音频转文字"按钮
  4. 系统会自动将该区域的音频转为文字
  5. 可编辑转写结果并添加标注信息(如发言者)
  6. 点击"添加"或"更新"按钮保存信息

4. 批量静音检测转写

  1. 选择音频文件后点击"静音检测批量转换文字"
  2. 系统会自动检测音频中的非静音区域并进行转写
  3. 转写结果将自动添加到信息列表中

5. 内容管理

  • 点击信息列表中的条目可进行编辑
  • 使用操作按钮可进行删除、标记、上下移动等操作
  • 可通过"往前插入"和"往前融合"功能管理条目顺序和内容

6. 数据导出

  • 点击"导出内容"可导出当前工程的所有转写内容
    • 简单模式:仅导出来源和文本
    • 详细模式:包含时间戳和时长等完整信息
  • 点击"导出训练数据"可导出用于语音识别模型训练的数据

数据格式

工程数据结构

工程数据存储在 server/projects 目录下,每个工程以唯一 ID 为名创建单独的目录,包含以下子目录:

  • uploads/:存储上传的原始音频文件
  • data/:存储工程数据文件
    • info.jsonl:主要信息数据文件,每行一条 JSON 格式记录
    • mp3/:存储处理后的音频片段
    • train.jsonl:训练数据格式文件(生成时创建)
    • val.jsonl:验证数据格式文件(生成时创建)
  • annotations/:存储音频区域标注信息
  • temp/:临时文件存储区域

info.jsonl 数据格式

{
  "uuid": "唯一标识符",
  "datetime": "时间戳",
  "from": "发言人/来源",
  "text": "转写文本内容",
  "timelen": "时长",
  "audioUrl": "音频文件URL",
  "startTime": "开始时间(秒)",
  "endTime": "结束时间(秒)",
  "mark": "是否标记"
}

训练数据格式 (train.jsonl/val.jsonl)

{
  "key": "唯一标识符",
  "text_language": "<|zh|>",
  "emo_target": "<|NEUTRAL|>",
  "event_target": "<|Speech|>",
  "with_or_wo_itn": "<|withitn|>",
  "target": "文本内容",
  "source": "音频文件路径",
  "target_len": "文本长度",
  "source_len": "特征长度"
}

VoiceRecordClient 实时语音录制客户端

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"
}

API 接口

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 文件中
  • 音频区域信息存储在对应的标注文件中

应用场景

  • 会议记录转写
  • 安全事件分析与记录
  • 语音内容归档
  • 语音识别模型训练数据准备
  • 音频内容标注与分类

SenseVoice 工具使用

start_webapi.sh - WebAPI 服务启动脚本

start_webapi.sh 用于启动 SenseVoice 的 WebAPI 服务,提供 HTTP API 接口供其他应用调用语音识别功能。

功能特点

  • 自动激活 conda 环境(py310)
  • .env 文件读取端口配置
  • 使用 uvicorn 启动 FastAPI 服务
  • 支持热重载(代码修改后自动重启)
  • 日志输出到控制台和文件

使用方法

  1. 配置环境变量

    SenseVoice 目录下创建或编辑 .env 文件:

    SENSEVOICE_PORT=6014
    SENSEVOICE_DEVICE=cuda:0
    
  2. 启动服务

    cd SenseVoice
    chmod +x start_webapi.sh
    ./start_webapi.sh
  3. 服务访问

    服务启动后,API 文档可通过以下地址访问:

    • API 文档:http://localhost:6014/docs
    • 健康检查:http://localhost:6014/health

注意事项

  • 确保已安装 conda 并配置了 py310 环境
  • 确保 .env 文件中配置了正确的端口号
  • 服务默认监听 0.0.0.0,允许外部访问
  • 日志文件保存在 webapi.log

generate_jsonl.py - 训练数据生成工具

generate_jsonl.py 用于从音频文件生成训练数据集,支持单个数据集生成和多个数据集合并功能。

功能特点

  • 自动数据集分割:将音频文件按 7:3 比例分割为训练集和验证集
  • 音频长度计算:自动计算音频文件的特征长度(source_len)
  • 去重功能:合并数据集时自动检测并去除重复的音频文件(基于音频内容哈希)
  • 文件名处理:自动处理文件名冲突,生成唯一标识符
  • 多格式支持:支持多种音频格式(需要 librosa 支持)

使用方法

1. 生成单个数据集

将 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": 音频特征长度
}
2. 合并多个数据集

合并多个数据集目录的训练和验证数据:

# 方式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)作为音频长度。

注意事项

  1. 音频文件名应直接包含转写文本(不含扩展名),例如:你好世界.mp3
  2. 确保音频文件格式正确,脚本会尝试多种方法加载音频
  3. 合并数据集时,确保有足够的磁盘空间存储复制的音频文件
  4. 大量音频文件处理可能需要较长时间,请耐心等待

CosyVoice 语音合成服务

CosyVoice/api.py - 5050 端口 WebAPI

CosyVoice/api.py 提供基于 CosyVoice2 的文本转语音 WebAPI 服务,默认监听 0.0.0.0:5050,供前端或其他后端通过 HTTP 调用。

功能概述

  • 提供说话人列表接口:GET /list_spk
  • 提供文本转语音接口:GET/POST /tts
  • 支持按说话人名称合成音频,返回 WAV 流或音频文件 URL

启动前准备

  1. 按照 CosyVoice/README.md 中的说明,完成以下步骤:
    • 克隆并初始化子模块
    • 创建并激活 Conda 环境(推荐环境名:cosyvoice,Python 3.10)
    • 安装 requirements.txt 中的依赖
    • 下载并放置预训练模型到 CosyVoice/pretrained_models/CosyVoice2-0.5B
  2. 确保 CosyVoice/asset 目录下的示例音频存在(如 叶倩彤.wav郭德纲.wav)。

启动 WebAPI 服务

在项目根目录下已提供启动脚本 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 测试页面对接 CosyVoice WebAPI

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

使用流程:

  1. 启动 CosyVoice WebAPI(参考上文启动脚本)。

  2. JavaScript 目录启动本地测试服务:

    cd JavaScript
    npm install   # 如已安装可略过
    node server.js
  3. 浏览器访问 http://localhost:3000/public/test_api.html

    • 在页面顶部配置 API 基地址(如不修改则使用 http://localhost:5050
    • 点击“获取说话人列表”确认后端可用
    • 输入文本与说话人名称,点击“合成语音”进行测试

注意事项

  1. 确保系统有足够的存储空间处理音频文件
  2. 为获得最佳转写效果,建议使用噪音较少的录音
  3. ASR 服务需单独部署或配置
  4. 频繁导出大量数据可能影响系统性能

监控命令 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')"

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published