kaldi 1d-CNN网络结构

本文详细介绍了一个基于26维fbank特征的卷积神经网络(CNN)的构建过程,包括卷积层、池化层等组件的参数配置及计算原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成nnet.proto

utils/nnet/make_cnn_proto.py

假设输入26维的fbank,feat_raw_dim=26,splice_num=8,delta_order=0:
num_filters1=128
num_filters2=256
pool_size=3
pool_step=3
pool_type=MAX
num_splice=8
patch_step1=1
patch_dim1=8
patch_dim2=4

可以得到输出:

<NnetProto>
<ConvolutionalComponent> <InputDim> 208 <OutputDim> 2432 <PatchDim> 8 <PatchStep> 1 <PatchStride> 26 <BiasMean> -1.000000 <BiasRange> 2.000000 <ParamStddev> 0.020000 <MaxNorm> 30.000000
<MaxPoolingComponent> <InputDim> 2432 <OutputDim> 768 <PoolSize> 3 <PoolStep> 3 <PoolStride> 128 
<Rescale> <InputDim> 768 <OutputDim> 768 <InitParam> 1.000000
<AddShift> <InputDim> 768 <OutputDim> 768 <InitParam> 0.000000
<Sigmoid> <InputDim> 768 <OutputDim> 768 
<ConvolutionalComponent> <InputDim> 768 <OutputDim> 768 <PatchDim> 4 <PatchStep> 1 <PatchStride> 6 <BiasMean> -2.000000 <BiasRange> 4.000000 <ParamStddev> 0.100000 <MaxNorm> 50.000000
<Rescale> <InputDim> 768 <OutputDim> 768 <InitParam> 1.000000
<AddShift> <InputDim> 768 <OutputDim> 768 <InitParam> 0.000000
<Sigmoid> <InputDim> 768 <OutputDim> 768 

conv1

  • patch_stride2
    patch_stride2=feat_raw_dim
  • 一个滤波器参数:
    filter_dim1=num_splice * patch_dim_=8*8=64
  • 所有滤波器参数:
    param1=num_filters1*filter_dim1=8192
  • cnn1输入为:
    input1=splice_numfeat_raw_dim=826=208
  • cnn1滤波器输出
    num_patch1 = 1 + (feat_raw_dim - o.patch_dim1) / o.patch_step1=19
    output1=num_filters1num_patch1=12819=2432

相当于输入是826的图片,使用88的fiter只在频率维度上面进行step为1的移动,1个filter可以得到191的输出,128个filter可以得到12819的输出

maxpooling

  • pool个数
    num_pool = 1 + (num_patch1 - o.pool_size) / o.pool_step=1+(19-3)/3=6
  • pool_stride,conv1的filter的个数
    pool_stride=o.num_filters1=128
  • output
    o.num_filters1num_pool=1286=768

conv1每个滤波器的输出为19,在19这个维度上面,每3个数取一个最大值,得到6个数
128个滤波器就可以得到128*6的矩阵

conv2

  • 输入为maxpooling的输出
    input2=128*6
  • step和conv1一致
    patch_step2 = o.patch_step1=1
  • stride和pooling的num_pool一致
    patch_stride2 = num_pool=6
  • splice为filter1的个数
    num_splice2=input2/patch_stride2=128
  • patch
    num_patch2 = 1 + (num_pool - patch_dim2) / patch_step2=1+(6-4)/1=3
  • 一个滤波器参数
    filter_dim2=num_splice2 * patch_dim2_=128*4
  • 其他跟conv1的计算方法一样

相当于输入是1286的图片,使用1284的filter进行step为1的移动,得到31的输出,256个filter可以得到2563的输出

解析

conv

nnet/nnet-convolutional-component.h

num_splice = input_dim_ / patch_stride_=208/26=8
num_patches = 1 + (patch_stride_ - patch_dim_) / patch_step_=1+(26-8)/1=19
filter_dim = num_splice * patch_dim_=8*8=64
num_filters = output_dim_ / num_patches=2432/19=128

max pooling

nnet-max-pooling-component.h

num_patches = input_dim_ / pool_stride_
num_pools = 1 + (num_patches - pool_size_) / pool_step_

后面的技术分享转移到微信公众号上面更新了,【欢迎扫码关注交流】

在这里插入图片描述

