太酷了,用Python+Excel制作一個視頻下載器!
說起Excel,那絕對是數(shù)據(jù)處理領(lǐng)域王者般的存在。
而作為網(wǎng)紅語言Python,在數(shù)據(jù)領(lǐng)域也是被廣泛使用。
其中Python的第三方庫-xlwings,一個Python和Excel的交互工具,可以輕松地通過VBA來調(diào)用Python腳本,實現(xiàn)復(fù)雜的數(shù)據(jù)分析。
今天,小F就給大家介紹一個Python+Excel的項目【視頻下載器】。

主要使用到下面這些Python庫。
import?os
import?sys
import?ssl
import?ffmpeg
import?xlwings?as?xw
from?pathlib?import?Path
from?aip?import?AipSpeech
from?pydub?import?AudioSegment
from?wordcloud?import?WordCloud
from?pydub.utils?import?make_chunks
from?moviepy.editor?import?AudioFileClip
其中ffmpeg、pydub、moviepy是用來處理音視頻的,比如裁剪、格式轉(zhuǎn)換等。
aip庫則是百度官方庫,用來做語音轉(zhuǎn)文字的。
#?安裝
pip?install?baidu-aip
對于xlwings這里就不多說了,想了解的小伙伴,可以去看官方文檔。
地址:
https://docs.xlwings.org/en/stable/
下面就給大家來介紹一下吧!
首先調(diào)用xlwings模塊生成一個項目,命令如下。
#?創(chuàng)建項目
xlwings?quickstart?transcriber?--standalone
這時候我們就能看到有一個項目名稱為transcriber的文件夾,這個就是作為我們項目使用的,并且可以修改為任何名字。

其中注意:?
1.?transcriber.py,這是帶Python代碼的文件,內(nèi)容如下。
import?xlwings?as?xw
def?main():
????wb?=?xw.Book.caller()
????sheet?=?wb.sheets[0]
????if?sheet["A1"].value?==?"Hello?xlwings!":
????????sheet["A1"].value?=?"Bye?xlwings!"
????else:
????????sheet["A1"].value?=?"Hello?xlwings!"
@xw.func
def?hello(name):
????return?f"Hello?{name}!"
if?__name__?==?"__main__":
????xw.Book("transcriber.xlsm").set_mock_caller()
????main()
2.?transcriber.xlsm,這是帶vba代碼的Excel文件,內(nèi)容如下。

打開Excel文件,提示沒有啟用宏,所以設(shè)置一下。

文件 - 更多 - 選項 - 信任中心 - 信任中心設(shè)置 - 宏設(shè)置 - 啟用所有宏。
然后安裝xlwings的Excel集成插件,安裝之前需要關(guān)閉所有Excel應(yīng)用,不然會報錯。
#?安裝xlwings的Excel集成插件
xlwings?addin?install
xlwings和插件都安裝好后,這時候打開Excel,會發(fā)現(xiàn)工具欄出現(xiàn)一個xlwings的菜單框,代表xlwings插件安裝成功。
它起到一個橋梁的作用,為VBA調(diào)用Python腳本牽線搭橋。

此外還需要把“開發(fā)工具”添加到功能區(qū),因為我們要用到宏。
配置運行環(huán)境,Python執(zhí)行器,Conda安裝路徑,Conda虛擬環(huán)境路徑。

最后點擊“開發(fā)工具”選項卡,點擊Visual Basic - 工具 - 引用 - 添加xlwings。
到此,環(huán)境就配置成功了。
我們先用之前創(chuàng)建的transcriber.xlsm文件來實驗一下,插入一個按鈕,指定宏。

點擊綠色的按鈕,可以看見A1單元格會有信息出現(xiàn),說明啟用宏成功。
這里我們可以把A1單元格名稱修改為OUTPUTCELL。

