这里讲一下如何在不联网的情况下,依然可以通过python来将语音文件转换成文字。这里用到的包为sphinx,sphinx是由美国卡内基梅隆大学开发的大词汇量、非特定人、连续英语语音识别系统。
[[282998]]
网上找到一些例子,有一些成熟的模型,可以将语音转成文字。例如Cloud Speech API,但是需要你使用google云平台的前提。
speech recognition
对于python这一非常成熟的胶水语言,在网上找一些现成的工具包真的不是一个太难的问题。在GitHub上就发现了这样一个神奇的包:speech recognition
它可以支持实时翻译,当然前提是需要在机器上安装有关麦克风的依赖包;还可以支持将语音文件中的文字直接提取出来。通过speech recognition可以调用多种平台上的模型,比如google API,CMU sphinx,Microsoft Bing Speech,IBM Speech to Text,Wit.ai 等
离线转换
对于国内的网络环境,无法用google API来将语音数据转换成文本文件,因为在调用这个包的时候,需要连接到google。当然,你可以租用一个国外的VPS来做这件事情。
这里讲一下如何在不联网的情况下,依然可以通过python来将语音文件转换成文字。这里用到的包为sphinx,sphinx是由美国卡内基梅隆大学开发的大词汇量、非特定人、连续英语语音识别系统。
安装 sphinx
我本人所用的环境为ubuntu。
- imyin@develop:~/Downloads/phinx$lsb_release-a
- NoLSBmodulesareavailable.
- DistributorID:Ubuntu
- Description:Ubuntu16.04.3LTS
- Release:16.04
- Codename:xenial
在安装sphinx之前需要安装一些软件包
- sudoapt-getinstallgccautomakeautoconflibtoolbisonswigpython-devlibpulse-dev
之后可以在相关网站上下载sphinxbase安装包,当然也可以直接clone github上的包
下载完之后进行解压
- tarzxpfsphinxbase-5prealpha.tar.gz
修改文件名
- mvsphinxbase-5prealphasphinxbase
- lssphinxbase
- AUTHORSdocindent.shMakefile.amREADME.mdsrcwin32
- autogen.sh.gitLICENSENEWSsphinxbase.pc.inswig
- configure.acincludem4READMEsphinxbase.slntest
现在我们应该运行autogen.sh来生成Makefiles和其他一些脚本以备后续的编译和安装。
- ./autogen.sh
下面开始源码安装
- make&&sudomakeinstall
执行完以上命令之后,如果没有出现什么报错信息,就说明已经安装成功了,但是此时你的命令并不可以生效,在运行命令时会出现这样的错误。
- imyin@develop:~/Downloads/phinx/sphinxbase$sphinx_lm_convert
- sphinx_lm_convert:errorwhileloadingsharedlibraries:libsphinxbase.so.3:cannotopensharedobjectfile:Nosuchfileordirectory
还需要让系统加载目录/usr/local/lib,为了让系统每次启动时都可以自动加载,可以修改系统配置文件ld.so.conf
- sudoecho"/usr/local/lib">>/etc/ld.so.conf
- sudoldconfig
这时候,就可以通过sphinx_lm_convert命令将模型DMP文件转成bin文件
- sphinx_lm_convert-izh_broadcastnews_64000_utf8.DMP-ozh_CN.lm.bin
上面这行代码是将中文的模型DMP文件转成了bin文件。在安装完sphinx后默认只支持英文,在存放模型的路径下只有一个文件名为en-US,所以这里需要添加一个处理中文的模型,相关文件可以在这个网址中下载。
[[282999]]
在python中使用sphinx
想要在python中使用sphinx的话,需要安装一些依赖包。
- pipinstallpydub-U#负责将MP3文件转换为wav文件
- pipinstallSpeechRecognition-U#负责将语音转换成文字
- sudoapt-qqinstallbuild-essentialswiglibpulse-dev#为后面安装pocketsphinx做准备
- pipinstall-Upocketsphinx#为使用sphinx
- sudoapt-getinstalllibav-tools#为解决在调用pydub时出现的warning:RuntimeWarning:Couldn'tfindffmpegoravconv-defaultingtoffmpeg,butmaynotworkwarn("Couldn'tfindffmpegoravconv-defaultingtoffmpeg,butmaynotwork",RuntimeWarning)
这时候,就可以启动ipython来试试效果了。
- file_path='/home/imyin/Downloads/phinx/test_data'
- r=sr.Recognizer()
- hello_zh=sr.AudioFile(os.path.join(file_path,'test.wav'))
- withhello_zhassource:
- audio=r.record(source)
- r.recognize_sphinx(audio,language='zh_CN')
- '今天天气很'
可以看出,这个语音识别器已经生效了。但是我说的是“今天天气好热啊”。
看来sphinx中的模型并非很准呐,而且这只是一个短句子。我们接下来看看长句子的效果,我录了村上春树的《当我谈跑步时我谈些什么》中的一段内容。
那一年的七月里,我去了一趟希腊,要独自从雅典跑到马拉松,将那条原始的马拉松路线——马拉松至雅典——逆向跑上一趟。为什么要逆向跑呢?因为清晨便从雅典市中心出发,在道路开始拥堵、空气被污染之前跑出市区,一路直奔马拉松的话,道路的交通量远远少得多,跑起来比较舒适。这不是正式的比赛,自己一个人随意去跑,当然不能指望有什么交通管制。
- hello_zh=sr.AudioFile(os.path.join(file_path,'test2.wav'))
- withhello_zhassource:
- audio=r.record(source)
- r.recognize_sphinx(audio,language='zh_CN')
- '南音扬的只有领过球的立场是希望让猪只处理垃圾土木工程上打球运动充满温情能成功吗而中止了对印尼商报称他不是没有立场谈那一枚其中春天从雅典市中心出发寸厂都可成功突破寻求对於能提升统筹署取缔一路直奔马拉松和阿惹山活动等二十个队中重申这不是正常的比赛自己一个人却一直到当然不能说明什么这种共识'
呃,看到结果,我觉得可以用一个来形容:差劲。两个字来形容:太差劲!
当然,这个模型只是我直接从网上下载下来的。训练它时所用到的语料不会那么齐全,所以在测试时难免会出现不准确的情况。要想让模型更加准确,需要自己在利用sphnix继续训练模型。
相关办法在其官网上可以找到,也有相应的教程。感兴趣的朋友可以自行研究。
- Q:Whymyaccuracyispoor
- Speechrecognitionaccuracyisnotalwaysgreat.Totestspeechrecognitionyouneedtorunrecognitiononprerecordedreferencedatabasetoseewhathappensandoptimizeparameters.
- Youdonotneedtoplaywithunknownvalues,thefirstthingyoushoulddoistocollectadatabaseoftestsamplesandmeasuretherecognitionaccuracy.Youneedtodumpspeechutterancesintowavfiles,writethereferencetextfileandusedecodertodecodeit.ThencalculateWERusingtheword_align.pltoolfromSphinxtrain.Testdatabasesizedependsontheaccuracybutusuallyit’senoughtohave10minutesoftranscribedaudiototestrecognizeraccuracyreliably.Theprocessisdescribedintutorialtuning.
文中提到的教程网址是https://cmusphinx.github.io/wiki/tutorialtuning/
Google API
利用google API来处理语音识别则相当准确,不过需要连接google,以下是我在VPS中执行的一段代码,可以看出,它将我的录音精准地翻译成了文字。
但是如果录音文件较大的话,会运行时间很长,并且会返回一个超时的错误,这很是让我苦恼。
不过幸运的是,speech_recognition支持将语音文件进行截取处理。例如,我可以只处理语音文件中的前15秒钟的内容。
- withtestassource:
- audio=r.record(source,duration=15)
- r.recognize_google(audio,language='zh-CN')
- '那一年的7月里我去了一趟希腊有独自从雅典跑到马拉松江哪条原始的马拉松路线马拉松直雅典一想跑上一趟'
从上面的结果看,简直比sphnix处理的效果好太多了。
通过看帮助文档发现speech_recognition不仅可以截取前面的录音,还可以截取中间的。
- In[18]:r.record?
- Signature:r.record(source,duration=None,offset=None)
- Docstring:
- Recordsupto``duration``secondsofaudiofrom``source``(an``AudioSource``instance)startingat``offset``(oratthebeginningifnotspecified)intoan``AudioData``instance,whichitreturns.
- If``duration``isnotspecified,thenitwillrecorduntilthereisnomoreaudioinput.
例如我想处理5秒至20秒之间的内容。
- withtestassource:
- audio=r.record(source,offset=5,duration=15)
- r.recognize_google(audio,language='zh-CN')
- '要独自从雅典跑到马拉松江哪条原始的马拉松路线马拉松直雅典一项跑上一趟为什么要一想到呢因为星辰变从雅典市中心出发'
今天就讲到这里。世界真奇妙,更多精彩,自己继续去发现吧!
©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经