文章目录
需求:记录会议的内容,将会议的语音(中文和日文)转为文字字幕并显示在电脑屏幕上。
1.实现效果
1.1日语效果
2.2中文效果
2.具体实现
讯飞语音中文实现很简单,登录讯飞开发者平台,创建应用,下载对应的demo就行了,照着文档弄,很简单。
所以我的重点都是日语语音听写(流式版)的实现。
需要提前说明的是讯飞小语种只有语音听写(流式版)支持,且需要提前开通。
1.捕捉麦克风语音输入并保存为.wav文件
通过pyaudio捕捉麦克风的语音输入
pip install pyaudio
pa = pyaudio.PyAudio()
stream = pa.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
start=False,
# input_device_index=2,
frames_per_buffer=CHUNK_SIZE)
保存为.wav文件
def record_to_file(path, data, sample_width):
"Records from the microphone and outputs the resulting data to 'path'"
# sample_width, data = record()
data = pack('<' + ('h' * len(data)), *data)
wf = wave.open(path, 'wb')
wf.setnchannels(1)
wf.setsampwidth(sample_width)
wf.setframerate(RATE)
wf.writeframes(data)
wf.close()
record_to_file("recording.wav", raw_data, 2)
2.进行VAD(Voice Activity Detection)检测
讯飞的小语种识别真的巨坑,它的文档中有个参数vad_eos
。
这个参数的作用:
在默认vad_eos=2000的情况下,比如我说”你好”后停顿1s,再说”早上好”,它认为音频没结束,返回最终结果“你好,早上好”,但是我说”你好”后停顿3s,再说”早上好”,在”你好”后面的2s里音频没有内容,它认为音频已经结束,返回最终结果”你好”。
但是这个参数在中文条件下才有效,小语种条件下根本不生效。(它的文档里也没写,我问讯飞的技术支持才知道的)
造成的现象:
中文识别没有任何的问题,小语种识别一直在录音,讯飞不会返回任何结果,直到60s后超时返回报错超时.
所以要在客户端主动的实现VAD(Voice Activity Detection)效果.
之前我的代码都是java写的,但是在github上发现java并没有什么好的vad检测的库,最后全部代码换成了python,找到了一个python的vad检测的库。
参考代码:https://github.com/wangshub/python-vad
注意:
但是这个vad库检测的时候也有个坑,安装pip install webrtcvad
的时候报错Microsoft Visual C++ 14.0 is required
,解决方法是安装Microsoft Visual C++ 14.0及配置好环境
具体参考博客:Windows系统pip install webrtcvad
3.下载官网python版语音听写demo
官网的语音听写demo很简单,替换掉你自己的服务接口认证信息就能跑起来。
注意3点:
- 方言语种开通日语
- 小语种url和中英文不同
3.传参时language是ja_jp
4.字幕显示
将上面的步骤整合后就能识别到日语了。但还要在window桌面上显示出来还要用到pyqt5.
字幕UI参考: https://github.com/wingood-xu/suspendLyric
PyQt5中文教程:PyQt5中文教程
5.将Python程序打包为exe
一切都弄好后,还要将程序打包为exe.(不可能别人还要装python运行你的程序吧),我这里使用的是pyinstaller
打包为exe.
pip install pyinstaller
pyinstaller -F -w 你的执行文件.py
tip:
- -w 代表不显示控制台,如果程序运行报错,建议去掉-w,会有一个一闪而过的控制台带有报错的信息,把握时间,截到这个报错信息,粘贴到word内具体分析错误。
- 打包的时候不要在全局python环境内打包,不然会把你没用到的包也打包进去,导致包很大。应该在venv环境下打包
- pyinstaller打包python时含有多进程代码会出现bug:在pycharm下运行只有两个进程,打包后运行可能有了3个进程。
解决方法:http://redino.net/blog/2016/04/multiprocessing-frozen-python/
if __name__ == '__main__':
后面添加此行代码:multiprocessing.freeze_support()
3.其它
生成requirements.txt:
pip freeze > requirements.txt
requirements.txt的安装:
pip install -r requirements.txt
使用pipreqs
生成requirements.txt:
python 保存项目用到的包名生成requirements.txt
这种方式生成的requirements.txt里面只含你用到的package.
python日志处理:python 日志 logging模块(详细解析)