如何用kaldi参加京东金融对话语音识别大赛

  • A+
所属分类:语音杂谈
摘要

=r"" #识别结果写入一个json文件中fout = open(output_file, ‘w’)… 完成打包提交, 支持zip格式,坐等出分 参考链接: 语音杂谈 gh_…

广告也精彩

    京东金融对话语音识别大赛如火如荼的举行,具体详情可以阅读原文了解。

    下面是北京猎户星空语音团队的同学使用kaldi来搭建的系统具体流程,分享给各位,希望对各位有用。有任何问题也可以欢迎留言或者群内讨论。

以下是我自己提交之后成功算分的一个版本 , 记录一下,以作参考: 

最终提交文件夹为decode_chain, 整体结构如下, 标红加粗的为文件夹:

[XXXXXX@gpu17 decode_chain]$

ivector_extractor

conf  

wav-copy

words.txt  

HCLG.fst  

final.mdl  

online2-wav-nnet3-latgen-faster  

infer.sh  

inference.py

 

[XXXXXX@gpu17  decode_chain]$ ls ivector_extractor

final.dubm  

final.ie  

final.mat  

global_cmvn.stats  

online_cmvn.conf  

splice_opts

 

[XXXXXX@gpu17  decode_chain]$ls conf/

splice.conf  

online.conf

online_cmvn.conf  

mfcc.conf  

ivector_extractor.conf

 

需要注意下的是,JD提供的为8khz的wav音频,我训练流程参照的是aishell,最开始训练只做了mfcc特征,后面训练nnet和chain模型输入的是更高维度的mfcc_hire,所以在测试的时候,mfcc.conf 设置如下:

[XXXXXX@gpu17 decode_chain]$cat conf/mfcc.conf

--use-energy=false   # only non-default option.

--sample-frequency=8000 #  Switchboard is sampled at 8kHz

--num-mel-bins=40     # similar to Google's setup.

--num-ceps=40     # there is no dimensionality reduction.

--low-freq=40    # low cutoff frequency for mel bins

--high-freq=-200 # high cutoff frequently, relative to Nyquist of 8000 (=3800)

 

工具及环境编译问题,

JD小伙伴解答, 解码环境 的cuda版本为 CUDA8.0 和 gcc版本为4.8.5,各位在编译online2-wav-nnet3-latgen-faster的时候请注意版本问题。

或者可以在编译kaldi的时候执行如下, 可不依赖 cuda版本。

[XXXXXX@gpu17 kaldi-master]$

make clean

 ./configure --static  --use-cuda=no

make depeng -j

make -j

 

解码的核心命令:

online2-wav-nnet3-latgen-faster --config=conf/online.conf --do-endpointing=false  --frames-per-chunk=20 --extra-left-context-initial=0 --online=true --frame-subsampling-factor=3 --min-active=200 --max-active=7000 --beam=15.0 --lattice-beam=6.0 --acoustic-scale=1.0  --word-symbol-table=words.txt final.mdl HCLG.fst "ark:spk2utt" "scp:wav.scp" ark:/dev/null

 

#####注释

--online=true 整体不变的情况下, 设置成false, 结果会差约0.001个点

Spk2utt 文件格式:

JDD_NUMBERS_TRAIN_100000  JDD_NUMBERS_TRAIN_100000

wav.scp 文件格式:

JDD_NUMBERS_TRAIN_100000  /data/XXX/JDD_NUMBERS_TRAIN_100000.wav

##### 注释 done

 

 

以下为Infer.sh的内容, 一定要给自己用到的工具加上chmod +x  bin文件"

#!/usr/bin/bash

source /export/data/jdder/speech/setenv.sh

export PATH=$PWD/utils/:$KALDI_ROOT/tools/openfst/bin:$PWD:$PATH

[ ! -f $KALDI_ROOT/tools/config/common_path.sh ] && echo >&2 "The standard file $KALDI_ROOT/tools/config/common_path.sh is not present -> Exit!" && exit 1

