利用Python+Excel制作一個視頻下載器
說起Excel,那絕對是數據處理領域王者般的存在。
而作為網紅語言Python,在數據領域也是被廣泛使用。
其中Python的第三方庫-xlwings,一個Python和Excel的交互工具,可以輕松地通過VBA來調用Python腳本,實現復雜的數據分析。
今天,小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是用來處理音視頻的,比如裁剪、格式轉換等。
aip庫則是百度官方庫,用來做語音轉文字的。
# 安裝 pip install baidu-aip
對於xlwings這裡就不多說瞭,想瞭解的小夥伴,可以去看官方文檔。
地址:https://docs.xlwings.org/en/stable/
下面就給大傢來介紹一下吧!
首先調用xlwings模塊生成一個項目,命令如下。
# 創建項目 xlwings quickstart transcriber --standalone
這時候我們就能看到有一個項目名稱為transcriber的文件夾,這個就是作為我們項目使用的,並且可以修改為任何名字。
其中註意:
1. transcriber.py,這是帶Python代碼的文件,內容如下。
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文件,內容如下。
打開Excel文件,提示沒有啟用宏,所以設置一下。
文件 – 更多 – 選項 – 信任中心 – 信任中心設置 – 宏設置 – 啟用所有宏。
然後安裝xlwings的Excel集成插件,安裝之前需要關閉所有Excel應用,不然會報錯。
# 安裝xlwings的Excel集成插件 xlwings addin install
xlwings和插件都安裝好後,這時候打開Excel,會發現工具欄出現一個xlwings的菜單框,代表xlwings插件安裝成功。
它起到一個橋梁的作用,為VBA調用Python腳本牽線搭橋。
此外還需要把“開發工具”添加到功能區,因為我們要用到宏。
配置運行環境,Python執行器,Conda安裝路徑,Conda虛擬環境路徑。
最後點擊“開發工具”選項卡,點擊Visual Basic – 工具 – 引用 – 添加xlwings。
到此,環境就配置成功瞭。
我們先用之前創建的transcriber.xlsm文件來實驗一下,插入一個按鈕,指定宏。
點擊綠色的按鈕,可以看見A1單元格會有信息出現,說明啟用宏成功。
這裡我們可以把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()
點擊按鈕,發現信息有所變,說明可以給單元格指定名稱和輸出。
瞭解瞭xlwings的基本使用,我們就可以對表格進行排版佈局一波啦!
給音頻轉文本,生成字幕詞雲添加數據驗證,其實就是一個列表選項,可選擇是或否。
給音頻轉文本,生成字幕詞雲添加條件格式,選擇是或否後,展示不同的顏色,默認否(淡紅色)。
好瞭,最後修改一下各個單元格的名稱。
編寫主程序,代碼如下。
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"] # 重置狀態欄 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() # 語音轉文字 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表,不斷的更新狀態欄信息,判斷是否要運行下載、語音轉文字、生成詞雲這三個函數。
下載音視頻使用到瞭you-get庫,一鍵下載幾乎所有網站上的音視頻。
支持的網站還不少呢,本次就隻用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) # 導入視頻 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庫提取視頻中的音頻,用於語音識別。
當音頻轉文本選項的內容是【是】的時候,下面代碼就派上用場瞭。
使用百度的短語音識別技術,需要申請使用,不想用的小夥伴直接兩個可選項選擇【否】,當做一個下載器即可。
可惜識別最長時間隻能是60秒,所以需要將之前獲取的音頻進行切割。
此外還需要對音頻的采樣率進行匹配。
def transcribe_audio_file(status_cell, audio_file, output_path): """語音轉文字""" status_cell.value = "開始處理音頻文件..." old_name = audio_file new_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) 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 # 默認1537(普通話 輸入法模型),dev_pid參數見本節開頭的表格 }) print(result['result']) with open(transcription_txt, "a") as file: file.write(result['result'][0]) file.close() status_cell.value = f"音頻轉文本成功, 文件保存到 {transcription_txt}" return transcription_txt
可識別普通話、英語、粵語、四川話識別。通過在請求時配置不同的dev_pid參數,選擇對應模型。
最終將音頻轉為文本,保存在一個文本文件中。
生成詞雲,這裡需要註意添加中文字體路徑,要不然詞雲圖顯示不瞭中文。
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文件。
成功下載到視頻,並且對音視頻進行處理,得到文本信息。
查看一下詞雲圖吧。
發現百度的語音識別有點差啊,不知道是哪裡出現瞭問題…
以上就是利用Python+Excel制作一個視頻下載器的詳細內容,更多關於Python Excel視頻下載器的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 淺談Python xlwings 讀取Excel文件的正確姿勢
- 使用Python封裝excel操作指南
- Python自動化之批量處理工作簿和工作表
- 詳解Python操作Excel之openpyxl
- 教你用python提取txt文件中的特定信息並寫入Excel