TensorFlow入门教程(20)语音识别固化模型和应用

#
#作者:韦访
#博客:https://blog.csdn.net/rookie_wei
#微信:1007895847
#添加微信的备注一下是CSDN的
#欢迎大家一起学习
#

1、概述

上三讲,我们将语音识别的模型训练出来了,模型训练完以后总得拿来用啊,所以,这一讲,我们就来固化模型,并应用。

环境配置:

操作系统:Win10 64位

显卡:GTX 1080ti

Python:Python3.7

TensorFlow:1.15.0

2、固化模型

固化模型很简单,我们只要将cpkt格式的模型转成pb格式的即可。

参考博客:

https://blog.csdn.net/rookie_wei/article/details/90546290

 

我这里就直接给出代码,

def main(argv=None):
 
    #看指定路径有没有我们要用的ckpt模型,没有就退出
    save_path = 'model'
    save_file = os.path.join(save_path, 'birnn_speech_recognition.cpkt-170.meta')
    if os.path.exists(save_file) is False:
        print('Not found ckpt file!')
        exit()
    
    #我们要保存的pb模型的文件名
    savePbFile = os.path.join(save_path, 'birnn_speech_recognition.pb')
    
    with tf.Session() as sess:
        # 加载图
        saver = tf.train.import_meta_graph(save_file)
    
        # 使用最后一次保存的
        saver.restore(sess, tf.train.latest_checkpoint(save_path))
    
        # 我们要固化哪些tensor
        output_graph_def = graph_util.convert_variables_to_constants(
            sess=sess,
            input_graph_def= sess.graph_def,
            output_node_names=['input', 'seq_length', 'keep_dropout', 'pred']
        )
    
        # 保存
        with tf.gfile.GFile(savePbFile, 'wb') as fd:
            fd.write(output_graph_def.SerializeToString())

执行上述代码以后,如果成功的话,会在model文件夹下生成birnn_speech_recognition.pb文件。

这样,我们固化的工作就做好了。

3、应用

接下来就要使用固化后的模型了,因为我们上一讲中将所有字符都存到characters.txt文件中了,所有我们就不再需要几个G的数据库了,只需要将characters.txt文件中的字符导入到列表中即可,代码如下,

words, _ = load_words_table_()

接着就导入pb模型,从模型中找到我们上面固化的那几个tensor,

# 打开pb模型文件
with gfile.FastGFile(save_pb_file, 'rb') as fd:
	# 导入图
	graph_def = tf.GraphDef()
	graph_def.ParseFromString(fd.read())
	sess.graph.as_default()
	tf.import_graph_def(graph_def, name='')

	# 根据名字获取对应的tensorflow
	input = sess.graph.get_tensor_by_name('input:0')
	seq_length = sess.graph.get_tensor_by_name('seq_length:0')
	dropout = sess.graph.get_tensor_by_name('keep_dropout:0')
	pred = sess.graph.get_tensor_by_name('pred:0')

然后,使用CTC decoder,

# 使用CTC decoder
decoder, _ = ctc_ops.ctc_beam_search_decoder(pred, seq_length, merge_repeated=False)

接着将稀疏矩阵转为稠密矩阵,

# 将稀疏矩阵转为稠密矩阵
dense_decoder = tf.sparse_tensor_to_dense(decoder[0], default_value=0)

获取要识别的语音文件的mfcc特征,

#获取要识别的语音文件的mfcc特征
source, source_lengths = get_mfcc(argv[1])

万事准备好了,开始计算吧,

#开始计算          
dense_decoded = sess.run(dense_decoder, feed_dict={input: source, seq_length: source_lengths, dropout: 1.0})

最后,输出识别结果,

# 输出识别结果   
dense_decoded = np.asarray(dense_decoded, dtype=np.int32)                     
if (len(dense_decoded) > 0):
    decoded_str = dense_to_text(dense_decoded[0], words)
    print('Decoded:  {}'.format(decoded_str))

执行以下命令运行上面的代码,对A11_100.wav文件进行语音识别,

python test.py A11_100.wav

运行结果,

我们打开数据集中的data/A11_100.wav.trn文件看看我们识别结果对不对,

完全一致,效果不错。

如果你们想自己录音测试的话,音频数据一定要是单通道、采样率16k、格式S16_LE。

说白了就是你录音的音频文件格式要跟数据集中完全一致,而且因为我们训练的时候没有加入噪声,所以,你录的音频最好也不要有噪声。大家最好能将上一讲的代码稍微修改一下,在训练的时候加入一下随机噪声。

4、完整代码

完整代码链接如下,

https://mianbaoduo.com/o/bread/ZZyXkps=

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值