说明文档
<div align="center"> <img src="https://cdn-uploads.huggingface.co/production/uploads/64429aaf7feb866811b12f73/uVc48ScCvxwtYctCJnrKr.png" width=768 height=768 /> </div>
Hey Buddy! 是一个用于训练唤醒词模型(也称为音频关键词检测器)并将其部署到浏览器中以在 CPU 或 GPU 上实时使用的库。
使用唤醒词作为语音启用 Web 应用程序的门控机制具有许多优势,包括降低功耗、提高隐私保护,以及在嘈杂环境中相比语音转文本系统具有更好的性能。
Hey Buddy! 以可用性和灵活性为设计理念,具有以下特点:
- 可通过简单的
pip install heybuddy安装 - 使用单个命令即可训练模型,无需下载或收集数据
- 模型对嘈杂环境和急促语音具有很强的适应能力
- 可用于商业用途 - 使用开放数据和具有商业可行许可的库(详见下文)
- 可同时处理任意数量的唤醒词模型,并留有充足的帧预算
- 面向语音命令的 JavaScript 模块提供从唤醒词开始到语音结束的音频录制,可直接用于下游处理
- 提供回调接口以实现更高级的集成
演示
现场演示空间可在此处访问。由于完全在设备上运行,不会消耗任何 HuggingFace 积分。
安装
由于 piper-phonemize 仅在 Linux 上工作,Python 库目前仅支持 Linux。
安装和使用 Hey Buddy 最简单的方法是使用 Anaconda/Miniconda 和维护的环境文件,如下所示:
wget https://raw.githubusercontent.com/painebenjamin/hey-buddy/refs/heads/main/environment.yml
conda env create -f environment.yml
conda activate heybuddy
pip install heybuddy[gpu]
如果您已经有一个可用的 CUDA 环境,可以直接跳到 pip install heybuddy。在这种情况下,您需要单独安装 piper-phonemize,请参阅 GitHub 上的 rhasspy/piper-phonemizer 发布页面 找到适合您 Python 版本的最新 wheel 文件 - 例如,环境文件使用 Python 3.10,因此它安装 https://github.com/rhasspy/piper-phonemize/releases/download/v1.1.0/piper_phonemize-1.1.0-cp310-cp310-manylinux_2_28_x86_64.whl。
训练模型
训练模型非常简单,只需执行 heybuddy train:
heybuddy train "hello world"
这将:
- 使用 Piper TTS 生成 100,000 个唤醒短语的训练语音样本
- 使用 Piper TTS 生成 100,000 个语音相似短语的对抗性训练语音样本
- 使用对话或命令式语音中常见的后续词增强唤醒词文本
- 使用各种信噪比的效果音和音乐增强生成的语音样本
- 使用不同的脉冲响应(IR)对这些语音样本进行混响处理
- 进行各种额外失真处理的组合,包括白噪声、音调偏移等
- 从两组样本中提取语音嵌入,存储为内存映射的
numpy数组以便在训练期间快速访问 - 重复上述过程以生成测试样本和验证*样本
- 如果尚未下载,则下载预计算的训练和验证数据集
- 以自动化的方式分三个阶段训练模型
- 保存模型检查点,以便转换为 ONNX 或在以后恢复训练
* 验证与测试略有不同,正样本不添加噪声增强,因此作为"最佳情况"的语音验证,应该接近 100% 准确。此外,验证不包括对抗样本。
最后,提供了一个便捷的脚本用于将 .pt 检查点转换为 Web 端的 .onnx 模型:
heybuddy convert checkpoints/hello_world_final.pt
您现在可以在 Web 上提供此模型。请参阅下面的 JavaScript API 文档。
生成的音频示例
生成新数据集时,将在当前工作目录中生成一个示例 .wav 文件供您收听。以下是一些示例:
| 文本 | TTS 输出 | 增强后的 TTS 输出 | 对抗性(发音相似)TTS 输出 | 增强后的对抗性 TTS 输出 |
|---|---|---|---|---|
| Buddy | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/buddy.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/buddy_augmented.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/buddy_adv.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/buddy_adv_augmented.mp3"></audio> |
| Hey Buddy | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/hey_buddy.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/hey_buddy_augmented.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/hey_buddy_adv.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/hey_buddy_adv_augmented.mp3"></audio> |
| Hi Buddy | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/hi_buddy.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/hi_buddy_augmented.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/hi_buddy_adv.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/hi_buddy_adv_augmented.mp3"></audio> |
| Yo Buddy | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/yo_buddy.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/yo_buddy_augmented.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/yo_buddy_adv.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/yo_buddy_adv_augmented.mp3"></audio> |
| Sup Buddy | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/sup_buddy.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/sup_buddy_augmented.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/sup_buddy_adv.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/sup_buddy_adv_augmented.mp3"></audio> |
| Okay Buddy | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/okay_buddy.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/okay_buddy_augmented.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/okay_buddy_adv.mp3"></audio> | <audio controls src="https://huggingface.co/datasets/benjamin-paine/hey-buddy/resolve/main/examples/okay_buddy_adv_augmented.mp3"></audio> |
预计算数据集
使用命令行界面和默认选项时,训练和验证数据集会自动下载。有关这些数据集的更多信息以及如何创建自己的数据集,请参阅此处。
如果您的空间有限,请参考下表中的命令行标志,这些标志可以帮助减少大小。
| 标志 | 大小 | 默认 |
|---|---|---|
--training-full-default-dataset |
72 GB | 是 |
--training-large-default-dataset |
46 GB | 否 |
--training-medium-default-dataset |
25 GB | 否 |
--training-no-default-dataset |
0 | 否 |
注意,当不使用默认数据集时,您需要使用 --training-dataset <path> 提供自己的数据集。有关如何创建自己的数据集,请参阅上面的链接。
增强数据集
这些是默认的增强数据集。选择这些数据集是因为它们的商业可用性和没有 Copyleft 限制,因此您训练的唤醒词模型完全属于您自己。如果您替换为其他数据集,请确保您拥有使用该数据进行 AI 训练所需的许可。
- benjamin-paine/mit-impulse-response-survey-16khz (CC-BY)
- benjamin-paine/freesound-laion-640k-commercial-16khz-full (CC0, CC-BY, CC-Sampling)
- benjamin-paine/free-music-archive-commercial-16khz-full (CC0, CC-BY, CC-Sampling+, FMA Sound Recording Common Law, Free Art License, Public Domain)
使用命令行时,传递 --augmentation-dataset-streaming 以流式传输数据集而不是下载它们。出于性能考虑,不建议这样做。
要禁用这些数据集,请传递 --augmentation-no-default-background-dataset 和 --augmentation-no-default-impulse-dataset。您应该以 <username>/<repo> 格式传递自己的数据集,以便通过 load_dataset 加载。
CLI 选项
Usage: heybuddy train [OPTIONS] PHRASE
训练唤醒词检测模型。
Options:
--additional-phrase TEXT 用于训练的额外短语。
--wandb-entity TEXT 用于日志记录的 W&B 实体。
--layer-dim INTEGER 模型线性层的维度。 [default: 96]
--num-layers INTEGER 感知器块的数量。 [default:
2]
--num-heads INTEGER 使用 Transformer 模型时的注意力头数量。 [default: 1]
--steps INTEGER 优化步数。 [default: 12500]
--stages INTEGER 训练阶段数。 [default: 3]
--learning-rate FLOAT 优化器的学习率。 [default:
0.001]
--high-loss-threshold FLOAT 高损失值的阈值(例如,使用默认值 0.001 时,如果值应该为 0 但高于 0.001,或应该为 1 但低于 0.999,则为高损失)。 [default: 0.0001]
--target-false-positive-rate FLOAT
模型的目标假阳性率。 [default: 0.5]
--dynamic-negative-weight / --no-dynamic-negative-weight
根据每次验证步骤的目标假阳性率动态调整负样本权重(而不是在阶段之间)。 [default: dynamic-negative-weight]
--negative-weight FLOAT 损失函数的负样本权重。 [default: 1.0]
--training-full-default-dataset
使用完整的预计算默认训练集。 [default: full]
--training-large-default-dataset
使用大型预计算默认训练集。 [default: full]
--training-medium-default-dataset
使用中型预计算默认训练集。 [default: full]
--training-no-default-dataset 不使用预计算默认训练集。 [default: full]
--training-dataset FILE 使用自定义预计算训练集。
--augment-phrase-prob FLOAT 增强短语的概率。 [default: 0.75]
--augment-phrase-default-words / --augment-phrase-no-default-words
使用默认词进行增强。 [default: augment-phrase-default-words]
--augment-phrase-word TEXT 用于增强的自定义词。
--augmentation-default-background-dataset / --augmentation-no-default-background-dataset
使用默认背景数据集进行增强。 [default: augmentation-
default-background-dataset]
--augmentation-background-dataset TEXT
使用自定义背景数据集进行增强。
--augmentation-default-impulse-dataset / --augmentation-no-default-impulse-dataset
使用默认脉冲数据集进行增强。 [default: augmentation-
default-impulse-dataset]
--augmentation-impulse-dataset TEXT
使用自定义脉冲数据集进行增强。
--augmentation-dataset-streaming / --augmentation-dataset-no-streaming
流式传输增强数据集,而不是先下载。 [default: augmentation-
dataset-no-streaming]
--augmentation-seven-band-prob FLOAT
应用七段均衡器增强的概率。 [default: 0.25]
--augmentation-seven-band-gain-db FLOAT
七段均衡器增强的分贝增益。 [default: 6.0]
--augmentation-tanh-distortion-prob FLOAT
应用 tanh 失真增强的概率。 [default: 0.25]
--augmentation-tanh-distortion-min FLOAT
tanh 失真增强的最小值。 [default: 0.0001]
--augmentation-tanh-distortion-max FLOAT
tanh 失真增强的最大值。 [default: 0.1]
--augmentation-pitch-shift-prob FLOAT
应用音调偏移增强的概率。 [default: 0.25]
--augmentation-pitch-shift-semitones INTEGER
音调偏移增强的半音数。 [default: 3]
--augmentation-band-stop-prob FLOAT
应用带阻滤波器增强的概率。 [default: 0.25]
--augmentation-colored-noise-prob FLOAT
应用彩色噪声增强的概率。 [default: 0.25]
--augmentation-colored-noise-min-snr-db FLOAT
彩色噪声增强的最小信噪比。 [default: 10.0]
--augmentation-colored-noise-max-snr-db FLOAT
彩色噪声增强的最大信噪比。 [default: 30.0]
--augmentation-colored-noise-min-f-decay FLOAT
彩色噪声增强的最小频率衰减。 [default: -1.0]
--augmentation-colored-noise-max-f-decay FLOAT
彩色噪声增强的最大频率衰减。 [default: 2.0]
--augmentation-background-noise-prob FLOAT
应用背景噪声增强的概率。 [default: 0.75]
--augmentation-background-noise-min-snr-db FLOAT
背景噪声增强的最小信噪比。 [default:
-10.0]
--augmentation-background-noise-max-snr-db FLOAT
背景噪声增强的最大信噪比。 [default:
15.0]
--augmentation-gain-prob FLOAT 应用增益增强的概率。 [default: 1.0]
--augmentation-reverb-prob FLOAT
应用混响增强的概率。 [default: 0.75]
--logging-steps INTEGER 日志记录步数的频率。 [default: 1]
--validation-steps INTEGER 验证模型的频率。 [default:
250]
--checkpoint-steps INTEGER 保存模型的频率。 [default:
5000]
--positive-samples INTEGER 用于训练的正样本数量。需要时会合成生成更多。 [default: 100000]
--adversarial-samples INTEGER 用于训练的对抗样本数量。需要时会合成生成更多。 [default: 100000]
--adversarial-phrases INTEGER 用于训练的对抗短语数量。需要时会合成生成更多。 [default: 250]
--adversarial-phrase-custom TEXT
用于训练的自定义对抗短语。
--positive-batch-size INTEGER 训练期间每个批次中包含的正样本数量。 [default: 50]
--negative-batch-size INTEGER 训练期间每个批次中包含的负样本数量。 [default: 1000]
--adversarial-batch-size INTEGER
训练期间每个批次中包含的对抗样本数量。 [default:
50]
--num-batch-threads INTEGER 用于创建训练批次的线程数。 [default: 12]
--validation-positive-batch-size INTEGER
验证期间每个批次中包含的正样本数量。 [default: 50]
--validation-negative-batch-size INTEGER
验证期间每个批次中包含的负样本数量。 [default:
1000]
--validation-samples INTEGER 用于验证的样本数量。需要时会合成生成更多。 [default: 25000]
--validation-num-batch-threads INTEGER
用于创建验证批次的线程数。 [default: 1]
--validation-default-dataset / --validation-no-default-dataset
使用默认验证数据集。 [default: validation-default-dataset]
--validation-dataset FILE 使用自定义预计算验证集。
--testing-positive-samples INTEGER
用于测试的正样本数量。需要时会合成生成更多。 [default: 25000]
--testing-adversarial-samples INTEGER
用于测试的对抗样本数量。需要时会合成生成更多。 [default: 25000]
--testing-positive-batch-size INTEGER
测试期间每个批次中包含的正样本数量。默认与训练期间使用的大小匹配。
--testing-adversarial-batch-size INTEGER
测试期间每个批次中包含的对抗样本数量。默认与训练期间使用的大小匹配。
--testing-num-batch-threads INTEGER
用于创建测试批次的线程数。 [default: 1]
--resume / --no-resume 从上次检查点恢复训练。 [default: no-resume]
--debug / --no-debug 启用调试日志。 [default: no-debug]
--help 显示此消息并退出。
评估模型
训练期间会记录许多评估指标。访问这些数据的最佳方式是使用 Weights & Biases,然后通过 --wandb-entity <name> 将您的实体(用户名或团队名)传递给训练脚本。
<div align="center"> <figure> <a href="https://cdn-uploads.huggingface.co/production/uploads/64429aaf7feb866811b12f73/lKp-YyG2p-JtmkP8qK6fw.png" target="_blank"> <img src="https://cdn-uploads.huggingface.co/production/uploads/64429aaf7feb866811b12f73/lKp-YyG2p-JtmkP8qK6fw.png" width="400" /> </a> <figcaption> 来自 Weights & Biases 的训练指标。点击放大。 </figcaption> </figure> </div>
推理
JavaScript API
Hey Buddy! 以两个 JavaScript 文件的形式分发,应该通过任何实现 Web 应用程序提供:
hey-buddy.min.js(90 kB)提供 HeyBuddy API,以及hey-buddy-worklet.js(1 kB)实现 Audio Worklet 接口,浏览器将使用 AudioWorklet API 导入该接口。
在导入 HeyBuddy JS API 之前,您需要使 ONNX 运行时可用。最简单的方法是使用 JS CDN,如下所示:
<!-- ONNX Runtime -->
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.19.0/dist/ort.min.js"></script>
<!-- Hey Buddy API -->
<script src="/path/to/my/website/hey-buddy.min.js"></script>
<!-- Your Code -->
<script>...</script>
您还需要托管由 heybuddy convert 创建的 onnx 文件(见上文)。
您的实现代码可能如下所示:
const options = {
record: true, // 不需要时禁用以节省内存
modelPath: ["/models/my-model.onnx", "/models/my-other-model.onnx"], // 也接受单个字符串
// workletUrl: /path/to/my/website/hey-buddy-worklet.js // 仅在与库代码不同路径时需要
};
const heyBuddy = new HeyBuddy(options);
// 对录音执行某些操作
heyBuddy.onRecording(async (audio) => {
// audio 是样本的 Float32Array
});
// 每帧执行某些操作
heyBuddy.onProcessed((result) => {
/**
* 每帧触发,包含:
* {
* listening: bool,
* recording: bool,
* speech: {
* probability: 0.0 <= float <= 1.0,
* active: bool
* },
* wakeWords: {
* $modelNameWithoutExtension: {
* probability: 0.0 <= float <= 1.0,
* active: bool
* }
* }
* }
*/
});
Python API
要直接使用 torch 模型,您可以执行以下操作。
from heybuddy import WakeWord
audio = "/path/to/audio.wav" # 或 flac 或 mp3 或 numpy array/tensor(int16 或 float32)或相同类型的列表
model = WakeWord.from_file("/path/to/model.pt")
model.to("cuda") # 可选
predictions = model.predict(
audio,
threshold=0.5, # 您可以尝试不同的阈值
return_scores=False, # 为 true 时,返回预测分数而不是布尔值。默认为 false。
)
first_audio_has_wakeword = predictions[0] # 默认为布尔值
还提供了线程 API 以便于使用并最小化性能影响。
from heybuddy import WakeWordModelThread
audio = "/path/to/audio.wav" # 或 flac 或 mp3 或 numpy array/tensor(int16 或 float32)或相同类型的列表
thread = WakeWordModelThread(
"/path/to/model.pt", # 或 onnx
device_id=None, # 设置为 GPU 索引以使用 CUDA 进行 torch 或 onnx,否则在 CPU 上运行
threshold=0.5, # 您可以尝试不同的阈值
return_scores=False, # 为 true 时,返回预测分数而不是布尔值。默认为 false。
)
thread.put(audio)
predictions = thread.get( # 与 queue.Queue.get() 参数相同
block=True,
timeout=None
)
first_audio_has_wakeword = predictions[0] # 默认为布尔值
附录
这些是一些可能有用的 JavaScript 代码片段,用于处理原始音频样本。
/**
* 使用 Web Audio API 播放音频样本。
* @param {Float32Array} audioSamples - 要播放的音频样本。
* @param {number} sampleRate - 音频样本的采样率。
*/
function playAudioSamples(audioSamples, sampleRate = 16000) {
// 创建 AudioContext
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
// 创建 AudioBuffer
const audioBuffer = audioContext.createBuffer(
1, // 通道数
audioSamples.length, // 缓冲区长度(样本数)
sampleRate // 采样率(每秒样本数)
);
// 用 Float32Array 音频样本填充 AudioBuffer
audioBuffer.getChannelData(0).set(audioSamples);
// 创建 BufferSource 节点
const source = audioContext.createBufferSource();
source.buffer = audioBuffer;
// 将源连接到 AudioContext 的目标(扬声器)
source.connect(audioContext.destination);
// 开始播放
source.start();
};
/**
* 将浮点音频样本转换为 Wave blob。
* @param {Float32Array} audioSamples - 要播放的音频样本。
* @param {number} sampleRate - 音频样本的采样率。
* @param {number} numChannels - 音频中的通道数。默认为 1(单声道)。
* @return {Blob} 类型为 `audio/wav` 的 blob
*/
function samplesToBlob(audioSamples, sampleRate = 16000, numChannels = 1) {
// 将字符串写入 DataView 的辅助函数
const writeString = (view, offset, string) => {
for (let i = 0; i < string.length; i++) {
view.setUint8(offset + i, string.charCodeAt(i));
}
};
// 将 Float32Array 转换为 Int16Array(16 位 PCM)的辅助函数
const floatTo16BitPCM = (output, offset, input) => {
for (let i = 0; i < input.length; i++, offset += 2) {
let s = Math.max(-1, Math.min(1, input[i])); // 限制在 [-1, 1]
output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); // 转换为 16 位 PCM
}
};
const byteRate = sampleRate * numChannels * 2; // 16 位 PCM = 每个样本 2 字节
// 计算大小
const blockAlign = numChannels * 2; // 16 位音频每个样本 2 字节
const wavHeaderSize = 44;
const dataLength = audioSamples.length * numChannels * 2; // 16 位 PCM 数据长度
const buffer = new ArrayBuffer(wavHeaderSize + dataLength);
const view = new DataView(buffer);
// 写入 WAV 文件头
writeString(view, 0, 'RIFF'); // ChunkID
view.setUint32(4, 36 + dataLength, true); // ChunkSize
writeString(view, 8, 'WAVE'); // Format
writeString(view, 12, 'fmt '); // Subchunk1ID
view.setUint32(16, 16, true); // Subchunk1Size (PCM = 16)
view.setUint16(20, 1, true); // AudioFormat (PCM = 1)
view.setUint16(22, numChannels, true); // NumChannels
view.setUint32(24, sampleRate, true); // SampleRate
view.setUint32(28, byteRate, true); // ByteRate
view.setUint16(32, blockAlign, true); // BlockAlign
view.setUint16(34, 16, true); // BitsPerSample (16 位 PCM)
writeString(view, 36, 'data'); // Subchunk2ID
view.setUint32(40, dataLength, true); // Subchunk2Size
// 将 Float32Array 音频样本转换为 16 位 PCM 并写入 DataView
floatTo16BitPCM(view, wavHeaderSize, audioSamples);
// 创建并返回 Blob
return new Blob([view], { type: 'audio/wav' });
}
/**
* 将 blob 渲染为带有控件的音频元素。
* 使用 `appendChild(result)` 添加到文档或节点。
* @param {Blob} audioBlob - 具有有效音频类型的 blob。
* @see samplesToBlob
*/
function blobToAudio(audioBlob) {
// 创建数据 URL
const url = URL.createObjectURL(audioBlob);
// 创建并配置音频元素
const audio = document.createElement("audio");
audio.controls = true;
audio.src = url;
return audio;
}
/**
* 将 blob 作为文件下载。
* @param {Blob} blob - 具有可转换为对象 URL 类型的 blob。
* @param {string} filename - 下载后的文件名。
*/
function downloadBlob(blob, filename) {
// 创建数据 URL
const url = URL.createObjectURL(blob);
// 创建并配置链接元素
const link = document.createElement("a");
link.href = url;
link.setAttribute("download", filename);
link.style.display = "none";
// 将链接添加到页面,点击,然后移除
document.body.appendChild(link);
window.requestAnimationFrame(() => {
link.dispatchEvent(new MouseEvent("click"));
document.body.removeChild(link);
});
}
许可证
- HeyBuddy 源代码和预训练模型在 Apache License 2.0 下发布。
- 预计算的训练和验证数据集在 CC-BY 4.0 下发布。有关单独的许可信息,请参阅数据集卡片。
引用和致谢
- David Scripka, OpenWakeWord (Apache 2.0 License)
- Lin, Kilgour, Roblek, Sharifi et. Al, Speech Embeddings (Apache 2.0 License)
- Rhasspy and the Open Home Foundation, Piper TTS (MIT License)
- Silero Team, SileroVAD (MIT License)
- Siebert, Adelman and Git, npy-apppend-array
@misc{lin2020trainingkeywordspotterslimited,
title={Training Keyword Spotters with Limited and Synthesized Speech Data},
author={James Lin and Kevin Kilgour and Dominik Roblek and Matthew Sharifi},
year={2020},
eprint={2002.01322},
archivePrefix={arXiv},
primaryClass={eess.AS},
url={https://arxiv.org/abs/2002.01322},
}
@inproceedings{50492,
title={Improving Automatic Speech Recognition with Neural Embeddings},
author={Christopher Li and Diamantino A. Caseiro and Leonid Velikovich and Pat Rondon and Petar S. Aleksic and Xavier L Velez},
year={2021},
address={111 8th AveNew York, NY 10011}
}
@misc{Silero VAD,
author = {Silero Team},
title = {Silero VAD: pre-trained enterprise-grade Voice Activity Detector (VAD), Number Detector and Language Classifier},
year = {2021},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/snakers4/silero-vad}},
commit = {insert_some_commit_here},
email = {hello@silero.ai}
}
@inproceedings{fma_dataset,
title = {{FMA}: A Dataset for Music Analysis},
author = {Defferrard, Micha\\"el and Benzi, Kirell and Vandergheynst, Pierre and Bresson, Xavier},
booktitle = {18th International Society for Music Information Retrieval Conference (ISMIR)},
year = {2017},
archiveprefix = {arXiv},
eprint = {1612.01840},
url = {https://arxiv.org/abs/1612.01840},
}
@inproceedings{fma_challenge,
title = {Learning to Recognize Musical Genre from Audio},
subtitle = {Challenge Overview},
author = {Defferrard, Micha\\"el and Mohanty, Sharada P. and Carroll, Sean F. and Salath\'e, Marcel},
booktitle = {The 2018 Web Conference Companion},
year = {2018},
publisher = {ACM Press},
isbn = {9781450356404},
doi = {10.1145/3184558.3192310},
archiveprefix = {arXiv},
eprint = {1803.05337},
url = {https://arxiv.org/abs/1803.05337},
}
@article{
doi:10.1073/pnas.1612524113,
author = {James Traer and Josh H. McDermott},
title = {Statistics of natural reverberation enable perceptual separation of sound and space},
journal = {Proceedings of the National Academy of Sciences},
volume = {113},
number = {48},
pages = {E7856-E7865},
year = {2016},
doi = {10.1073/pnas.1612524113},
URL = {https://www.pnas.org/doi/abs/10.1073/pnas.1612524113},
eprint = {https://www.pnas.org/doi/pdf/10.1073/pnas.1612524113},
abstract = {Sounds produced in the world reflect off surrounding surfaces on their way to our ears. Known as reverberation, these reflections distort sound but provide information about the world around us. We asked whether reverberation exhibits statistical regularities that listeners use to separate its effects from those of a sound's source. We conducted a large-scale statistical analysis of real-world acoustics, revealing strong regularities of reverberation in natural scenes. We found that human listeners can estimate the contributions of the source and the environment from reverberant sound, but that they depend critically on whether environmental acoustics conform to the observed statistical regularities. The results suggest a separation process constrained by knowledge of environmental acoustics that is internalized over development or evolution. In everyday listening, sound reaches our ears directly from a source as well as indirectly via reflections known as reverberation. Reverberation profoundly distorts the sound from a source, yet humans can both identify sound sources and distinguish environments from the resulting sound, via mechanisms that remain unclear. The core computational challenge is that the acoustic signatures of the source and environment are combined in a single signal received by the ear. Here we ask whether our recognition of sound sources and spaces reflects an ability to separate their effects and whether any such separation is enabled by statistical regularities of real-world reverberation. To first determine whether such statistical regularities exist, we measured impulse responses (IRs) of 271 spaces sampled from the distribution encountered by humans during daily life. The sampled spaces were diverse, but their IRs were tightly constrained, exhibiting exponential decay at frequency-dependent rates: Mid frequencies reverberated longest whereas higher and lower frequencies decayed more rapidly, presumably due to absorptive properties of materials and air. To test whether humans leverage these regularities, we manipulated IR decay characteristics in simulated reverberant audio. Listeners could discriminate sound sources and environments from these signals, but their abilities degraded when reverberation characteristics deviated from those of real-world environments. Subjectively, atypical IRs were mistaken for sound sources. The results suggest the brain separates sound into contributions from the source and the environment, constrained by a prior on natural reverberation. This separation process may contribute to robust recognition while providing information about spaces around us.}
}
@article{Pratap2020MLSAL,
title={MLS: A Large-Scale Multilingual Dataset for Speech Research},
author={Vineel Pratap and Qiantong Xu and Anuroop Sriram and Gabriel Synnaeve and Ronan Collobert},
journal={ArXiv},
year={2020},
volume={abs/2012.03411}
}
@inproceedings{commonvoice:2020,
author = {Ardila, R. and Branson, M. and Davis, K. and Henretty, M. and Kohler, M. and Meyer, J. and Morais, R. and Saunders, L. and Tyers, F. M. and Weber, G.},
title = {Common Voice: A Massively-Multilingual Speech Corpus},
booktitle = {Proceedings of the 12th Conference on Language Resources and Evaluation (LREC 2020)},
pages = {4211--4215},
year = 2020
}
@misc{wang2024globe,
title={GLOBE: A High-quality English Corpus with Global Accents for Zero-shot Speaker Adaptive Text-to-Speech},
author={Wenbin Wang and Yang Song and Sanjay Jha},
year={2024},
eprint={2406.14875},
archivePrefix={arXiv},
}
@article{Instruction Speech 2024,
title={Instruction Speech},
author={JanAI},
year=2024,
month=June},
url={https://huggingface.co/datasets/jan-hq/instruction-speech}
}
@inproceedings{wang-etal-2021-voxpopuli,
title = "{V}ox{P}opuli: A Large-Scale Multilingual Speech Corpus for Representation Learning, Semi-Supervised Learning and Interpretation",
author = "Wang, Changhan and
Riviere, Morgane and
Lee, Ann and
Wu, Anne and
Talnikar, Chaitanya and
Haziza, Daniel and
Williamson, Mary and
Pino, Juan and
Dupoux, Emmanuel",
booktitle = "Proceedings of the 59th Annual Meeting of the Association for Computational Linguistics and the 11th International Joint Conference on Natural Language Processing (Volume 1: Long Papers)",
month = aug,
year = "2021",
address = "Online",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2021.acl-long.80",
pages = "993--1003",
}
@article{fleurs2022arxiv,
title = {FLEURS: Few-shot Learning Evaluation of Universal Representations of Speech},
author = {Conneau, Alexis and Ma, Min and Khanuja, Simran and Zhang, Yu and Axelrod, Vera and Dalmia, Siddharth and Riesa, Jason and Rivera, Clara and Bapta, Ankur},
journal={arXiv preprint arXiv:2205.12446},
url = {https://arxiv.org/abs/2205.12446},
year = {2022},
}
@misc{vansegbroeck2019dipcodinnerparty,
title={DiPCo -- Dinner Party Corpus},
author={Maarten Van Segbroeck and Ahmed Zaid and Ksenia Kutsenko and Cirenia Huerta and Tinh Nguyen and Xuewen Luo and Björn Hoffmeister and Jan Trmal and Maurizio Omologo and Roland Maas},
year={2019},
eprint={1909.13437},
archivePrefix={arXiv},
primaryClass={eess.AS},
url = {https://arxiv.org/abs/1909.13437},
}
@software{siebert2023npy_append_array,
author = {Michael Siebert and Joshua Adelman and Yoav Git},
title = {xor2k/npy-append-array: 0.9.16},
version = {0.9.16},
doi = {10.5281/zenodo.13820984},
url = {https://github.com/xor2k/npy-append-array/tree/0.9.16},
year = {2023},
month = {feb},
day = {24},
abstract = {Create Numpy .npy files by appending on the growth axis},
license = {MIT},
orcid = {0000-0002-1369-6321},
type = {software},
}
benjamin-paine/hey-buddy
作者 benjamin-paine
创建时间: 2024-08-05 22:08:51+00:00
更新时间: 2024-12-18 14:08:17+00:00
在 Hugging Face 上查看