再去修改transcriber.py文件中的代碼。
import?xlwings?as?xw
def?main():
????wb?=?xw.Book.caller()
????sheet?=?wb.sheets[0]
????if?sheet["OUTPUTCELL"].value?==?"Hello":
????????sheet["OUTPUTCELL"].value?=?"Bye"
????else:
????????sheet["OUTPUTCELL"].value?=?"Hello"
@xw.func
def?hello(name):
????return?f"Hello?{name}!"
if?__name__?==?"__main__":
????xw.Book("transcriber.xlsm").set_mock_caller()
????main()
點擊按鈕,發(fā)現(xiàn)信息有所變,說明可以給單元格指定名稱和輸出。

了解了xlwings的基本使用,我們就可以對表格進(jìn)行排版布局一波啦!

給音頻轉(zhuǎn)文本,生成字幕詞云添加數(shù)據(jù)驗證,其實就是一個列表選項,可選擇是或否。

給音頻轉(zhuǎn)文本,生成字幕詞云添加條件格式,選擇是或否后,展示不同的顏色,默認(rèn)否(淡紅色)。

好了,最后修改一下各個單元格的名稱。

編寫主程序,代碼如下。
def?main():
????wb?=?xw.Book.caller()
????sheet?=?wb.sheets[0]
????bilibili_url?=?sheet["BILIBILI_URL"].value
????transcribe?=?sheet["TRANSCRIBE"].value
????wordcloud?=?sheet["WORDCLOUD"].value
????status_cell?=?sheet["STATUS_CELL"]
????#?重置狀態(tài)欄
????status_cell.value?=?""
????#?獲取程序運行路徑
????output_path?=?Path(__file__).parent
????output_path?=?str(output_path)
????#?下載
????if?bilibili_url:
????????status_cell.value?=?"開始下載音視頻文件?..."
????????audio_file?=?download_bilibili(bilibili_url,?status_cell,?output_path)
????else:
????????status_cell.value?=?"未輸入B站視頻地址"
????????sys.exit()
????#?語音轉(zhuǎn)文字
????if?transcribe?==?'是':
????????transcription_text?=?transcribe_audio_file(status_cell,?audio_file,?output_path)
????#?生成詞云
????if?transcribe?==?'是'?and?wordcloud?==?'是':
????????generate_wordcloud(transcription_text,?output_path,?status_cell)
使用第一個sheet表,不斷的更新狀態(tài)欄信息,判斷是否要運行下載、語音轉(zhuǎn)文字、生成詞云這三個函數(shù)。
下載音視頻使用到了you-get庫,一鍵下載幾乎所有網(wǎng)站上的音視頻。

支持的網(wǎng)站還不少呢,本次就只用B站的視頻來測試。
def?download_bilibili(bilibili_url,?status_cell,?output_path):
????"""下載音視頻"""
????filename?=?bilibili_url.split('/')[-1].split('?')[0]
????cmd?=?'you-get?{}?-o?{}?-O?{}'.format(bilibili_url,?output_path,?filename)
????os.system(cmd)
????#?導(dǎo)入視頻
????my_audio_clip?=?AudioFileClip(output_path?+?"\\{}.flv".format(filename))
????#?提取音頻并保存
????audio_file?=?output_path?+?"\\{}.wav".format(filename)
????my_audio_clip.write_audiofile(audio_file)
????status_cell.value?=?f"成功下載B站視頻,?并且提取音頻:?{audio_file}"
????return?audio_file
使用moviepy庫提取視頻中的音頻,用于語音識別。
當(dāng)音頻轉(zhuǎn)文本選項的內(nèi)容是【是】的時候,下面代碼就派上用場了。
使用百度的短語音識別技術(shù),需要申請使用,不想用的小伙伴直接兩個可選項選擇【否】,當(dāng)做一個下載器即可。

可惜識別最長時間只能是60秒,所以需要將之前獲取的音頻進(jìn)行切割。
此外還需要對音頻的采樣率進(jìn)行匹配。
def?transcribe_audio_file(status_cell,?audio_file,?output_path):
????"""語音轉(zhuǎn)文字"""
????status_cell.value?=?"開始處理音頻文件..."
????old_name?=?audio_file
????new_name?=?audio_file.split('.')[0]?+?'_16000.wav'
????split_name?=?audio_file.split('.')[0]
????#?對音頻進(jìn)行降頻處理
????ffmpeg.input(old_name).output(new_name,?ar=16000).run(cmd=FFMPEG_PATH)
????#?切割音頻
????audio?=?AudioSegment.from_file(new_name,?"wav")
????#?切割的毫秒數(shù)
????size?=?30000
????#?將文件切割為30s一塊
????chunks?=?make_chunks(audio,?size)
????for?i,?chunk?in?enumerate(chunks):
????????#?枚舉,i是索引,chunk是切割好的文件
????????chunk_name?=?split_name?+?"_{0}.wav".format(i)
????????#?保存文件
????????chunk.export(chunk_name,?format="wav")
????status_cell.value?=?"使用百度語音接口識別音頻..."
????#?使用百度語音接口
????"""?你的?APPID?AK?SK?"""
????APP_ID?=?''
????API_KEY?=?''
????SECRET_KEY?=?''
????client?=?AipSpeech(APP_ID,?API_KEY,?SECRET_KEY)
????#?讀取文件
????def?get_file_content(file_path):
????????with?open(file_path,?'rb')?as?fp:
????????????return?fp.read()
????transcription_txt?=?output_path?+?"\\transcription.txt"
????#?識別本地文件
????for?i,?chunk?in?enumerate(chunks):
????????result?=?client.asr(get_file_content(split_name?+?"_{0}.wav".format(i)),?'wav',?16000,?{
????????????'dev_pid':?1537??#?默認(rèn)1537(普通話?輸入法模型),dev_pid參數(shù)見本節(jié)開頭的表格
????????})
????????print(result['result'])
????????with?open(transcription_txt,?"a")?as?file:
????????????file.write(result['result'][0])
????????file.close()
????status_cell.value?=?f"音頻轉(zhuǎn)文本成功,?文件保存到?{transcription_txt}"
????return?transcription_txt
可識別普通話、英語、粵語、四川話識別。通過在請求時配置不同的dev_pid參數(shù),選擇對應(yīng)模型。
最終將音頻轉(zhuǎn)為文本,保存在一個文本文件中。
生成詞云,這里需要注意添加中文字體路徑,要不然詞云圖顯示不了中文。
def?generate_wordcloud(textfile,?output_path,?status_cell):
????"""生成詞云"""
????textfile?=?Path(textfile)
????content?=?textfile.read_text()
????wordcloud?=?WordCloud(font_path=output_path?+?'\\simhei.ttf').generate(content)
????wordcloud.to_file(Path(output_path)?/?f"{textfile.stem}.png")
????status_cell.value?=?"生成詞云圖"
項目整體就如上面描述的一樣。
此時我們只需打開Excel文件,選擇是或否選項,修改B站視頻地址,點擊開始下載,即可下載視頻,以及生成詞云圖。
無需再去運行Python文件。

成功下載到視頻,并且對音視頻進(jìn)行處理,得到文本信息。

查看一下詞云圖吧。

發(fā)現(xiàn)百度的語音識別有點差啊,不知道是哪里出現(xiàn)了問題...
好了,本期的分享就到此結(jié)束了,有興趣的小伙伴可以自行去實踐學(xué)習(xí)。
比如制作一個彈幕分析詞云圖,或者下載其他網(wǎng)站的視頻等等。
使用到的代碼及文件都已上傳,掃碼添加老表微信,回復(fù)「視頻下載」即可獲取。
掃碼即可加我微信
學(xué)習(xí)交流
老表朋友圈經(jīng)常有贈書/紅包福利活動
萬水千山總是情,點個????行不行。
