標籤:

使用Python進行語音識別---將音頻轉為文字

自從入職以來,一直在做關於ArcGIS視頻的中英字幕,前前後後已經做了不少。基本都上傳到網上了,有興趣的可以看看ArcGIS培訓視頻中心的自頻道-優酷視頻

說實話,這是個挺廢時間的工作,一般一個5-6分鐘的視頻,從聽寫字幕腳本到時間軸校對,校對完之後逐句翻譯,本著自己的水平,不求信達雅,只求通暢就行,然後再加一些DuangDuang字幕特效,最後將字幕和視頻進行,基本是3-4個小時,可能看起來不可思議,有興趣的可以親自去嘗試一下。

雖然過程是枯燥乏味的,但是最終看到自己的成果,成就感也是油然而生的。

中英字幕 小樣

前段時間美國Esri舉辦了全球的開發者大會,我在YouTube上看到陸續有上傳的現場視頻,於是下了下來,想著翻譯一些,然後在ArcGIS知乎上等渠道做一下傳播推廣。但是有個問題是,這些視頻沒有字幕腳本,更坑爹的是,裡面大部分是印度人主講,帶著印度咖喱腔的英語,聽起來著實費解,所以翻譯進度遠不如之前,慢得出其,讓我很困惑。做了幾個視頻的字幕後,實在沒動力了,於是就暫停了。。。。

今天看了一篇報道,說是語音識別的技術,成熟度已經很可觀了。突然想到:能不能將視頻轉為音頻,然後使用一些語音識別的技術,完成這個艱巨的活呢。於是說干就干,百度搜索了許多音頻轉文字的技術。最後發現IBM公司有這項技術,對音頻的識別率很高,並且提供有1000分鐘的免費API(可以在IBM Bluemix - Next-Generation Cloud App Development Platform註冊一下,獲取API用戶名和密碼,後續會有用,這個很關鍵!!!),

IBM註冊 應用部署

賬戶密碼

正好也支持Python調用,整個過程很簡單,就是先安裝IBM的模塊,這裡我使用的是speechrecognition模塊,在pycharm直接可以搜索到並安裝,

speechrecognition模塊

speechrecognition模塊不僅包含了IBM的語音識別API,還有微軟、谷歌的語音識別API等等,帶上github項目地址github.com/Uberi/speech

speechrecognition模塊

感嘆到:Python的功能真是應有盡有,沒有你想不到的。

然後我寫了不多的幾行代碼,這個艱難的事情就迎刃而解了

思路主要如下,就是將視頻轉為WAV格式的音頻(轉為MP3等其他格式,可能識別不了),然後調用識別模塊,就靜靜的等著或者去忙其他的事,最後會返回識別出來的文本

返回的識別文本

準確率還是很高的,估摸有80%-90%

如果你手上正好有一堆的音頻想轉為文字,趕緊來試試,解放生產力的時候到了!!哈哈~~~

附上我寫的拙劣代碼

見笑見笑!

#!/usr/bin/env pythonn# -*-coding:utf-8 -*-n__author__ = jiangn# import eyed3n# import wavenimport osnimport speech_recognition as srn# from pydub import AudioSegmentnimport timenimport datetimen# ##獲取音頻時長n# f = wave.open(r"C:UsersEsriDesktopspeech.wav","rb")n# timelength=int(f.getparams()[3]/f.getparams()[2])n# print(int(5.6))n#n# ##音頻分割輸出n# readaudio=AudioSegment.from_wav(rC:UsersEsriDesktopspeech.wav)n# kn=int(timelength/30)+1n# for i in range(kn):n# readaudio[i*30*1000:((i+1)*30+2)*1000].export(rC:UsersEsriDesktopspeechspeech%d.wav%(i+1), format="wav")n##獲取文件夾下的音頻文件名nstarttime = datetime.datetime.now()ni = 1nfor name in os.listdir(rC:UsersEsriDesktopspeech):n print("%d %s 開始轉換" % (i, name))n ##音頻分塊識別n r = sr.Recognizer()n # for i in range(kn):n try:n with sr.WavFile(rC:UsersEsriDesktopspeech%s % name) as source:n audio = r.record(source)n IBM_USERNAME = *******************n IBM_PASSWORD = *****n text = r.recognize_ibm(audio, username=IBM_USERNAME, password=IBM_PASSWORD, language=en-US)n print(text)n open(rC:UsersEsriDesktoptext%s.txt % name, a+).write(text)n time.sleep(5)n temptime = datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)n print(%s %d %s 已完成 % (temptime,i, name))nn except Exception as e:n print(e)n temptime = datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)n print(%s %d %s 未完成 % (temptime, i, name))n continuenjietime = datetime.datetime.now()nlast=jietime-starttimenprint(總共花費時間:%s%last)n

測試結果分析:

1、IBM的API能識別英語、中文等好幾種語言,識別的正確率很不錯;

2、經過我的初步測試,IBM的識別機制是按照這樣來的:先是將你的音頻傳到IBM的伺服器,然後是打開音頻實時識別,聽起來很拗口,意思就是將音頻放一遍,伺服器邊放邊識別,最後將所有的識別以文本的形式(貌似是JSON格式,但是在speechrecognition模塊中,已經轉為文本)返回給你;

3、看完上面的識別機制,你可能會產生疑問:如果音頻時間比較長,中間出現網路中斷,之前識別的內容不就沒了么。因此最好採取分段的方法,將音頻分割為較短的幾段,等效於實時的返回,減少丟失的問題;

4、經過測試,又有新問題,如果分段的話,超過10段以上,遠程伺服器會中斷服務,也就是說:不能頻繁的調介面,跟網站的發爬蟲一樣。多進程就別想了。最後部門石經理提供的解決辦法是:識別一段後。等個5秒左右再循環下一個,照此方法可行。由於我自己的視頻不長,數量也不多,就沒做等待處理;

5、IBM的語音識別著實厲害,其他的語音識別等有時間再做測試。

歡迎關注我的小小公眾號! zyouzz

分享RS/GIS,無人機,物聯網,大數據技術和資訊,萃取行業動向,為每天的進步助力!


推薦閱讀:

Python-Excel 模塊哪家強?
從零開始掌握Python機器學習:十四步教程
理解 Python 裝飾器就看這一篇

TAG:Python |