.  $KALDI_ROOT/tools/config/common_path.sh

export LD_LIBRARY_PATH=${KALDI_ROOT}/tools/openfst/lib:${LD_LIBRARY_PATH}

export LC_ALL=C

.  $KALDI_ROOT/tools/env.sh

set -e

cd  $3

chmod +x ./wav-copy

chmod +x ./online2-wav-nnet3-latgen-faster

python inference.py $1 $2 $3   

# $1为音频文件夹路径,$2为输出json文件名,$3为解压缩后路径。

 

Python脚本内容, 在JD提供的框架上面做了相应的修改, 适用于我自己的版本:

import sys

import json

import commands

import re

reload(sys)

sys.setdefaultencoding('UTF-8')

 

#读取shell脚本命令行参数

input_path=sys.argv[1]

output_file=sys.argv[2]

localdir=sys.argv[3]

 

### 这段存在的意义,本来是想调用JD环境下的kaldi来运行

wav_files=os.listdir(input_path)

envs=os.environ['PATH']

kaldipath=''

for path in envs.split(":"):

    match=re.match('(.+)tools/openfst/lib',path,re.I)

    if match:

        kaldipath=match.group(1)+'src/online2bin/'

    else:

        kaldipath='./'

 

wav_list = []

dictrec={}

 #获取测试wav文件列表

with open(localdir+r'wav.scp','w') as oscp:

    with open(localdir+r'spk2utt','w') as ospk:

        for file in wav_files:

            if file.endswith("wav"):

                wav_list.append(file)

                (wavnm,extens)=os.path.splitext(file)

                waventry=os.path.join(input_path,file)

                ospk.write(wavnm+' '+wavnm+'\n')

                oscp.write(wavnm+' '+waventry+'\n')

class FError(Exception):

    def __init__(self, error):

        self.error=error

 

#调用模型进行识别

runout=commands.getstatusoutput(kaldipath+r'online2-wav-nnet3-latgen-faster --config=conf/online.conf --do-endpointing=false  --frames-per-chunk=20 --extra-

left-context-initial=0 --online=false --frame-subsampling-factor=3 --min-active=200 --max-active=7000 --beam=15.0 --lattice-beam=6.0 --acoustic-scale=1.0  -

-word-symbol-table=words.txt final.mdl HCLG.fst "ark:spk2utt" "scp:wav.scp" ark:/dev/null')

if runout[0]==0:

    recln=runout[1].split("\n")

    for ln in recln:

        match=re.search("online2-wav-nnet3-latgen-faster",ln.rstrip('\r\t\n '),re.I)

        if not match:

            tmp=ln.rstrip('\r\t\n ').split(' ')

            rectxt="".join(tmp[1:])

           #result = u"一二三四五六七八九"

            if tmp[0] not in dictrec:

                dictrec[tmp[0]+".wav"]=rectxt.encode('utf-8')

else:

    raise FError(runout[1])

 

#检查一下,以防没测出来

for file in wav_list:

    if file not in dictrec:

        dictrec

=r""

 

#识别结果写入一个json文件中

fout = open(output_file, 'w')

fout.write(json.dumps(dictrec,ensure_ascii=False) + '\n')

fout.close()

#############################完成

打包提交, 支持zip格式,坐等出分

                                                                        

参考链接:

https://shiweipku.gitbooks.io/chinese-doc-of-kaldi/content/online_decoding.html

https://chrisearch.wordpress.com/2017/03/11/speech-recognition-using-kaldi-extending-and-using-the-aspire-model/

https://blog.csdn.net/chinatelecom08/article/details/81392535

https://www.jianshu.com/p/bf24d29bc71e

https://blog.csdn.net/it_king1/article/details/80109398

  • 微信
  • 扫一扫
  • weinxin
  • 微信公众号
  • 扫一扫
  • weinxin
广告也精彩
Y40 便携头戴式耳机
针织衫
韩版毛衣套装裙子
粉色毛呢大衣
广告也精彩

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: