close

大家好,我是小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參數,選擇對應模型。

最終將音頻轉為文本,保存在一個文本文件中。

生成詞雲,這裡需要注意添加中文字體路徑,要不然詞雲圖顯示不了中文。


defgenerate_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文件。

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

查看一下詞雲圖吧。

發現百度的語音識別有點差啊,不知道是哪裡出現了問題...

好了,本期的分享就到此結束了,有興趣的小夥伴可以自行去實踐學習。

比如製作一個彈幕分析詞雲圖,或者下載其他網站的視頻等等。

使用到的代碼及文件都已上傳,公眾號回復「視頻下載」即可獲取。

萬水千山總是情,點個👍行不行。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()