<think>我们正在讨论如何为KaldiSherpa-ONNX语音识别模型生成关键词文件(keyword.txt)。根据引用内容,Sherpa是一个基于下一代Kaldi和ONNXRuntime的开源项目,支持离线语音识别。关键词文件通常用于在语音识别中提升特定词汇的识别准确率。在Kaldi和Sherpa-ONNX中,关键词文件(keyword.txt)通常包含需要被识别的关键词列表,每行一个词。这个文件用于构建有限状态转换器(FST)来增强关键词的识别。步骤:1.创建一个文本文件,每行一个关键词。2.文件名通常为`keywords.txt`(注意:用户问题中写的是keyword.txt,但通常使用复数形式keywords.txt,不过具体名称取决于实际使用)。但是,仅仅提供关键词列表是不够的,我们还需要将其转换为模型可以使用的格式(通常是FST)。Sherpa-ONNX可能提供了工具来将关键词列表编译成所需的二进制格式。根据引用[2]中提到的sherpa-ncnn项目(虽然用户询问的是sherpa-onnx,但两者可能有相似之处),我们可能需要使用Sherpa提供的工具来生成关键词的FST。在Kaldi中,通常使用以下步骤生成关键词的FST:-创建一个词汇表文件(vocab),包含所有关键词。-使用fstmake命令生成FST。然而,在Sherpa-ONNX中,具体步骤可能有所不同。由于Sherpa-ONNX是较新的项目,我们需要参考其官方文档。根据Sherpa-ONNX的GitHub页面(https://github.com/k2-fsa/sherpa-onnx),我们可以找到相关工具。具体步骤(以Sherpa-ONNX为例):1.创建一个关键词列表文件,例如`keywords.txt`,内容如下(每行一个关键词):helloworldsherpa2.使用Sherpa-ONNX提供的工具`k2-fsa/onnx/bin/sherpa-onnx-keyword-spotter`(具体工具名称可能有所不同,请以实际为准)来生成关键词模型。但是,在Sherpa-ONNX中,关键词识别(KeywordSpotting)通常是在运行时加载关键词列表,而不是预先生成一个单独的文件。因此,我们可能需要直接提供关键词列表文件给识别程序。实际上,在Sherpa-ONNX的示例中,关键词识别是通过命令行参数直接指定关键词列表的。例如,在实时麦克风输入的示例中,我们可以这样运行:./bin/sherpa-onnx-keyword-spotter\--tokens=/path/to/tokens.txt\--encoder=/path/to/encoder.onnx\--decoder=/path/to/decoder.onnx\--joiner=/path/to/joiner.onnx\--keywords-file=keywords.txt\--num-threads=1其中,`--keywords-file`参数指定了关键词列表文件(每行一个词)。因此,生成关键词文件实际上就是创建一个文本文件,每行一个关键词。注意:关键词文件中的词必须在模型的词汇表中(即tokens.txt中)。如果关键词不在词汇表中,则无法识别。总结:1.创建一个文本文件,例如`keywords.txt`。2.每行写一个关键词。3.确保这些关键词在模型的词汇表(tokens.txt)中存在。4.在运行关键词识别程序时,通过`--keywords-file`参数指定这个文件。如果用户需要的是在构建语言模型时加入关键词(例如在解码图中加入关键词),那么可能需要更复杂的步骤(如构建一个包含关键词的FST)。但根据Sherpa-ONNX的示例,它支持直接通过关键词文件进行关键词识别,而无需重新编译整个模型。因此,对于Sherpa-ONNX,生成关键词文件非常简单:只需按格式创建文本文件即可。相关问题:1.如何确保关键词在模型的词汇表中?2.如果关键词不在词汇表中,有什么解决办法?3.如何测试关键词识别的效果?4.Sherpa-ONNX支持多少个关键词?5.关键词识别对识别准确率有什么影响?6.除了关键词文件,还需要其他配置吗?请注意:以上回答基于Sherpa-ONNX的一般使用方式,具体细节请参考其官方文档。</think>### 为 Kaldi Sherpa-ONNX 生成关键词文件 (keyword.txt) 在 Kaldi Sherpa-ONNX 中,`keyword.txt` 是用于**关键词唤醒**或**特定词识别**的配置文件,其生成步骤如下: #### 1. **创建关键词列表文件** 创建一个纯文本文件(如 `keywords.txt`),每行一个关键词: ``` 你好 打开灯光 停止 退出 ``` > ⚠️ 注意: > - 关键词需在语音模型的**词汇表范围内**(参考模型的 `tokens.txt`) > - 避免过长短语(建议 1-4 个词) > - 文件编码需为 **UTF-8 无 BOM** #### 2. **生成 keyword.txt 格式** Sherpa-ONNX 要求 `keyword.txt` 包含**关键词权重**(重要性系数),格式为: ``` 关键词1 权重值 关键词2 权重值 ``` 示例: ```txt 你好 1.5 打开灯光 2.0 停止 1.0 退出 1.0 ``` > 📌 权重说明: > - 默认权重 = 1.0 > - 更高权重(如 2.0)提升该词识别优先级 > - 权重范围建议 [0.5, 3.0] #### 3. **在 Sherpa-ONNX 中使用** 运行时通过参数加载关键词文件: ```bash ./sherpa-onnx \ --tokens=path/to/tokens.txt \ --encoder=path/to/encoder.onnx \ --decoder=path/to/decoder.onnx \ --joiner=path/to/joiner.onnx \ --keywords-file=path/to/keyword.txt \ # 加载关键词 --max-active-paths=4 \ # 并行解码路径数 ... ``` #### 4. **验证效果** - 测试命令(实时麦克风输入): ```bash ./sherpa-onnx-microphone \ --keywords-file=keyword.txt \ --keywords-threshold=0.25 \ # 触发阈值(需调整) ... ``` - 调整参数: - `--keywords-threshold`:降低阈值(如 0.1)提高敏感度 - `--keywords-score`:控制误触发率 #### 注意事项 1. **模型兼容性**:仅适用于支持**关键词唤醒**的 Sherpa-ONNX 模型(需确认模型训练方式)[^1] 2. **权重优化**:通过测试集调整权重,平衡召回率与误触发率 3. **实时性要求**:嵌入式设备需简化关键词数量(建议 ≤20 个词) 4. **非关键词处理**:通用语音识别仍需完整语言模型 > 💡 提示:Sherpa-ONNX 的**流式识别架构**特别适合关键词唤醒场景[^1],其 FST(有限状态转换器)会优先处理关键词路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值