Open xingchensong opened 11 months ago
目前该项目在很早期的筹备阶段,欢迎大家提需求、意见,也欢迎大家参与和贡献。
还缺个vad 和 对齐 之类的工具
vad 可以用东哥推荐的 或者@robin1001
https://github.com/wenet-e2e/wenet/issues/2069 里边提到的vad 打算用什么方法
对齐可以用torchaudio最新的 align
0 mos 计算 snr
1 vad
2 align and segment
还缺个vad 和 对齐 之类的工具
vad 可以用东哥推荐的 或者@robin1001 #2069 里边提到的vad 打算用什么方法 对齐可以用torchaudio最新的 align
稍后不齐链接
wenet cli 中也支持对齐了,是基于 CTC 的,并且会输出每个字的对齐置信度。VAD 可以用东哥推荐的或者自己做一个基于 CTC 的。
看来也是基于 CTC 的。
这个代码 和 ctc segmentation基本一个原理 不过实现上 meta开了个gpu版的
数据层面我们可以重点向国内的方言、少数民族语言、小语种做倾斜。
some idea:
async save checkpoint
ema
PRNGKey (reproduce)
bfloat16
efficient subsampling : https://browse.arxiv.org/pdf/2309.12963.pdf
dataset interator checkpoint
audio->cmvn/other mean/std ->augment->specaugment -> model forward....
model forward argument in dict or support *args, **kwargs
tokenizer like gpt2 tokenizer bbpe etc
load adapter
@robin1001 @xingchensong @whiteshirt0429 https://github.com/openai/whisper/discussions/1762 whisper v3 开源了 是否可以考虑 支持这个的推理, 他看着有些粤语的方言 可以用用
@robin1001 @xingchensong @whiteshirt0429 openai/whisper#1762 whisper v3 开源了 是否可以考虑 支持这个的推理, 他看着有些粤语的方言 可以用用
v3结构上和v2一样,所以一支百支 :)
如何保证数据不包含低质量的tts数据,以及考虑高质量的tts数据来进行更好的覆盖,这两个事情都比较重要,现在网络上低质量tts数据太多了
这个whisperX集成了vad、force align、speaker diarization、timestamp。对制作数据应该比较有用
如何保证数据不包含低质量的tts数据,以及考虑高质量的tts数据来进行更好的覆盖,这两个事情都比较重要,现在网络上低质量tts数据太多了
可以用声纹的方式, 提前找些常用角色(从原视频上着)
如何保证数据不包含低质量的tts数据,以及考虑高质量的tts数据来进行更好的覆盖,这两个事情都比较重要,现在网络上低质量tts数据太多了
可以用声纹的方式, 提前找些常用角色(从原视频上着)
或者直接从各大厂的tts api合成一些?微软,火山,魔音工坊,合成的语音和真实语音来训个二分类模型?
可以试试,需要考虑下 up主修音:比如加音乐这种,
IO这块 https://github.com/wenet-e2e/wenet/issues/2107 基于tf data的io虽然性能很好, 但是对于使用者比较重(难), 而且大模型领域 用tfdata的基本是google等tensorflw/jax项目 huggingface dataset 值得试一试, tf的一些特性 比如 map filter shuffle 都支持,而且很多fintune库也用到了 之后会 尝试用下 写一版 看性能怎么样
ref:
IO这块 #2107 基于tf data的io虽然性能很好, 但是对于使用者比较重(难), 而且大模型领域 用tfdata的基本是google等tensorflw/jax项目 huggingface dataset 值得试一试, tf的一些特性 比如 map filter shuffle 都支持,而且很多fintune库也用到了 之后会 尝试用下 写一版 看性能怎么样
ref:
IO这块不知道streaming这个可不可以参考 https://github.com/mosaicml/streaming
如何保证数据不包含低质量的tts数据,以及考虑高质量的tts数据来进行更好的覆盖,这两个事情都比较重要,现在网络上低质量tts数据太多了
可以用声纹的方式, 提前找些常用角色(从原视频上着)
或者直接从各大厂的tts api合成一些?微软,火山,魔音工坊,合成的语音和真实语音来训个二分类模型?
DNSMos 可以快速的卡阈值的方法筛选一些数据出来,感觉还行
现在有没有比较好的语音数据处理的开源库?对于一些有伴奏的博客数据,用 UVR5 或字节 api 做人声分离也可以用来做TTS
希望可以尽可能收集高质量video数据 多模态流式模型更需要 另外了解到Discretized speech input效果还挺好的,省磁盘空间和加速训练,也许可以在data pipeline这里加一下这个feature
现在有没有比较好的语音数据处理的开源库?对于一些有伴奏的博客数据,用 UVR5 或字节 api 做人声分离也可以用来做TTS
有一些零散的,但是没看到搞成一套完整pipeline的,这也是想做wedata的初衷
数据层面我们可以重点向国内的方言、少数民族语言、小语种做倾斜。 方言部分,有个不成熟的想法,可以先基于这个网站的数据训练一个语种预测模型,再基于语种预测模型去筛选相关语种的方言数据,可行性待验证 https://zhongguoyuyan.cn/index
如何保证数据不包含低质量的tts数据,以及考虑高质量的tts数据来进行更好的覆盖,这两个事情都比较重要,现在网络上低质量tts数据太多了
我们之前尝试过DeepFakeDetection检测合成的数据,效果还挺好的,TTS的数据这个可以检测到。
根据社区反馈,也要考虑带噪训练
根据社区反馈,也要考虑带噪训练
加噪训练属于强需求了,基本线上场景都要搞的,目前wenet的dataset/processor.py好像还不支持,我看wespeaker已经支持了,完全可以平替过来。
另外我看wespeaker里加的噪声还是musan,musan里面有个speech分类,其实里面并不是噪声,而是人声,这个可能干扰比较严重,musan的music分类里面有一些是带人声的音乐片段,个人认为也可能会对asr造成影响
相比之下,我发现 wham_noise 这个noise set好像要优秀很多,数量上也不错,仅供参考。当然开发者也可以根据自己的噪声数据来做增强。
根据社区反馈,也要考虑带噪训练
加噪训练属于强需求了,基本线上场景都要搞的,目前wenet的dataset/processor.py好像还不支持,我看wespeaker已经支持了,完全可以平替过来。
另外我看wespeaker里加的噪声还是musan,musan里面有个speech分类,其实里面并不是噪声,而是人声,这个可能干扰比较严重,musan的music分类里面有一些是带人声的音乐片段,个人认为也可能会对asr造成影响
相比之下,我发现 wham_noise 这个noise set好像要优秀很多,数量上也不错,仅供参考。当然开发者也可以根据自己的噪声数据来做增强。
你有兴趣贡献个pr吗(把wespeaker的加噪挪过来)
你有兴趣贡献个pr吗(把wespeaker的加噪挪过来)
好的,我还没pr过,我学习一下怎么弄。。
你有兴趣贡献个pr吗(把wespeaker的加噪挪过来)
好的,我还没pr过,我学习一下怎么弄。。
wespeaker看了下是两种,混响和背噪,我这边试了短噪头尾padding也挺有效的,训练时候给个噪声token
你有兴趣贡献个pr吗(把wespeaker的加噪挪过来)
好的,我还没pr过,我学习一下怎么弄。。
wespeaker看了下是两种,混响和背噪,我这边试了短噪头尾padding也挺有效的,训练时候给个噪声token
是的,两个都有
请问目前针对语音大模型的技术方案有确定吗?是自监督+SFT还是类似whisper直接做半监督的训练。针对方案这一块各位大佬有什么看法吗?
目前我做了一个数据自动切分、转写和筛选的工具 https://github.com/duj12/ASR-2Pass/blob/master/run_seg_asr_filter.sh (暂时支持中文和英文)大佬们可以提提意见。
输入: 只需要提供原始长音频/视频路径, 和最终处理后数据的保存路径。 输出: 处理好的短音频,和对应的文本等信息(kaldi-format)
流程: -1. 进行文件格式转换。(一般而言不需要额外显式转换格式,因为whisper本身就用了ffmpeg读取输入)
关于数据格式: 支持一切ffmpeg支持的音视频格式。 最终默认导出成24k的16bit单通道wav文件。
关于音频切分: 之前做数据都是单独用VAD切分,后来试了用Paraformer时间戳模型+标点模型(在语义分割点切分),发现效果都不是很好:VAD切分位置不是很合理,时间戳+标点模型因为时间戳不准,切分得到的音频和文本对不上。 后来发现Whisper的片段时间戳非常准确,且片段分割点大多都在词边界上,索性直接把whisper的时间戳用来做切分参照。
关于转写: 一遍长音频用Whisper,目前还无法batch推理,取而代之用了多GPU多线程。 二遍对短音频用Parafomer,多GPU,batch推理,注意要用比较早期的modelscope和funasr版本。
关于数据筛选: 之前也试过添加信噪比估计进行筛选。后来发现信噪比计算非常耗时(且不准确),而且音频质量完全可以由识别准确率去反映。 这套流程的核心是:只要Whisper和Paraformer模型识别结果一致(CER<=5%),那么我们就认为这条短音频是可用的,这条数据就可以留下来。
关于数据的使用 最终得到的数据是按照长音频名称(多级目录用_连接)分为多个文件夹,每个文件夹下是该条长音频切分得到的短音频。 筛选出来的数据可以直接拿来做弱标注的预训练。或者经过人工标注之后拿来做其他事情。可以支持的任务包括ASR,TTS,说话人识别(如果长音频说话人信息不确定,还需聚类得到说话人标签)等。
关于数据筛选,可以考虑追加置信度这个衡量指标,一般置信度可以用ref里每个字的prob加权平均来表示,这个置信度可以和cer指标形成double check
关于数据筛选,可以考虑追加置信度这个衡量指标,一般置信度可以用ref里每个字的prob加权平均来表示,这个置信度可以和cer指标形成double check
嗯,现在是输出了每句解码的分数的,但这个值目前还没用上。还有些细节也还需要打磨。
DNSMOS 可以用来筛选掉一些音质比较差的音频 https://github.com/microsoft/DNS-Challenge/tree/master/DNSMOS
python dnsmos_local.py -t C:\temp\SampleClips -o sample.csv 得到的 sample.csv 是一个评分表,oval raw 低于 1.5 的基本都比较差
VAD切分位置不是很合理 @duj12 为什么说 vad 切分位置不合理?我一般按静音超过 300ms 来切,不过有些场景(比如情感聊天,停顿时间是比较久)
VAD切分位置不是很合理 @duj12 为什么说 vad 切分位置不合理?我一般按静音超过 300ms 来切,不过有些场景(比如情感聊天,停顿时间是比较久)
相对而言的吧,比较简单的数据(静音段比较明确,噪声比较少),VAD切分足够了。很多网络上爬下来的数据,单纯按照VAD静音位置去切分,有时候会把某些字、词切分开;有噪声的情况下VAD可能会出现切不开的问题(最大时长时才切分往往也会把字词等切分开)。 然后本身我这里是需要whisper转写的,索性就把whisper的时间戳也用上了,我实际使用下来,感觉结合whisper的时间戳得到的切分片段会更好一些。
还缺个vad 和 对齐 之类的工具 vad 可以用东哥推荐的 或者@robin1001 #2069 里边提到的vad 打算用什么方法 对齐可以用torchaudio最新的 align 稍后不齐链接
wenet cli 中也支持对齐了,是基于 CTC 的,并且会输出每个字的对齐置信度。VAD 可以用东哥推荐的或者自己做一个基于 CTC 的。
wenet cli 对齐输出每个字的对齐置信度,有具体的使用说明吗
如何保证数据不包含低质量的tts数据,以及考虑高质量的tts数据来进行更好的覆盖,这两个事情都比较重要,现在网络上低质量tts数据太多了
我们之前尝试过DeepFakeDetection检测合成的数据,效果还挺好的,TTS的数据这个可以检测到。
@Moonmore 你好,请问一下,这个怎么做的,有没有预训练模型?
目前我做了一个数据自动切分、转写和筛选的工具 https://github.com/duj12/ASR-2Pass/blob/master/run_seg_asr_filter.sh (暂时支持中文和英文)大佬们可以提提意见。
输入: 只需要提供原始长音频/视频路径, 和最终处理后数据的保存路径。 输出: 处理好的短音频,和对应的文本等信息(kaldi-format)
流程: -1. 进行文件格式转换。(一般而言不需要额外显式转换格式,因为whisper本身就用了ffmpeg读取输入) 0. 准备数据,去掉路径中的空格。
- 使用whisper-large-v3生成时间戳和一遍转写文本
- 根据whisper时间戳(每5个whisper片段保存一个segment)切分音频,得到每个segment的音频和对应文本。
- 整理kaldi格式数据,统计时长,只保留[0.5, 40]秒的音频。因为转写过程发现一般正常的whisper转写结果一个小片段大约2s, 有些转写错的结果片段时长会比较长。同时这些超长的segment也会影响后面paraformer的转写。
- 进行paraformer转写,对whisper转写结果正则作为label, 计算paraformer转写CER,取出CER<=5的数据
- 将4得到的音频,以及kaldi格式数据拷贝到目标文件夹。
关于数据格式: 支持一切ffmpeg支持的音视频格式。 最终默认导出成24k的16bit单通道wav文件。
关于音频切分: 之前做数据都是单独用VAD切分,后来试了用Paraformer时间戳模型+标点模型(在语义分割点切分),发现效果都不是很好:VAD切分位置不是很合理,时间戳+标点模型因为时间戳不准,切分得到的音频和文本对不上。 后来发现Whisper的片段时间戳非常准确,且片段分割点大多都在词边界上,索性直接把whisper的时间戳用来做切分参照。
关于转写: 一遍长音频用Whisper,目前还无法batch推理,取而代之用了多GPU多线程。 二遍对短音频用Parafomer,多GPU,batch推理,注意要用比较早期的modelscope和funasr版本。
关于数据筛选: 之前也试过添加信噪比估计进行筛选。后来发现信噪比计算非常耗时(且不准确),而且音频质量完全可以由识别准确率去反映。 这套流程的核心是:只要Whisper和Paraformer模型识别结果一致(CER<=5%),那么我们就认为这条短音频是可用的,这条数据就可以留下来。
关于数据的使用 最终得到的数据是按照长音频名称(多级目录用_连接)分为多个文件夹,每个文件夹下是该条长音频切分得到的短音频。 筛选出来的数据可以直接拿来做弱标注的预训练。或者经过人工标注之后拿来做其他事情。可以支持的任务包括ASR,TTS,说话人识别(如果长音频说话人信息不确定,还需聚类得到说话人标签)等。
对了师兄,可以考虑下过滤策略加一条这个,经过验证在wenetspeech上效果很好。
考虑到whisper用了大量视频字幕训练,删除错误肯定不会少,所以这个策略大概率会很有效。
也即删选策略变成:
如何保证数据不包含低质量的tts数据,以及考虑高质量的tts数据来进行更好的覆盖,这两个事情都比较重要,现在网络上低质量tts数据太多了
对于TTS数据质量,一方面可以考虑使用一些工具对低质量数据进行筛选,比如使用wada估计snr,另一方面,可以使用speech restoration的模型对质量不太好的数据进行修复,比如借助于这个工具https://github.com/resemble-ai/resemble-enhance/
如何保证数据不包含低质量的tts数据,以及考虑高质量的tts数据来进行更好的覆盖,这两个事情都比较重要,现在网络上低质量tts数据太多了
我们之前尝试过DeepFakeDetection检测合成的数据,效果还挺好的,TTS的数据这个可以检测到。
@Moonmore 你好,请问一下,这个怎么做的,有没有预训练模型?
hi,没有特别好用的模型。我这边是针对我们这边的合成模型额外训练的。具体的可以翻下deep fake 相关的比赛论文,模型结构比较简单的。
目前我做了一个数据自动切分、转写和筛选的工具 https://github.com/duj12/ASR-2Pass/blob/master/run_seg_asr_filter.sh (暂时支持中文和英文)大佬们可以提提意见。 输入: 只需要提供原始长音频/视频路径, 和最终处理后数据的保存路径。 输出: 处理好的短音频,和对应的文本等信息(kaldi-format) 流程: -1. 进行文件格式转换。(一般而言不需要额外显式转换格式,因为whisper本身就用了ffmpeg读取输入) 0. 准备数据,去掉路径中的空格。
- 使用whisper-large-v3生成时间戳和一遍转写文本
- 根据whisper时间戳(每5个whisper片段保存一个segment)切分音频,得到每个segment的音频和对应文本。
- 整理kaldi格式数据,统计时长,只保留[0.5, 40]秒的音频。因为转写过程发现一般正常的whisper转写结果一个小片段大约2s, 有些转写错的结果片段时长会比较长。同时这些超长的segment也会影响后面paraformer的转写。
- 进行paraformer转写,对whisper转写结果正则作为label, 计算paraformer转写CER,取出CER<=5的数据
- 将4得到的音频,以及kaldi格式数据拷贝到目标文件夹。
关于数据格式: 支持一切ffmpeg支持的音视频格式。 最终默认导出成24k的16bit单通道wav文件。 关于音频切分: 之前做数据都是单独用VAD切分,后来试了用Paraformer时间戳模型+标点模型(在语义分割点切分),发现效果都不是很好:VAD切分位置不是很合理,时间戳+标点模型因为时间戳不准,切分得到的音频和文本对不上。 后来发现Whisper的片段时间戳非常准确,且片段分割点大多都在词边界上,索性直接把whisper的时间戳用来做切分参照。 关于转写: 一遍长音频用Whisper,目前还无法batch推理,取而代之用了多GPU多线程。 二遍对短音频用Parafomer,多GPU,batch推理,注意要用比较早期的modelscope和funasr版本。 关于数据筛选: 之前也试过添加信噪比估计进行筛选。后来发现信噪比计算非常耗时(且不准确),而且音频质量完全可以由识别准确率去反映。 这套流程的核心是:只要Whisper和Paraformer模型识别结果一致(CER<=5%),那么我们就认为这条短音频是可用的,这条数据就可以留下来。 关于数据的使用 最终得到的数据是按照长音频名称(多级目录用_连接)分为多个文件夹,每个文件夹下是该条长音频切分得到的短音频。 筛选出来的数据可以直接拿来做弱标注的预训练。或者经过人工标注之后拿来做其他事情。可以支持的任务包括ASR,TTS,说话人识别(如果长音频说话人信息不确定,还需聚类得到说话人标签)等。
对了师兄,可以考虑下过滤策略加一条这个,经过验证在wenetspeech上效果很好。
- 修复由于抄本问题导致的口语数据删除错误过高的问题 WenetSpeech#54
- [examples] better results on wenetspeech using revised transcripts #2371
考虑到whisper用了大量视频字幕训练,删除错误肯定不会少,所以这个策略大概率会很有效。
也即删选策略变成:
- Whisper和Paraformer模型识别结果一致(CER<=5%)
- Whisper和Paraformer模型识别结果cer>5%但是,两者之间只存在删除错误,使用paraformer的识别结果当抄本
是不是也可以考虑使用比较大的语言模型做PPL的判断,可以做些前筛选之类的。 最好重点考虑下字幕的利用,有不少视频包含大量人工标注的字幕文件。
关于数据筛选,可以考虑追加置信度这个衡量指标,一般置信度可以用ref里每个字的prob加权平均来表示,这个置信度可以和cer指标形成double check
嗯,现在是输出了每句解码的分数的,但这个值目前还没用上。还有些细节也还需要打磨。
解码分数是whisper输出的吗,paraformer应该没有解码分数
有的 wenet里边实现了 可以参考下
VAD切分位置不是很合理 @duj12 为什么说 vad 切分位置不合理?我一般按静音超过 300ms 来切,不过有些场景(比如情感聊天,停顿时间是比较久)
相对而言的吧,比较简单的数据(静音段比较明确,噪声比较少),VAD切分足够了。很多网络上爬下来的数据,单纯按照VAD静音位置去切分,有时候会把某些字、词切分开;有噪声的情况下VAD可能会出现切不开的问题(最大时长时才切分往往也会把字词等切分开)。 然后本身我这里是需要whisper转写的,索性就把whisper的时间戳也用上了,我实际使用下来,感觉结合whisper的时间戳得到的切分片段会更好一些。
请问,whisper的时间戳可以指定最大的切分长度吗
VAD切分位置不是很合理 @duj12 为什么说 vad 切分位置不合理?我一般按静音超过 300ms 来切,不过有些场景(比如情感聊天,停顿时间是比较久)
相对而言的吧,比较简单的数据(静音段比较明确,噪声比较少),VAD切分足够了。很多网络上爬下来的数据,单纯按照VAD静音位置去切分,有时候会把某些字、词切分开;有噪声的情况下VAD可能会出现切不开的问题(最大时长时才切分往往也会把字词等切分开)。 然后本身我这里是需要whisper转写的,索性就把whisper的时间戳也用上了,我实际使用下来,感觉结合whisper的时间戳得到的切分片段会更好一些。
请问,whisper的时间戳可以指定最大的切分长度吗
应该不能指定,不过它解码最大长度是30s一个片段,所以一小段最长也就是30s. 我之前合并时间戳有问题可能会导致一个分段超过30s。现在指定累积片段长度超过10s就切分一次,得到的分段就比较合理了。
获取高质量的转写文本,可以通过Noise student training这种方式吗?而不是两方引擎通过wer来筛选
获取高质量的转写文本,可以通过Noise student training这种方式吗?而不是两方引擎通过wer来筛选
可以,但是nst太麻烦
请问一下,我只想识别某些字. 例如几个汉字,像大家,你好这样. 怎样获得很小的final.zip呢? 预训练的模型很好,但是对我来说太大了
宗旨
目标
Action
数据
训练
部署