[中文正文内容]

Navigation Menu

切换导航 Sign in

搜索或跳转到...

搜索代码、仓库、用户、议题、拉取请求...

搜索 清除 搜索语法提示

pipecat-ai / **smart-turn ** Public

License

BSD-2-Clause license

pipecat-ai/smart-turn

main BranchesTags 转到文件 代码

文件夹和文件

名称| 名称| 最后提交信息| 最后提交日期 ---|---|---|---

最新提交

历史

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 模型,该模型:

当前限制:

中期目标:

模型架构

Wav2Vec2-BERT 是 Meta AI 的 Seamless-M4T 项目中开发的语音编码器模型。 它是一个 580M 参数的基础模型,可以利用声学和语言信息。 该基础模型经过超过 143 种语言的 450 万小时未标记音频数据的训练。

要使用 Wav2Vec2-BERT,通常需要向基础模型添加其他层,然后在特定于应用程序的数据集上进行训练/微调。

我们目前正在使用一个简单的两层分类头,它方便地打包在 Hugging Face Transformers 库中,称为 Wav2Vec2BertForSequenceClassification

我们已经试验了各种架构,包括广泛使用的 Wav2Vec2-BERT 前身 Wav2Vec2 以及更复杂的分类方法。 我们中一些从事该模型工作的人认为,当我们扩展数据集以包含更多复杂性时,简单的分类头会很好地工作。 我们中的一些人有相反的直觉。 时间会证明一切! 如果您刚刚开始接触 ML 工程,那么试验模型架构的添加是一个很好的学习项目。 请参阅下面的“要做的事情”。

链接

推理

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

收集和贡献数据

目前,有两个数据集用于训练和评估:

加载这两个数据集时,会创建四个拆分。

 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%)

我们对该模型的初始版本的期望是过度拟合非大量数据,并在进行交互式实验时超过非量化的良好阈值。 下一步是扩大数据量,并从过度拟合转向更多泛化。 Confusion matrix for test set [ 更多关于数据的注释即将推出 ]

要做的事情

更多语言

基础的 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 设备上本地运行此模型(与量化结合使用)。

贡献者

关于

未提供描述、网站或主题。

资源

Readme

License

BSD-2-Clause license Activity

Stars

131 stars

Watchers

12 watching

Forks

4 forks

Releases

未发布版本

Packages 0

未发布程序包

Contributors 2

语言

Footer

© 2025 GitHub, Inc.

Footer navigation