使用Python進行語音識別---將音頻轉為文字
自從入職以來,一直在做關於ArcGIS視頻的中英字幕,前前後後已經做了不少。基本都上傳到網上了,有興趣的可以看看ArcGIS培訓視頻中心的自頻道-優酷視頻
說實話,這是個挺廢時間的工作,一般一個5-6分鐘的視頻,從聽寫字幕腳本到時間軸校對,校對完之後逐句翻譯,本著自己的水平,不求信達雅,只求通暢就行,然後再加一些DuangDuang字幕特效,最後將字幕和視頻進行,基本是3-4個小時,可能看起來不可思議,有興趣的可以親自去嘗試一下。雖然過程是枯燥乏味的,但是最終看到自己的成果,成就感也是油然而生的。IBM註冊 應用部署
賬戶密碼
正好也支持Python調用,整個過程很簡單,就是先安裝IBM的模塊,這裡我使用的是speechrecognition模塊,在pycharm直接可以搜索到並安裝,speechrecognition模塊
speechrecognition模塊不僅包含了IBM的語音識別API,還有微軟、谷歌的語音識別API等等,帶上github項目地址https://github.com/Uberi/speech_recognition#readmespeechrecognition模塊感嘆到: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 |