利用Python+Excel制作一個(gè)視頻下載器
說起Excel,那絕對(duì)是數(shù)據(jù)處理領(lǐng)域王者般的存在。
而作為網(wǎng)紅語(yǔ)言Python,在數(shù)據(jù)領(lǐng)域也是被廣泛使用。
其中Python的第三方庫(kù)-xlwings,一個(gè)Python和Excel的交互工具,可以輕松地通過VBA來調(diào)用Python腳本,實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)分析。
今天,小F就給大家介紹一個(gè)Python+Excel的項(xiàng)目【視頻下載器】。
主要使用到下面這些Python庫(kù)。
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庫(kù)則是百度官方庫(kù),用來做語(yǔ)音轉(zhuǎn)文字的。
# 安裝 pip install baidu-aip
對(duì)于xlwings這里就不多說了,想了解的小伙伴,可以去看官方文檔。
地址:https://docs.xlwings.org/en/stable/
下面就給大家來介紹一下吧!
首先調(diào)用xlwings模塊生成一個(gè)項(xiàng)目,命令如下。
# 創(chuàng)建項(xiàng)目 xlwings quickstart transcriber --standalone
這時(shí)候我們就能看到有一個(gè)項(xiàng)目名稱為transcriber的文件夾,這個(gè)就是作為我們項(xiàng)目使用的,并且可以修改為任何名字。
其中注意:
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è)置一下。
文件 - 更多 - 選項(xiàng) - 信任中心 - 信任中心設(shè)置 - 宏設(shè)置 - 啟用所有宏。
然后安裝xlwings的Excel集成插件,安裝之前需要關(guān)閉所有Excel應(yīng)用,不然會(huì)報(bào)錯(cuò)。
# 安裝xlwings的Excel集成插件 xlwings addin install
xlwings和插件都安裝好后,這時(shí)候打開Excel,會(huì)發(fā)現(xiàn)工具欄出現(xiàn)一個(gè)xlwings的菜單框,代表xlwings插件安裝成功。
它起到一個(gè)橋梁的作用,為VBA調(diào)用Python腳本牽線搭橋。
此外還需要把“開發(fā)工具”添加到功能區(qū),因?yàn)槲覀円玫胶辍?/p>
配置運(yùn)行環(huán)境,Python執(zhí)行器,Conda安裝路徑,Conda虛擬環(huán)境路徑。
最后點(diǎn)擊“開發(fā)工具”選項(xiàng)卡,點(diǎn)擊Visual Basic - 工具 - 引用 - 添加xlwings。
到此,環(huán)境就配置成功了。
我們先用之前創(chuàng)建的transcriber.xlsm文件來實(shí)驗(yàn)一下,插入一個(gè)按鈕,指定宏。
點(diǎn)擊綠色的按鈕,可以看見A1單元格會(huì)有信息出現(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()
點(diǎn)擊按鈕,發(fā)現(xiàn)信息有所變,說明可以給單元格指定名稱和輸出。
了解了xlwings的基本使用,我們就可以對(duì)表格進(jìn)行排版布局一波啦!
給音頻轉(zhuǎn)文本,生成字幕詞云添加數(shù)據(jù)驗(yàn)證,其實(shí)就是一個(gè)列表選項(xiàng),可選擇是或否。
給音頻轉(zhuǎn)文本,生成字幕詞云添加條件格式,選擇是或否后,展示不同的顏色,默認(rèn)否(淡紅色)。
好了,最后修改一下各個(gè)單元格的名稱。
編寫主程序,代碼如下。
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 = "" # 獲取程序運(yùn)行路徑 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() # 語(yǔ)音轉(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)
使用第一個(gè)sheet表,不斷的更新狀態(tài)欄信息,判斷是否要運(yùn)行下載、語(yǔ)音轉(zhuǎn)文字、生成詞云這三個(gè)函數(shù)。
下載音視頻使用到了you-get庫(kù),一鍵下載幾乎所有網(wǎng)站上的音視頻。
支持的網(wǎng)站還不少呢,本次就只用B站的視頻來測(cè)試。
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庫(kù)提取視頻中的音頻,用于語(yǔ)音識(shí)別。
當(dāng)音頻轉(zhuǎn)文本選項(xiàng)的內(nèi)容是【是】的時(shí)候,下面代碼就派上用場(chǎng)了。
使用百度的短語(yǔ)音識(shí)別技術(shù),需要申請(qǐng)使用,不想用的小伙伴直接兩個(gè)可選項(xiàng)選擇【否】,當(dāng)做一個(gè)下載器即可。
可惜識(shí)別最長(zhǎng)時(shí)間只能是60秒,所以需要將之前獲取的音頻進(jìn)行切割。
此外還需要對(duì)音頻的采樣率進(jìn)行匹配。
def transcribe_audio_file(status_cell, audio_file, output_path): """語(yǔ)音轉(zhuǎn)文字""" status_cell.value = "開始處理音頻文件..." old_name = audio_file new_name = audio_file.split('.')[0] + '_16000.wav' split_name = audio_file.split('.')[0] # 對(duì)音頻進(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 = "使用百度語(yǔ)音接口識(shí)別音頻..." # 使用百度語(yǔ)音接口 """ 你的 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" # 識(shí)別本地文件 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
可識(shí)別普通話、英語(yǔ)、粵語(yǔ)、四川話識(shí)別。通過在請(qǐng)求時(shí)配置不同的dev_pid參數(shù),選擇對(duì)應(yīng)模型。
最終將音頻轉(zhuǎn)為文本,保存在一個(gè)文本文件中。
生成詞云,這里需要注意添加中文字體路徑,要不然詞云圖顯示不了中文。
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 = "生成詞云圖"
項(xiàng)目整體就如上面描述的一樣。
此時(shí)我們只需打開Excel文件,選擇是或否選項(xiàng),修改B站視頻地址,點(diǎn)擊開始下載,即可下載視頻,以及生成詞云圖。
無需再去運(yùn)行Python文件。
成功下載到視頻,并且對(duì)音視頻進(jìn)行處理,得到文本信息。
查看一下詞云圖吧。
發(fā)現(xiàn)百度的語(yǔ)音識(shí)別有點(diǎn)差啊,不知道是哪里出現(xiàn)了問題...
以上就是利用Python+Excel制作一個(gè)視頻下載器的詳細(xì)內(nèi)容,更多關(guān)于Python Excel視頻下載器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python基于回溯法子集樹模板實(shí)現(xiàn)8皇后問題
這篇文章主要介紹了Python基于回溯法子集樹模板實(shí)現(xiàn)8皇后問題,簡(jiǎn)單說明了8皇后問題的原理并結(jié)合實(shí)例形式分析了Python回溯法子集樹模板解決8皇后問題的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09python3安裝及pip3報(bào)ERROR:No?matching?distribution?found?for解
這篇文章主要給大家介紹了關(guān)于python3安裝及pip3報(bào)ERROR:No?matching?distribution?found?for解決的相關(guān)資料,文中通過代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08基于Python制作一個(gè)多進(jìn)制轉(zhuǎn)換工具
這篇文章主要介紹了如何利用Python制作一個(gè)多進(jìn)制轉(zhuǎn)換工具,可以實(shí)現(xiàn)2進(jìn)制、4進(jìn)制、8進(jìn)制、10進(jìn)制、16進(jìn)制、32進(jìn)制直接的互轉(zhuǎn),需要的可以參考一下2022-02-02Windows下實(shí)現(xiàn)pytorch環(huán)境搭建
這篇文章主要介紹了Windows下實(shí)現(xiàn)pytorch環(huán)境搭建,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04基于Python實(shí)現(xiàn)語(yǔ)音合成小工具
TTS(Text To Speech)是一種語(yǔ)音合成技術(shù),可以讓機(jī)器將輸入文本以語(yǔ)音的方式播放出來,實(shí)現(xiàn)機(jī)器說話的效果。本文將使用pyttsx3庫(kù)作為示范,編寫一個(gè)語(yǔ)音合成小工具,感興趣的可以了解一下2022-12-12