Show HN: 开源、原生音频的 Turn Detection 模型
[中文正文内容]
Navigation Menu
切换导航 Sign in
搜索或跳转到...
搜索代码、仓库、用户、议题、拉取请求...
搜索 清除 搜索语法提示
pipecat-ai / **smart-turn ** Public
License
pipecat-ai/smart-turn
文件夹和文件
名称| 名称| 最后提交信息| 最后提交日期 ---|---|---|---
最新提交
历史
11 Commits datasets| datasets docs/static| docs/static .gitattributes| .gitattributes .gitignore| .gitignore LICENSE| LICENSE README.md| README.md inference.py| inference.py predict.py| predict.py record_and_predict.py| record_and_predict.py requirements.txt| requirements.txt train.py| train.py 查看所有文件
Smart turn detection
这是一个开源的、社区驱动的、原生的音频 turn detection 模型。
HuggingFace 页面:pipecat-ai/smart-turn
Turn detection 是会话语音 AI 技术栈中最重要的功能之一。 Turn detection 意味着确定语音代理何时应该响应人类语音。
今天,大多数语音代理使用 voice activity detection (VAD) 作为 turn detection 的基础。 VAD 将音频分割成“语音”和“非语音”片段。 VAD 无法考虑语音的实际语言或声学内容。 人类基于语法、语调和语速以及各种其他复杂的音频和语义线索进行 turn detection。 我们希望构建一个比基于 VAD 的方法更符合人类期望的模型。
这是一个真正开放的模型(BSD 2-clause license)。 任何人都可以使用、fork 和贡献此项目。 该模型最初是 Pipecat 生态系统中一个正在进行中的组件。 Pipecat 是一个开源的、与供应商无关的框架,用于构建语音和多模式实时 AI 代理。
模型当前状态
这是一个最初的概念验证模型。 它处理少数常见的非完成场景。 它仅支持英语。 训练数据集相对较小。
我们已经试验了许多不同的架构和训练数据方法,并且现在发布此版本的模型,因为我们相信性能可以快速提高。
我们邀请您尝试它,并为模型开发和实验做出贡献。
运行概念验证模型检查点
设置环境。
python3.12 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
运行一个命令行实用程序,该实用程序从系统麦克风流式传输音频,使用 VAD 检测片段的开始/停止,并将每个片段发送到模型以进行短语终点预测。
#
# 第一次启动大约需要 30 秒。
#
# “词汇”有限。 尝试:
#
# - "I can't seem to, um ..."
# - "I can't seem to, um, find the return label."
python record_and_predict.py
项目目标
此模型的当前版本基于 Meta AI 的 Wav2Vec2-BERT backbone。 稍后会详细介绍模型架构。
此项目的高级目标是构建一个最先进的 turn detection 模型,该模型:
- 任何人都可以使用,
- 易于在生产环境中部署,
- 易于针对特定应用需求进行微调。
当前限制:
- 仅限英语
- 推理速度相对较慢
- GPU 上约 150 毫秒
- CPU 上约 1500 毫秒
- 训练数据主要集中在片段结尾处的停顿填充词。
中期目标:
- 支持多种语言
- GPU 上的推理时间 <50 毫秒,CPU 上的推理时间 <500 毫秒
- 在训练数据中捕获更广泛的语音细微差别
- 完全合成的训练数据管道
- 模型的文本条件,以支持诸如信用卡、电话号码和地址输入之类的“模式”。
模型架构
Wav2Vec2-BERT 是 Meta AI 的 Seamless-M4T 项目中开发的语音编码器模型。 它是一个 580M 参数的基础模型,可以利用声学和语言信息。 该基础模型经过超过 143 种语言的 450 万小时未标记音频数据的训练。
要使用 Wav2Vec2-BERT,通常需要向基础模型添加其他层,然后在特定于应用程序的数据集上进行训练/微调。
我们目前正在使用一个简单的两层分类头,它方便地打包在 Hugging Face Transformers 库中,称为 Wav2Vec2BertForSequenceClassification
。
我们已经试验了各种架构,包括广泛使用的 Wav2Vec2-BERT 前身 Wav2Vec2 以及更复杂的分类方法。 我们中一些从事该模型工作的人认为,当我们扩展数据集以包含更多复杂性时,简单的分类头会很好地工作。 我们中的一些人有相反的直觉。 时间会证明一切! 如果您刚刚开始接触 ML 工程,那么试验模型架构的添加是一个很好的学习项目。 请参阅下面的“要做的事情”。
链接
- Meta AI Seamless paper
- W2v-BERT 2.0 speech encoder README
- Wav2Vec2BertForSequenceClassification HuggingFace docs
推理
predict.py
展示了如何通过模型传递音频样本以进行分类。 inference.py
中的一个小型便捷函数包装了音频预处理和 PyTorch 推理代码。
# defined in inference.py
def predict_endpoint(audio_array):
"""
Predict whether an audio segment is complete (turn ended) or incomplete.
预测音频片段是完整的(turn 结束)还是不完整的。
Args:
audio_array: Numpy array containing audio samples at 16kHz
audio_array:包含 16kHz 音频采样的 Numpy 数组
Returns:
Dictionary containing prediction results:
包含预测结果的字典:
- prediction: 1 for complete, 0 for incomplete
- prediction:1 表示完整,0 表示不完整
- probability: Probability of completion class
- probability:完成类的概率
"""
# Process audio
# 处理音频
inputs = processor(
audio_array,
sampling_rate=16000,
padding="max_length",
truncation=True,
max_length=800, # Maximum length as specified in training
return_attention_mask=True,
return_tensors="pt",
)
# Move inputs to device
# 将输入移动到设备
inputs = {k: v.to(device) for k, v in inputs.items()}
# Run inference
# 运行推理
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
# Get probabilities using softmax
# 使用 softmax 获取概率
probabilities = torch.nn.functional.softmax(logits, dim=1)
completion_prob = probabilities[0, 1].item() # Probability of class 1 (Complete)
# 完成类(类 1)的概率
# Make prediction (1 for Complete, 0 for Incomplete)
# 进行预测(1 表示完成,0 表示不完整)
prediction = 1 if completion_prob > 0.5 else 0
return {
"prediction": prediction,
"probability": completion_prob,
}
训练
所有训练代码都在 train.py
中定义。
您可以在本地或使用 Modal 运行训练。 除非您禁用日志记录,否则训练运行将记录到 Weights & Biases。
# To run a training job on Modal, upload training data to a Modal volume,
# To run a training job on Modal, upload training data to a Modal volume,
# set up the Modal environment, then run:
# 要在 Modal 上运行训练作业,请将训练数据上传到 Modal 卷,
# 设置 Modal 环境,然后运行:
modal run --detach train.py
收集和贡献数据
目前,有两个数据集用于训练和评估:
- datasets/human_5_all -- 从人际交互中记录的分割语音
- datasets/rime_2 -- 使用 Rime 生成的合成语音
加载这两个数据集时,会创建四个拆分。
- 训练集、验证集和测试集是合成数据和人类数据的混合
- human eval 集仅包含人类数据
7 -- TRAIN --
8 Total samples: 5,694
9 Positive samples (Complete): 2,733 (48.00%)
10 Negative samples (Incomplete): 2,961 (52.00%)
11
12 -- VALIDATION --
13 Total samples: 712
14 Positive samples (Complete): 352 (49.44%)
15 Negative samples (Incomplete): 360 (50.56%)
16
17 -- TEST --
18 Total samples: 712
19 Positive samples (Complete): 339 (47.61%)
20 Negative samples (Incomplete): 373 (52.39%)
21
22 -- HUMAN_EVAL --
23 Total samples: 773
24 Positive samples (Complete): 372 (48.12%)
25 Negative samples (Incomplete): 401 (51.88%)
我们对该模型的初始版本的期望是过度拟合非大量数据,并在进行交互式实验时超过非量化的良好阈值。 下一步是扩大数据量,并从过度拟合转向更多泛化。
[ 更多关于数据的注释即将推出 ]
要做的事情
更多语言
基础的 Wav2Vec2-BERT 模型经过大量多语言数据的训练。 支持其他语言将需要收集和清理或为每种语言合成生成数据。
更多数据
当前的检查点是在大约 8,000 个样本的数据集上训练的。 这些样本主要关注填充词,这些填充词是英语语音中停顿而没有完成话语的典型迹象。
训练中使用两个数据集:从人类说话者那里收集的约 4,000 个样本,以及使用 Rime 生成的约 4,000 个合成数据样本。
最大的短期数据需求是收集、分类和清理代表更广泛语音模式的人类数据样本:
- 表示“思考”暂停而不是完成语音片段的语调和节奏
- 通常出现在未完成语音片段中(但不在完成片段中)的语法结构
- 更多个人说话者代表
- 更多地区和口音代表
datasets/rime_2
数据集中的合成数据样本目前仅能小幅提高模型性能。 但是,该项目的一个可能目标是朝着完全合成的数据生成管道努力。 这种管道的潜在优势包括能够更轻松地支持更多语言、更好地为构建更准确的模型版本提供推动力,以及能够快速为特定用例定制模型。
如果您在引导语音模型输出特定模式方面有专业知识(或者如果您想尝试和学习),请考虑贡献合成数据。
架构实验
当前的模型架构相对简单,因为基础的 Wav2Vec2-BERT 模型已经非常强大。
但是,试验添加到 Wav2Vec2-BERT 模型之上的其他分类方法会很有趣。 如果我们想从二元分类转向更适合此 turn detection 任务的方法,这可能特别有用。
例如,最好为模型提供额外的上下文来调节推理。 这种情况是让模型“知道”用户当前正在背诵信用卡号、电话号码或电子邮件地址。
向模型添加额外的上下文是一个开放式的研究挑战。 一些更简单的待办事项包括:
- 试验在训练期间冻结不同数量的层。
- 超参数调整。
- 尝试不同的分类头大小或略有不同的分类头设计和损失函数。
支持在更多平台上进行训练
我们已经在 Google Colab 上训练了该模型的早期版本。 我们应该再次支持 Colab 作为训练平台! 最好能快速入门,以便在各种平台上进行训练。
我们还应该将训练代码移植到 Apple 的 MLX 平台。 我们很多人都有 MacBook!
优化
该模型很可能在量化版本中表现良好。 量化版本的运行速度应比当前的 float32 权重快得多。
PyTorch 推理代码没有经过特别优化。 对于此模型架构,我们应该能够手写推理代码,该代码在 GPU 和 CPU 上的运行速度都快得多。
最好能将推理代码移植到 Apple 的 MLX 平台。 这对于本地开发和调试特别有用,并且可能可以实现在 iOS 设备上本地运行此模型(与量化结合使用)。
贡献者
关于
未提供描述、网站或主题。
资源
License
Stars
Watchers
Forks
Releases
未发布版本
Packages 0
未发布程序包