如何使用kaldi训练得到录制音频的mfcc数据


之前跑了几个kaldi的开源的测试例子,由于有很多参考,所以也就很好入门,但是我们总归是要使用kaldi来测试自己的语音数据的,于是就想着能不能使用kaldi来训练自己提供的数据wav文件,从而得到其mfcc特征值呢?这篇博客就是一次探索,先是实现语音文件的录制,然后再实现其特征提取。

1.使用python录制语音数据

1.1 安装pyaudio

pip install pyaudio

因为我的已经安装了,所以就提示这样了:
在这里插入图片描述

1.2 录音程序

在该程序中,有以下几个动态参数可供调整:

  1. 调整录制语音数据的时间长短,此处默认我设置为5s;
  2. 设置傅里叶变换点数,默认为1024点;
  3. 设置采样率,默认为16K,当然也可以根据需要设置为8K、44100以及48000;
  4. 设置文件的保存名称及路径。
# @Time : 2020/2/20 14:45 
# @Author : kingback
# @File : python_talker.py 
# @Software: PyCharm
import pyaudio
import logging
import wave
logging.basicConfig(level=logging.DEBUG)

#定义录音函数
def recording():
    CHUNK = 1024
    #点数
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 16000
    #采样率fs
    RECORD_SECONDS = 5
    #采集时间长度
    WAVE_OUTPUT_FILENAME = "test1.wav"
    #文件命名
    p = pyaudio.PyAudio()
    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)
    logging.info('录音开始(时长5s),请讲话:')
    frames = []
    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)

    logging.info('录音结束,程序正在退出...')
    stream.stop_stream()
    stream.close()
    p.terminate()
    #将音频文件真正的写入.wav文件
    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()
    
#调用录音函数
recording()

我使用该函数,分别将"你好",“武汉加油”,“中国加油”,录制为.wav文件,且将其分别命名为test1.wav、test2.wav、test3.wav
此处仅展示一个文件的录制:
在这里插入图片描述

2.使用kaldi训练语音数据

将前边录制得到的语音数据test1.wav、test2.wav、test3.wav,复制到kaldi的egs,并新建一个test文件夹,用于训练自己的样本数据。

2.1 文件复制及建立

想要直接训练我们自己的数据,当然我们需要借助kaldi已经封装好的包,我们可以按照如下步骤建立文件夹:

Step 1. 我们进入egs/thchs30文件夹下,将其s5文件夹复制并拷贝至我们的egs/test文件夹下,确保你的s5文件夹有conf local step utils文件夹
Step 2. 然后把我们的数据保存到egs/test/s5/test文件夹下,此时test文件夹下存在test1.wav、test2.wav、test3.wav。
Step 3. 在s5文件夹下新建个data文件夹,data文件夹新建个test文件夹,这个test文件夹里需要三个文件:wav.scp、utt2spk 、spk2utt

其中wav.scp文件内容设置如下:

 test1 test/test1.wav
 test2 test/test2.wav
 test3 test/test3.wav

utt2spk文件内容设置如下:

 test1 global
 test2 global
 test3 global

spk2utt文件内容设置如下:

 global test1 test2 test3

Step 4. 创建文件run1.sh
在s5文件夹下执行如下文件创建run1.sh,并编辑其内容

touch run1.sh
vi run1.sh

将其中内容设置如下即可:

 #!/bin/bash
train_cmd="utils/run.pl"
decode_cmd="utils/run.pl"

# Feature extraction
for x in test ; do
 steps/make_mfcc.sh --nj 2 data/$x exp/make_mfcc/$x mfcc
done

在这里插入图片描述

Step 5. 执行run1.sh

chmod 777 run1.sh
#修改文件执行权限
./run1.sh

执行结果如下所示:
在这里插入图片描述
显示这样就说明.wav文件成功获取mfcc数据,并存入s5文件夹下的mfcc文件夹内。
生成成功之后,我们可以看一下此时的s5文件路径下包含以下文件:
在这里插入图片描述

3.mfcc数据解读

我们进入刚刚生成的mfcc文件夹,查看其内文件:
在这里插入图片描述
我们可以看到其内生成了.ark文件和.scp文件,但是我们无法看到其内训练得出的mfcc数据,我之前的博客中有过介绍,对于.ark文件,我们可以使用如下命令解码至新的txt.ark文件:

