当前位置: 首页 > 科技观察

手把手教你用Python做语音识别_0

时间:2023-03-21 17:47:36 科技观察

在网上找了一些例子,有一些比较成熟的模型可以把语音转成文字。比如CloudSpeechAPI,但是你需要使用谷歌云平台的前提。语音识别对于python这种非常成熟的胶水语言来说,在网上找一些现成的工具包确实不是太难。在github上发现了这么一个神奇的包:speechrecognition,可以支持实时翻译,当然前提是机器上需要安装麦克风相关的依赖包;它还可以支持直接提取语音文件中的文本。通过语音识别可以调用各种平台的模型,如googleAPI、CMUsphinx、MicrosoftBingSpeech、IBMSpeechtoText、Wit.ai等离线转换对于国内网络环境,无法使用googleAPI将语音数据转换成文本文件,因为调用这个包时,你需要连接到谷歌。当然,你可以租用国外的VPS来做这件事。下面我就来说说如何在不联网的情况下通过python将语音文件转换成文本。这里使用的包是sphinx,是美国卡耐基梅隆大学开发的大词汇量、非特定、连续的英语语音识别系统。我安装sphinx使用的环境是ubuntu。imyin@develop:~/Downloads/phinx$lsb_release-aNoLSBmodulesareavailable.DistributorID:UbuntuDescription:Ubuntu16.04.3LTSRelease:16.04Codename:xenial在安装sphinx之前,需要安装一些包sphinxbase安装包,当然也可以直接克隆在github上打包,下载后解压tarzxpfsphinxbase-5pr??ealpha.tar.gz修改文件名mvsphinxbase-5pr??ealphasphinxbaselssphinxbaseAUTHORSdocindent.shMakefile.amREADME.mdsrcwin32autogen.sh.gitREICENEWSsphinxbase.pc.inswigembase.现在我们应该运行autogen.sh生成Makefiles等用于后续编译和安装的脚本。./autogen.sh开始源码安装make&&sudomakeinstall执行上面的命令后,如果没有报错信息,说明已经安装成功,但是此时你的命令没有生效,会出现这样的错误当你运行命令时。imyin@develop:~/Downloads/phinx/sphinxbase$sphinx_lm_convertsphinx_lm_convert:errorwhileloadingsharedlibraries:libsphinxbase.so.3:cannotopensharedobjectfile:Nosuchfileordirectory还需要让系统加载目录/usr/local/lib,为了让系统自动加载每次启动时,可以修改系统配置文件ld.so.confsudoecho"/usr/local/lib">>/etc/ld.so.confsudoldconfig此时可以使用sphinx_lm_convert命令转换模型DMPfileintoabinfilesphinx_lm_convert-izh_broadcastnews_64000_utf8.DMP-ozh_CN.lm.bin上面这行代码是将中文模型DMP文件转为bin文件。安装sphinx后,默认只支持英文。模型存放路径下只有一个en-US文件,所以这里需要添加一个处理中文的模型。相关文件可从本网站下载。在python中使用sphinx如果想在python中使用sphinx,需要安装一些依赖包。pipinstallpydub-U#负责将MP3文件转为wav文件pipinstallSpeechRecognition-U#负责将语音转为文本sudoapt-qqinstallbuild-essentialswiglibpulse-dev#为后续安装pocketsphinx做准备pipinstall-Upocketsphinx#forusingsphinxsudoapt-getinstalllibav-tools#for解决调用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里面的模型不是很准确,这也只是短短的一句话。接下来我们看看长句的效果。我录了一段村上春树的《当我谈跑步时我谈些什么》。那年7月,我一个人去希腊跑雅典跑马拉松,把原来的马拉松路线——马拉松跑雅典——倒着跑。你为什么往反方向跑?因为一早从雅典市中心出发,在道路开始拥堵,空气还没有被污染之前就跑出市区,直奔马拉松,路上的车流量少了很多,多了跑起来舒服。这不是正式的比赛,所以你可以一个人随意跑,当然也不能指望有什么交通管制。hello_zh=sr.AudioFile(os.path.join(file_path,'test2.wav'))withhello_zhassource:audio=r.record(source)r.recognize_sphinx(audio,language='zh_CN')'南音阳只收到了位置舞会的目的是让猪处理垃圾。土木工程充满温情。这项运动能成功吗?他停止与《印度尼西亚商业日报》交谈。至于统筹处的宣传,20支球队一路被禁止参加马拉松和AjarHill活动等,重申这不是我自己正常比赛,当然不能解释这个共识是什么。嗯,看到结果,我觉得可以用一个词来形容:不好。两个字形容:太差了!当然,这个模型只是我直接从网上下载的。用来训练它的语料库不会那么完整,所以在测试的时候难免会出现不准确的情况。为了让模型更准确,需要自己使用sphnix继续训练模型。相关方法可以在其官网找到,也有相应的教程。有兴趣的朋友可以自己研究。Q:WhymyaccuracyispoorSpeechrecognitionaccuracyisnotalwaysgreat.Totestspeechrecognitionyouneedtorunrecognitiononprerecordedreferencedatabasetoseewhathappensandoptimizeparameters.Youdonotneedtoplaywithunknownvalues,thefirstthingyoushoulddoistocollectadatabaseoftestsamplesandmeasuretherecognitionaccuracy.Youneedtodumpspeechutterancesintowavfiles,writethereferencetextfileandusedecodertodecodeit.ThencalculateWERusingtheword_align.pltoolfromSphinxtrain.Testdatabasesizedependsontheaccuracybutusuallyit'senoughtohave10minutesoftranscribedaudiototestrecognizeraccuracyreliably.Theprocessisdescribedintutorialtuning.文中提到的教程网址是https://cmusphinx.github.io/wiki/tutorialtuning/GoogleAPI利用googleAPI处理语音识别还是比较准确的,但是需要连接google。下面是我在VPS中执行的一段代码。可以看出,它准确地将我的录音翻译成了文字。但是如果录音文件很大,运行起来会很长时间,而且会返回超时错误,这让我很苦恼。好在speech_recognition支持语音文件的截取。例如,我只能处理语音文件的前15秒。withtestassource:audio=r.record(source,duration=15)r.recognize_google(audio,language='zh-CN')'那年七月,我去了希腊,一个人从雅典跑到马拉松河马拉松是哪个原厂的路线是马拉松直达雅典?从上面的结果来看,比sphnix处理的效果要好很多。通过查看帮助文档,发现speech_recognition不仅可以截取前面的录音,还可以截取中间的录音。In[18]:r.record?Signature:r.record(source,duration=None,offset=None)Docstring:Recordsupto``duration``secondssofaudiofrom``source``(一个``AudioSource``实例)startingat``offset``(如果未指定,则在开头)到``AudioData``实例中,该实例返回。如果没有指定``duration``,那么它会一直记录到没有更多的音频输入为止。比如我要处理5秒到20秒之间的内容。withtestassource:audio=r.record(source,offset=5,duration=15)r.recognize_google(audio,language='zh-CN')'哪条马拉松原路线要跑雅典到马拉松河单独马拉松到雅典干嘛你要考虑一次旅行吗?因为星星从雅典的中心开始,所以今天就到此为止。世界真的很精彩,更精彩,继续自己去发现!