3---kaldi 自己录音,做自己版本的yesNo

   日期:2020-08-30     浏览:155    评论:0    
核心提示:学习经历0---原始文档备份和环境准备1---原始脚本注释解析2---原始脚本训练和测试拆分3---自己录音,做自己版本的yesNo=========================================================3---自己录音,做自己版本的yesNo这个过程较为曲折,经过时间较长,主要经历了win10录音和词典设计,查找m4a转wav方法和脚本设计,识别测试失败乱投医(再次注释理解后面脚本),查看log文件并找到采样率改变方法,再次运行wer过

学习经历

0---原始文档备份和环境准备

1---原始脚本注释解析

2---原始脚本训练和测试拆分

3---自己录音,做自己版本的yesNo

=========================================================

3---自己录音,做自己版本的yesNo

这个过程较为曲折,经过时间较长,主要经历了win10录音和词典设计,查找m4a转wav方法和脚本设计,识别测试失败乱投医(再次注释理解后面脚本),查看log文件并找到采样率改变方法,再次运行wer过高,检查脚本发现错误,wer等于0等过程。这里只对最终正确的过程做总结。下面将只讲述整理过的正确内容

(1)录制音频。

我的电脑是win10系统,分别在用耳机和没有耳机的情况下进行了录制,发现区别不大,最终的音频没有用耳机录制,另外,录制是去掉了麦克风增强(应该影响不大),加入了噪声抑制。录制时文件名形如YYNNYYNN.m4a。没有像例程一样采用下划线主要时考虑文件名命名不方便。录制之后拷贝到虚拟机内。

(2)转换成和例程一致wav格式

百度下,决定使用ffmpeg进行格式转换工作。所以首先安装ffmpeg,安装完毕后查看例程声音文件格式。具体如下:

ffmpeg -i 0_0_0_0_1_1_1_1.wav

显示信息如下:

Guessed Channel Layout for Input Stream #0.0 : mono
Input #0, wav, from '0_0_0_0_1_1_1_1.wav':
  Duration: 00:00:06.35, bitrate: 128 kb/s
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 8000 Hz, mono, s16, 128 kb/s

所以最好将文件处理成8000hz,wav格式的文件。完成该功能的脚本如下(需要创建一个wav目录):

#!/bin/bash    
for FILE in *.m4a;  
	do  ffmpeg -i "$FILE" -ar 8000 "wav/${FILE%.*}.wav";  
done  

(3)kaldi的相关处理

(3.1)input目录

首先将kaldi里面yesno音频目录的文件全部清除,然后把自己录制的wav格式的文件复制到yesno音频目录。

然后需要修改字典和音素文件。

其中音素来源如下:

yesno目录内有一个README.txt文件,内部指出该例程网址

http://www.openslr.org/1

进入目录

找到如下内容

SLR14 BEEP Dictionary Text

Phonemic transcriptions of over 250,000 English words. (British English pronunciations)

 

下载该文件,找到yes  no的音素

如下:

YES Y EH S
NO N OW

input目录需要做修改,主要修改如下:

lexicon.txt

<SIL> SIL
YES Y EH S
NO N OW

lexicon_nosil.txt

YES Y EH S
NO N OW

phones.txt

SIL
Y
EH
S
N
OW

task.arpabo

此文件没有改动。

(3.2)由于默认音频文件名是形如0_0_0_0_1_1_1_1.wav的文件,我自己录制的文件名是形如YYNNYYNN.wav,所以还需要修改脚本create_yesno_txt.pl,具体如下

#!/usr/bin/env perl

$in_list = $ARGV[0];

open IL, $in_list;

while ($l = <IL>)
{
	chomp($l);
	$l =~ s/\.wav//;
	$trans = $l;
	$trans =~ s/Y/YES /g;
	$trans =~ s/N/NO /g;
	#$trans =~ s/\_/ /g;
	print "$l $trans\n";
}

至此,自己版本的yesno完成,结果如下:

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服