/home/king/kaldi-test/src/featbin/copy-feats ark:raw_mfcc_test.1.ark ark,t:txt1.ark
#其中前边的 路径可以根据自己的文件路径自行修改为自己kaldi所在路径
#这里的对应文件也需要具体情况而更改。

如下所示:
在这里插入图片描述
上图即表示文件解码成功,并分别生成了解码后的新文件txt1.ark和txt2.ark文件,接下来使用cat命令查看其内数据:
在这里插入图片描述在分别查看了txt1.ark和txt2ark文件内的内容后发现,其内存储的是test1.wav、test2.wav、test3.wav文件的mfcc数据,且每一个.wav语音文件都对应一个498*13的矩阵,也就是说每一个语音文件都被分成了498帧。以下我仅列出第一个语音文件的部分mfcc特征值:

test1  [
  30.44016 -31.4298 -6.260107 -6.011955 -8.00444 -7.065151 1.920065 5.144895 6.186597 -7.191596 -2.794114 -4.910667 -2.422569 
  29.42849 -33.16988 -4.229344 -6.521392 1.159485 -3.974985 -5.769829 -1.018203 2.786052 4.171975 5.907083 2.159832 2.405282 
  28.92266 -36.21503 -13.62797 -18.04583 -9.414276 -10.67035 -13.57087 -5.664696 3.919567 0.1199163 2.768946 -9.609997 -18.02723 
  29.93433 -32.29984 -9.380675 -9.578018 -5.88969 -6.550123 -5.769829 -7.689703 -8.019772 0.4817072 0.914593 -2.06467 4.922556 
  28.92266 -32.29984 -4.857034 -7.693099 -7.299522 -8.095207 -3.642273 -6.677198 6.186597 -5.205961 -2.936756 -6.807999 -8.497049 
  28.41683 -36.21503 -8.773919 -5.910067 -10.11919 -16.85068 -9.315755 -10.47409 0.9472036 3.665468 2.98291 -7.464767 -8.497049 
  28.92266 -31.4298 -8.773919 -14.58349 -6.594604 -5.005041 3.148366 4.272104 1.879241 4.099617 1.913091 -1.480875 -0.4302626 
  28.92266 -37.52009 -13.62797 -11.61577 -3.774937 -14.27554 -13.21627 -8.44908 -0.1468101 -0.1695165 -7.496267 1.875942 -3.231944 
  29.42849 -30.55976 -6.813951 -10.69878 -4.479855 -6.550123 -3.996864 -4.621746 -1.104072 -2.889387 -3.913794 -0.7511325 -1.862233 
  ......
  ......
  59.27252 -12.28889 -9.380675 -9.578018 7.584411 10.84045 10.31671 4.578789 6.640003 10.7249 4.052729 3.579283 2.764893 
  60.03772 -9.678764 -7.712094 -5.451573 7.059104 10.43035 -0.8055305 -9.461584 0.878828 9.446206 12.2964 -9.967535 -11.17741 
  60.43855 -9.101912 -8.015472 -11.46294 8.576657 11.4146 -5.769829 -8.702206 -1.377575 8.513467 13.60441 2.443722 -6.407183 
  60.88654 -8.219669 -3.749345 -7.693099 9.160332 12.15279 -0.4509373 -14.01785 -10.79376 13.28229 3.910087 1.875942 2.405282 
  59.27252 -11.41885 -4.155498 -5.859123 6.125225 16.73914 5.749472 -5.917821 0.1266932 5.98093 0.9859142 -9.252459 -6.220404 
  60.17919 -7.507088 -3.490885 -8.813862 10.09074 10.10226 0.2582474 -4.161719 3.692864 18.39708 10.33439 -1.991695 0.4274244 
  61.12232 -6.455182 -2.530888 -7.794986 4.374202 7.969719 7.628049 0.5918908 -1.240824 10.7249 1.342521 3.011503 9.237883 ]

4.总结

此篇博客的工作主要完成了对于自己语音数据的mfcc数据的提取,后续还可以将这些提取出来的mfcc数据与之前自己编辑的matlab代码进行比较,比较一下其差别。其实此篇博客得到的mfcc数据,也主要是对自己设计的算法进行一下验证。前边的道路还有很长,对于kaldi的了解也只是刚刚展开,还需要不断的学习,不断地迁移。

发布了44 篇原创文章 · 获赞 37 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_38468077/article/details/104444915