大家好,我是小F。
說起Excel,那絕對是數據處理領域王者般的存在。
而作為網紅語言Python,在數據領域也是被廣泛使用。
其中Python的第三方庫-xlwings,一個Python和Excel的交互工具,可以輕鬆地通過VBA來調用Python腳本,實現複雜的數據分析。
今天,小F就給大家介紹一個Python+Excel的項目【視頻下載器】。

主要使用到下面這些Python庫。
importosimportsysimportsslimportffmpegimportxlwingsasxwfrompathlibimportPathfromaipimportAipSpeechfrompydubimportAudioSegmentfromwordcloudimportWordCloudfrompydub.utilsimportmake_chunksfrommoviepy.editorimportAudioFileClip
其中ffmpeg、pydub、moviepy是用來處理音視頻的,比如裁剪、格式轉換等。
aip庫則是百度官方庫,用來做語音轉文字的。
#安裝pipinstallbaidu-aip
對於xlwings這裡就不多說了,想了解的小夥伴,可以去看官方文檔。
地址:
https://docs.xlwings.org/en/stable/
下面就給大家來介紹一下吧!
首先調用xlwings模塊生成一個項目,命令如下。
#創建項目xlwingsquickstarttranscriber--standalone
這時候我們就能看到有一個項目名稱為transcriber的文件夾,這個就是作為我們項目使用的,並且可以修改為任何名字。

其中注意:
1.transcriber.py,這是帶Python代碼的文件,內容如下。
importxlwingsasxwdefmain():wb=xw.Book.caller()sheet=wb.sheets[0]ifsheet["A1"].value=="Helloxlwings!":sheet["A1"].value="Byexlwings!"else:sheet["A1"].value="Helloxlwings!"@xw.funcdefhello(name):returnf"Hello{name}!"if__name__=="__main__":xw.Book("transcriber.xlsm").set_mock_caller()main()
2.transcriber.xlsm,這是帶vba代碼的Excel文件,內容如下。

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

文件 - 更多 - 選項 - 信任中心 - 信任中心設置 - 宏設置 - 啟用所有宏。
然後安裝xlwings的Excel集成插件,安裝之前需要關閉所有Excel應用,不然會報錯。
#安裝xlwings的Excel集成插件xlwingsaddininstall
xlwings和插件都安裝好後,這時候打開Excel,會發現工具欄出現一個xlwings的菜單框,代表xlwings插件安裝成功。
它起到一個橋樑的作用,為VBA調用Python腳本牽線搭橋。

此外還需要把「開發工具」添加到功能區,因為我們要用到宏。
配置運行環境,Python執行器,Conda安裝路徑,Conda虛擬環境路徑。

最後點擊「開發工具」選項卡,點擊Visual Basic - 工具 - 引用 - 添加xlwings。
到此,環境就配置成功了。
我們先用之前創建的transcriber.xlsm文件來實驗一下,插入一個按鈕,指定宏。

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

再去修改transcriber.py文件中的代碼。
importxlwingsasxwdefmain():wb=xw.Book.caller()sheet=wb.sheets[0]ifsheet["OUTPUTCELL"].value=="Hello":sheet["OUTPUTCELL"].value="Bye"else:sheet["OUTPUTCELL"].value="Hello"@xw.funcdefhello(name):returnf"Hello{name}!"if__name__=="__main__":xw.Book("transcriber.xlsm").set_mock_caller()main()
點擊按鈕,發現信息有所變,說明可以給單元格指定名稱和輸出。

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

給音頻轉文本,生成字幕詞雲添加數據驗證,其實就是一個列表選項,可選擇是或否。

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

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

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

支持的網站還不少呢,本次就只用B站的視頻來測試。
defdownload_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)#導入視頻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}"returnaudio_file
使用moviepy庫提取視頻中的音頻,用於語音識別。
當音頻轉文本選項的內容是【是】的時候,下面代碼就派上用場了。
使用百度的短語音識別技術,需要申請使用,不想用的小夥伴直接兩個可選項選擇【否】,當做一個下載器即可。

可惜識別最長時間只能是60秒,所以需要將之前獲取的音頻進行切割。
此外還需要對音頻的採樣率進行匹配。
deftranscribe_audio_file(status_cell,audio_file,output_path):"""語音轉文字"""status_cell.value="開始處理音頻文件..."old_name=audio_filenew_name=audio_file.split('.')[0]+'_16000.wav'split_name=audio_file.split('.')[0]#對音頻進行降頻處理ffmpeg.input(old_name).output(new_name,ar=16000).run(cmd=FFMPEG_PATH)#切割音頻audio=AudioSegment.from_file(new_name,"wav")#切割的毫秒數size=30000#將文件切割為30s一塊chunks=make_chunks(audio,size)fori,chunkinenumerate(chunks):#枚舉,i是索引,chunk是切割好的文件chunk_name=split_name+"_{0}.wav".format(i)#保存文件chunk.export(chunk_name,format="wav")status_cell.value="使用百度語音接口識別音頻..."#使用百度語音接口"""你的APPIDAKSK"""APP_ID=''API_KEY=''SECRET_KEY=''client=AipSpeech(APP_ID,API_KEY,SECRET_KEY)#讀取文件defget_file_content(file_path):withopen(file_path,'rb')asfp:returnfp.read()transcription_txt=output_path+"\\transcription.txt"#識別本地文件fori,chunkinenumerate(chunks):result=client.asr(get_file_content(split_name+"_{0}.wav".format(i)),'wav',16000,{'dev_pid':1537#默認1537(普通話輸入法模型),dev_pid參數見本節開頭的表格})print(result['result'])withopen(transcription_txt,"a")asfile:file.write(result['result'][0])file.close()status_cell.value=f"音頻轉文本成功,文件保存到{transcription_txt}"returntranscription_txt
可識別普通話、英語、粵語、四川話識別。通過在請求時配置不同的dev_pid參數,選擇對應模型。
最終將音頻轉為文本,保存在一個文本文件中。
生成詞雲,這裡需要注意添加中文字體路徑,要不然詞雲圖顯示不了中文。
項目整體就如上面描述的一樣。
此時我們只需打開Excel文件,選擇是或否選項,修改B站視頻地址,點擊開始下載,即可下載視頻,以及生成詞雲圖。
無需再去運行Python文件。

成功下載到視頻,並且對音視頻進行處理,得到文本信息。

查看一下詞雲圖吧。

發現百度的語音識別有點差啊,不知道是哪裡出現了問題...
好了,本期的分享就到此結束了,有興趣的小夥伴可以自行去實踐學習。
比如製作一個彈幕分析詞雲圖,或者下載其他網站的視頻等等。
使用到的代碼及文件都已上傳,公眾號回復「視頻下載」即可獲取。
萬水千山總是情,點個👍行不行。