使用kaldi时处理数据的脚本

写给自己的总结(对大家没有帮助)

1. kaldi实验,获得exp下所有实验训练时迭代l的所有log文件帧准确率等,并且记录实验的名字等,成为所需的格式。

 

#!/bin/bash

exp=mfcc_exp_mono/exp
first=lstm_s12
first="d3cec1024r800tg0sp0_5_1lr0.001hf0.3"
for x in $exp/*${first}* ;  do
    if [ -d $x ] ;then
        echo dir: $x
        for decode in  $x/log/iter*.log ; do
            if [ -f $decode ] ;then
                echo file: $decode
                avgloss=$(cat $decode | grep "AvgLoss:" | tail -n 1 | awk '{ print $4; }')
                frame_acc=$(cat $decode | grep "FRAME_ACCURACY" | tail -n 1 | awk '{ print $3; }')
                echo "AvgLoss: "$avgloss
                echo "FRAME_ACCURACY: "$frame_acc
                echo
            fi
        done
        echo 
    fi
done

2.将上面处理过的文件,转成能够直接使用jqplot的格式(最后只需要复制过去就行)

起初代码想了很久,能处理多个文件,内容设计中文的支持,DIR的使用,文件的读写(有很多小技巧,当时是过年在家写的)。 后来改为只处理一个文件,简洁,同时临时定义了一个函数,大大简化了程序

 

# -*- coding:utf-8 -*-

#ARGV其实是可以接受命令行变量的,但是必须要这样 ruby -w xxx.rb ...  -w 可以不加
#__FILE__ 中文目录下,这个根本不行 #filename=File.expand_path(filename,__FILE__)
#filename="../experiments/*.txt"
#Dir[filename].each do |fname| 
#exepath.force_encoding("UTF-8")
filenames=["a.txt"]  #多个文件就放在数组里面
resultfile="my_result.txt"
rsfile_=File.open(resultfile,"w+")

cnt=10 #div id的起始

filenames.each do |fname|
	#puts file 文件名
	# 带有block后打开就不用关闭了
	rsfile_.puts "------"+fname

	File.open(fname.force_encoding("UTF-8"),"r") do |file|
		cont_dir=""
		cont_FRAME_ACCURACY=[[],[]]
		tr_cv=0
		
		#想了很久终于解决了我想解决的问题,就是连变量都可以共享 一般的def是不行的
		define_method :puts_to_file_code do
			if cont_FRAME_ACCURACY[0].length!=0
				rsfile_.puts "---"+cont_dir #把目录名输入
				#-----------专门针对jqplot的--------------#
				cnt+=1
				rsfile_.puts "
" rsfile_.puts "" rsfile_.puts end end while line=file.gets next if line.strip=="" #去除回车后 #puts line #puts line=~/dir/ if line=~/^dir:.*\/(.*)$/ puts_to_file_code cont_dir=$1 cont_FRAME_ACCURACY=[[],[]] elsif line=~/^file:.*initial\.log/ tr_cv=100 elsif line=~/^file:.*tr\./ tr_cv=0 elsif line=~/^file:.*cv\./ tr_cv=1 elsif line=~/^FRAME_ACCURACY:\s*(\d+\.?\d*)%$/ next if tr_cv>2 #puts $1 cont_FRAME_ACCURACY[tr_cv].push $1 end end puts_to_file_code end end rsfile_.close

3. 处理wer得到自己关注的内容

这里用到 文件读写,字符串分割,及接受程序传参等

 

argv=ARGV
fin,fout="in.txt","out.txt"
if argv.length==2
	fin,fout=argv[0],argv[1]
elsif argv.length==1
	fin=argv[0]
end
#p fin,fout
fpin,fpout=File.open(fin,"r"),File.open(fout,"w+");

while line=fpin.gets
	sz=line.split /\|/
	fpout.print sz[0],sz[-1]
	fpout.puts
end

fpin.close
fpout.close

 

你可能感兴趣的:(ruby)