此文首發於我的Jekyll博客:zhang0peter的個人博客
應該在暑期的時候就有這個想法,想把錄音轉文字,語音轉文字甚至是視頻轉文字。
因爲有些時候有大段的音頻內容,但我只需要其中的幾分鐘,從頭開始播放感覺太浪費時間了。
網上有很多收費的解決方案軟件,比如訊飛就做的不錯,安卓端的APP用起來也很方便,就是貴了點。
然後我看到了這個知乎問題:有能把錄音變成文字的軟件麼? - 知乎
下面按識別準確率和易用性來排序各個軟件。
網易見外工作臺(推薦)
有人推薦:網易見外工作臺
每天可以免費使用2小時,支持視頻翻譯,語音翻譯,語音轉寫,圖片翻譯,文檔翻譯。
上傳錄音後等待幾分鐘,識別結果出來。
中文的識別準確率不錯:
反正我雖然說我我的轉變過程吧,我當時這樣的就是因爲我在找工作。我在研一研二下個月上半學期的時候要找工作,所以我要去頻繁的刷這個算法。因爲我那時候發現我要找的是外企嗎?外企的那個側重角度更偏向於算法數據結構,還有一些的系統設計。在當時我的那個項目經歷還不是很豐富的時候,你要想給面試官一個眼前一亮或者是印象深刻的一個想法的話,其實算法是一個比較性價比高點的事情。
優點:網頁版直接使用,無需編程基礎,識別準確率非常高
缺點:每天限制使用2小時
Chrome插件 Speechnotes
有人推薦Chrome插件:Speechnotes 聽寫記事本 - Chrome 網上應用店
不用註冊,在線實時聲音轉文字。
試了一下,對中文的實時識別效果不錯:
要找工作,所以我要去平凡的策略算法.因爲我那時候發現我要找的是外企嗎,買氣的那個特種角度更偏向於算法數據結構一些的系統設計.在當時我的那個項目經歷還不是很豐富的時候,你要想給面試官一個眼前一亮或者印象深刻的一個想法的話,其實算法是一個比較輕價比高的一個事情。
優點:直接使用,支持實時語音,對會議記錄的幫助很大,準確性高
缺點可以忽略不計
autosub
有人推薦這個庫: [NO LONGER MAINTAINED] Command-line utility for auto-generating subtitles for any video file。但這個庫的原作者一年前就不維護這個庫了,現在由一個國人維護: Command-line utility to transcribe/translate from video/audio/subtitles to subtitles
這個Python庫做的是通過Google Web Speech API
把video or an audio
轉換成SRT字幕或者json格式的文本。
安裝ffmpeg
和autosub
:
apt install ffmpeg python python-pip git -y
pip install git+https://github.com/BingLingGroup/autosub.git@alpha ffmpeg-normalize
使用示例:
->% autosub -i 54.mp3 -S zh
........
Converting speech regions to short-term fragments.
Converting: 100% |#############################################################################################################################| Time: 0:02:37
Sending short-term fragments to Google Speech V2 API and getting result.
Speech-to-Text: 100% |#########################################################################################################################| Time: 0:02:22
Speech language subtitles file created at "42.zh.srt".
All works done.
結果如下:
我當時這樣的就是因爲我在找工作我在嚴依然而下班上面學期的首要找工作所以,作者我要去平凡的穿着算法,因爲我那時候發現我要找的是外企嗎,白起的那個特徵角度,更偏向於算法數據結構而一切的系統設計,在當時我的那個項目經歷還不是很豐富的時候呢,你要想給面試官一個眼前一亮或者印象深刻的一個想法的話其實算法是一個逼,是一個比較現在的高低的事情。
準確性稍差
優點:不限時轉換
缺點:需要谷歌,而且準確性沒前2個好
百度語音識別API
百度AI開發平臺提供免費的語音識別API接口:百度智能雲-管理中心
註冊後獲得
百度提供REST API
和完整的SDK,其中REST API
僅支持整段語音識別的模式,即單段語音音頻時長不超過60s;完整的SDK識別不限時長。
本來想用linux-C+±SDK,下載:百度AI開放平臺-全球領先的人工智能服務平臺-百度AI開放平臺
但這個SDK只支持g++4.8和x64,無語了。
隨後我打算使用Python的REST API
,支持pcm, wav, m4a格式音頻,而且每段限時1分鐘,轉換格式:
ffmpy 安裝教程參考:anaconda 下安裝ffmpeg
安裝庫:
pip install baidu-aip
Python代碼如下:
from aip import AipSpeech
import ffmpy
import os
""" 你的 APPID AK SK """
APP_ID = '10540827'
API_KEY = 'PS79KGjFGoUlcuMVY5Lu0srs'
SECRET_KEY = '963de1bda70666389ed7dce7894594ef'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
# 讀取文件
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
FILENAME = "42.mp3"
# mp3轉換爲wav
ff = ffmpy.FFmpeg(
inputs={FILENAME: None},
global_options=['-y'],
outputs={'output.wav': '-ar 16000'})
ff.run()
# 把wav文件切割爲小塊
ff_split = ffmpy.FFmpeg(
inputs={'output.wav': None},
global_options=['-y'],
outputs={'temp_wav%d.wav': '-f segment -segment_time 30 -c copy'})#每段30秒
ff_split.run()
text = ''
files = [f for f in os.listdir('.') if os.path.isfile(f) and 'temp_wav' in f]
for filename in files:
# 識別本地文件
result = client.asr(get_file_content(filename), 'wav', 16000, {
'dev_pid': 1536,
})
if 'error_msg' in result or result['err_no'] != 0:
print(result)
else:
print(result['result'][0])
text = text + result['result'][0]
os.remove(filename)
with open('result.txt', 'w') as f:
f.write(text)
我進行測試的時候,返回結果不正常,有色情內容,可能有黑客侵入了百度的系統,我就不做評判了。
IBM的Speech to Text(不推薦)
另外一個免費的工具是IBM推出的Speech to Text 工具,也是免費的:Watson Speech to Text - 概述 - 中國 IBM
註冊賬戶後打開頁面Speech to Text - IBM Cloud
選擇Lite
套餐,每個月有500分鐘免費的音頻轉文字套餐,缺點是不能轉錄100M以上大小的音頻(異步調用可以轉錄最大1G的音頻)。
推薦使用Python操作api,直接使用curl返回的結果是json,不利於進一步操作。
安裝庫:pip install --upgrade ibm-watson
代碼如下:
from ibm_watson import SpeechToTextV1
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
authenticator = IAMAuthenticator('API')
speech_to_text = SpeechToTextV1(
authenticator=authenticator
)
speech_to_text.set_service_url(
'https://api.us-south.speech-to-text.watson.cloud.ibm.com/instances/xxxxxxxx')
f = open("42.mp3", "rb")
result = speech_to_text.recognize(audio=f, content_type='audio/mp3', model='zh-CN_NarrowbandModel')
l = result.result['results']
text = ''
for i in l:
text = text + i['alternatives'][0]['transcript'] + ','
fo = open("audio-text.txt", "w")
fo.write(text)
fo.close()
對中文的識別效果並不好:
反正 我 涮 肉 我 我的 轉 亮果廠 吧 ,我 當時 這樣的 就是 因爲 我的 找工作 我 再 延期 你 而 下的 上面 學習 的 首要 找工作 索要 去 平方米 川 流 ,你 沒有 那時候 發現 我要 找 的 是 外企 嗎 ,那個 特種 較多 ,更 偏向 與 結構 ,寫 的 系統 設計 ,在 當時 我的 那個 項目 經理 還不是 很 豐富 的 時候 ,你 要想 給 麪食 館 一個 眼前 一 亮 或者 印象 深刻 的一個 想法 的話 其實 上海 是一個 比較 性價比 高的 的 事情
IBM和谷歌的接口效果不好的原因是,他們把音頻切爲一段一段進行識別,並不會根據上下文來調整文字,準確性自然低。
如果不加@符號會報錯:
{
"code_description": "Bad Request",
"code": 400,
"error": "Stream was 15 bytes but needs to be at least 100 bytes."
}
如果文件大小超過100M,會報錯:
<HTML><HEAD>
<TITLE>Internal Server Error</TITLE>
</HEAD><BODY>
<H1>Internal Server Error - Write</H1>
The server encountered an internal error or misconfiguration and was unable to
complete your request.<P>
Reference #4.c8142017.1580636884.75fa462e
</BODY></HTML>