项目作者: chenmingxiang110

项目描述 :
Chinese speech recognition
高级语言: Jupyter Notebook
项目地址: git://github.com/chenmingxiang110/Chinese-automatic-speech-recognition.git
创建时间: 2019-03-11T07:43:30Z
项目社区:https://github.com/chenmingxiang110/Chinese-automatic-speech-recognition

开源协议:MIT License

下载


中文语音识别

by

  1. _____ _ __ __ _ _
  2. / ____| | | \/ (_) (_)
  3. | | | |__ ___ _ __ | \ / |_ _ __ __ ___ ___ __ _ _ __ __ _
  4. | | | '_ \ / _ \ '_ \ | |\/| | | '_ \ / _` \ \/ / |/ _` | '_ \ / _` |
  5. | |____| | | | __/ | | |_ | | | | | | | | (_| |> <| | (_| | | | | (_| |
  6. \_____|_| |_|\___|_| |_( ) |_| |_|_|_| |_|\__, /_/\_\_|\__,_|_| |_|\__, |
  7. |/ __/ | __/ |
  8. |___/ |___/
  9. Email: chenmingxiang110@gmail.com

更新 2020.06.23

一些朋友提到,将拼音转换成文字时,国内使用谷歌拼音输入法不太方便。我这里根据 wyf19941128 的建议,新写了通过谷歌翻译将拼音转成汉字的方案(国内访问谷歌翻译无需科学上网),所需代码附在 ./alternative 文件夹下。以下是一个实现转换的例子:

  1. from Pinyin2SimplifiedChinese import *
  2. t = translator()
  3. print(t.translate("jin tian tian qi zhen bu cuo")) # return "今天天气真不错"

模型简介

模型输入是一段不长于10秒钟的语音,模型的输出是该语音所对应的拼音标签。本项目使用python 3.6为主要编程语言。

模型参考了Baidu Deep Speech 2:http://proceedings.mlr.press/v48/amodei16.pdf

使用了CNN+GRU+CTC_loss的结构

训练数据

所用的训练数据包含两个部分:

  1. aishell-1语音数据集

AISHELL-ASR0009-OS1录音时长178小时,约14万条语音数据,下载地址:http://www.aishelltech.com/kysjcp

  1. YouTube视频及对应字幕文件

从YouTube上获取MP4视频文件后转化成wav音频,同时使用对应的srt字幕文件作为target。总计时长大约120小时,有约20万条语音数据。数据量过大,且有版权归属问题,所以暂时不提供公开下载渠道。

使用方法

1. 训练模型

根据实际需求和硬件情况,可以选择需要的模型进行训练和调试。各个模型区别如下。如果在含GPU的机器上进行模型训练,直接运行 train901.py,train902.py,或者train903.py 即可。如果是在CPU上训练,则运行 train901_cpu.py,train902_cpu.py,或者train903_cpu.py。

模型名称 CNN层数 GRU层数 GRU维度 训练时间
901 2 3 256 约30小时
902 2 5 256 约55小时
903 2 5 1024 约130小时

这里的训练时间仅仅是一个大概的统计,训练使用一块Tesla V100完成。

model 903 链接: https://pan.baidu.com/s/1NcTN8gojuIBaIFT9FB3EJw 密码: 261u

model 902 链接: https://pan.baidu.com/s/1do7C6Egj6sJO7kn1yHPzBg 密码: 9o87

model 901 链接: https://pan.baidu.com/s/1utz-1Vv4IO9D-3awj3x1QQ 密码: pv08

下载后放在model文件夹下。

2. 识别音频

  1. 初始化模型并加载必要的工具
  1. import os
  2. import time
  3. import warnings
  4. warnings.filterwarnings("ignore", message="numpy.dtype size changed")
  5. warnings.filterwarnings("ignore", message="numpy.ufunc size changed")
  6. with warnings.catch_warnings():
  7. warnings.simplefilter("ignore")
  8. import tensorflow as tf
  9. import numpy as np
  10. from urllib.request import urlopen
  11. from lib.tools_batch import *
  12. from lib.tools_math import *
  13. from lib.tools_sparse import *
  14. from lib.tools_audio import *
  15. from lib.contrib.audio_featurizer import AudioFeaturizer
  16. from lib.contrib.audio import AudioSegment
  17. # 根据你所使用的模型修改这两行
  18. from model903 import *
  19. model_name = "v903"
  20. pyParser = pinyinParser("lib/pinyinDictNoTone.pickle")
  21. af = AudioFeaturizer()
  22. model = model(409)
  1. 初始化session并reload已经训练好的模型
  1. sess = tf.Session()
  2. saver = tf.train.Saver()
  3. saver.restore(sess, "models/"+model_name+"/"+model_name+"_0.ckpt")
  1. 读取音频并转化格式
  1. rate, data = read_wav("data/test.wav")
  2. data = mergeChannels(data)
  3. data = zero_padding_1d(data, 160240)
  4. a_seg = AudioSegment(data, rate)
  5. xs = np.transpose(np.array([af.featurize(a_seg)]), [0,2,1])
  1. 预测并转化成拼音
  1. pred = model.predict(sess, xs)[0]
  2. pred_dense = sparseTuples2dense(pred)
  3. detected_line = []
  4. for stuff in pred_dense[0]:
  5. if stuff!=-1:
  6. detected_line.append(stuff)
  7. pinyin = pyParser.decodeIndices(detected_line, useUnderline = False)
  1. 转化成汉字
  1. response = urlopen("https://www.google.com/inputtools/request?ime=pinyin&ie=utf-8&oe=utf-8&app=translate&num=10&text="+pinyin)
  2. html = response.read()
  3. result = (html.decode('utf8')).split(",")[2][2:-1]
  4. print(result)

这里转化成汉字这一步使用了谷歌拼音输入法。如果有需要也可以使用自定义的词表/Markov Chain/seq2seq模型。如果使用词表来定制输入法,可以参考我的另外一个project:https://github.com/chenmingxiang110/SimpleChinese2

效果和demo

ASR 应用场景十分多样。这里我做了一个自动添加字幕的demo,代码详见subtitle_demo.ipynb。一下为字幕添加效果。

  1. 视频一,视频地址:https://www.youtube.com/watch?v=t5cPgIGNosc

左侧为自动添加的字幕,右侧为YouTuber人工手动添加的字幕

Alt text

  1. 视频二,视频地址:https://www.youtube.com/watch?v=HLJJlQkY6ro

左侧为自动添加的字幕,右侧为YouTuber人工手动添加的字幕

Alt text

完整的字幕原文件和预测结果可以再data文件夹中找到。

  1. _____ _ _ __ __ ___ __ __ _ _ _
  2. |_ _| |_ __ _ _ _ | |__ \ \ / /__ _ _ | __|__ _ _ \ \ / /_ _| |_ __| |_ (_)_ _ __ _
  3. | | | ' \/ _` | ' \| / / \ V / _ \ || | | _/ _ \ '_| \ \/\/ / _` | _/ _| ' \| | ' \/ _` |
  4. |_| |_||_\__,_|_||_|_\_\ |_|\___/\_,_| |_|\___/_| \_/\_/\__,_|\__\__|_||_|_|_||_\__, |
  5. |___/
  6. _..
  7. .qd$$$$bp.
  8. .q$$$$$$$$$$m.
  9. .$$$$$$$$$$$$$$
  10. .q$$$$$$$$$$$$$$$$
  11. .$$$$$$$$$$$$P\$$$$;
  12. .q$$$$$$$$$P^"_.`;$$$$
  13. q$$$$$$$P;\ , /$$$$P
  14. .$$$P^::Y$/` _ .:.$$$/
  15. .P.:.. \ `._.-:.. \$P
  16. $':. __.. : :.. :'
  17. /:_..::. `. .:. .'|
  18. _::.. T:.. / :
  19. .::.. J:.. : :
  20. .::.. 7:.. F:.. : ;
  21. _.::.. |:.. J:.. `./
  22. _..:::.. /J:.. F:. :
  23. .::::.. .T \:.. J:. /
  24. /:::... .' `. \:.. F_o'
  25. .:::... .' \ \:.. J ;
  26. ::::... .-'`. _.`._\:.. \'
  27. ':::... .' `._7.-'_.- `\:. \
  28. \:::... _..-'__.._/_.--' ,:. b:. \._
  29. `::::..-"_.'-"_..--" :.. /):. `.\
  30. `-:/"-7.--"" _::.-'P::.. \}
  31. _....------"""""" _..--".-' \::.. `.
  32. (::.. _...----""" _.-' `---:.. `-.
  33. \::.. _.-"""" `""""---"" `::...___)
  34. `\:._.-"""