:loud_sound: AudioSeal: 主动本地化水印
AudioSeal的推理代码,一种用于语音本地化水印的方法,具有最先进的稳健性和检测器速度(训练代码即将推出)。 更多详情可以在论文中找到。
[arXiv
]
[🤗Hugging Face
]
[Colab笔记本
]
[网页
]
[博客
]
[新闻
]
更新:
- 2024-06-17:训练代码现已可用。查看说明!!!
- 2024-05-31:我们的论文被ICML'24接受 :)
- 2024-04-02:我们已将许可证更新为完整的MIT许可证(包括模型权重的许可证)!现在您也可以在商业应用中使用AudioSeal!
- 2024-02-29:AudioSeal 0.1.2发布,修复了更多重采样音频的错误并更新了笔记本
摘要
我们介绍了AudioSeal,一种用于语音本地化水印的方法,具有最先进的稳健性和检测器速度。它联合训练了一个在音频中嵌入水印的生成器,和一个在较长音频中检测水印片段的检测器,即使在存在编辑的情况下也能检测。 Audioseal在样本级别(1/16k秒分辨率)上实现了自然和合成语音的最先进检测性能,它对信号质量的改变有限,并且对多种音频编辑类型具有稳健性。 Audioseal设计了一个快速的单通道检测器,在速度上显著超越了现有模型——实现了高达两个数量级的更快检测,使其非常适合大规模和实时应用。
:mate: 安装
AudioSeal需要Python >=3.8,Pytorch >= 1.13.0,omegaconf,julius和numpy。从PyPI安装:
pip install audioseal
从源代码安装:克隆此仓库并以可编辑模式安装:
git clone https://github.com/facebookresearch/audioseal
cd audioseal
pip install -e .
:gear: 模型
你可以在Hugging Face Hub上找到所有的模型检查点。我们提供以下模型的检查点:
- AudioSeal生成器。 它接收音频信号(作为波形)作为输入,并输出与输入大小相同的水印,可以添加到输入中以进行水印处理。 可选地,它还可以接收16位的秘密消息作为输入,该消息将被编码在水印中。
- AudioSeal检测器。 它接收音频信号(作为波形)作为输入,并输出音频中每个样本(每1/16k秒)包含水印的概率。 可选地,它还可以输出水印中编码的秘密消息。
注意,消息是可选的,对检测输出没有影响。它可以用来识别模型版本,例如(最多有$2**16=65536$种可能的选择)。
注意:我们正在努力发布训练代码,供任何想要构建自己的水印器的人使用。敬请期待!
:abacus: 使用
Audioseal提供了一个简单的API来为音频样本添加水印和检测水印。使用示例:
from audioseal import AudioSeal
# 模型名称对应于audioseal/cards中找到的YAML卡片文件名
model = AudioSeal.load_generator("audioseal_wm_16bits")
# 另一种方法是直接从检查点加载
# model = Watermarker.from_pretrained(checkpoint_path, device = wav.device)
# 一个形状为(batch, channels, samples)的torch张量和一个采样率
# 重要的是要将音频处理为与模型预期相同的采样率
# 在我们的情况下,我们支持16khz音频
wav, sr = ..., 16000
watermark = model.get_watermark(wav, sr)
# 可选:你可以添加一个16位的消息嵌入到水印中
# msg = torch.randint(0, 2, (wav.shape(0), model.msg_processor.nbits), device=wav.device)
# watermark = model.get_watermark(wav, message = msg)
watermarked_audio = wav + watermark
detector = AudioSeal.load_detector("audioseal_detector_16bits")
# 在高级别检测消息。
result, message = detector.detect_watermark(watermarked_audio, sr)
print(result) # result是一个浮点数,表示音频被水印处理的概率
print(message) # message是一个16位的二进制向量
# 在低级别检测消息。
result, message = detector(watermarked_audio, sr)
# result是一个大小为batch x 2 x frames的张量,表示每个帧的水印处理的概率(正面和负面)
# 被水印处理的音频应该有result[:, 1, :] > 0.5
print(result[:, 1 , :])
# Message是一个大小为batch x 16的张量,表示每个位为1的概率。
# 如果检测器从音频中没有检测到水印,message将是一个随机张量
print(message)
训练你自己的水印模型
有关如何训练你自己的水印模型的详细信息,请参见这里。
想要贡献?
我们欢迎带有改进或建议的拉取请求。 如果你想标记一个问题或提出改进建议,但不知道如何实现,请创建一个GitHub问题。
故障排除
-
如果你遇到错误
ValueError: not enough values to unpack (expected 3, got 2)
,这是因为我们期望输入是一批音频张量。在你的输入中添加一个 虚拟的批次维度(例如wav.unsqueeze(0)
,参见入门示例笔记本)。 -
在Windows机器上,如果你遇到错误
KeyError raised while resolving interpolation: "Environment variable 'USER' not found"
:这是由于上传到模型中心的旧检查点 在Windows中不兼容。尝试通过删除C:\Users\<USER>\.cache\audioseal
中的文件来使缓存失效 并重新运行。 -
如果你使用torchaudio来处理你的音频并遇到错误
Couldn't find appropriate backend to handle uri ...
,这是由于较新版本的 torchaudio不能很好地处理默认后端。要么将你的torchaudio降级到2.1.0
或更早版本,要么安装soundfile
作为你的音频后端。
许可证
- 本仓库中的代码根据LICENSE文件中的MIT许可证发布。
维护者:
引用
如果你发现这个仓库有用,请考虑给一个星标 :star: 并请引用:
@article{sanroman2024proactive,
title={Proactive Detection of Voice Cloning with Localized Watermarking},
author={San Roman, Robin and Fernandez, Pierre and Elsahar, Hady and D´efossez, Alexandre and Furon, Teddy and Tran, Tuan},
journal={ICML},
year={2024}
}