利用Python+Excel制作一个视频下载器

 更新时间:2022年05月30日 08:35:26   作者:小F  
说起Excel,那绝对是数据处理领域王者般的存在。而作为网红语言Python,在数据领域也是被广泛使用。本文将利用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视频下载器的资料请关注脚本之家其它相关文章!

相关文章

  • Python基于回溯法子集树模板实现8皇后问题

    Python基于回溯法子集树模板实现8皇后问题

    这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下
    2017-09-09
  • Python绘制雷达图时遇到的坑的解决

    Python绘制雷达图时遇到的坑的解决

    这篇文章主要介绍了Python绘制雷达图时遇到的坑的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • python常用小脚本实例总结

    python常用小脚本实例总结

    在日常的工作中我们总会面临到各式各样的问题,下面这篇文章主要给大家介绍了关于python常用小脚本的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • python字符串排序方法

    python字符串排序方法

    这篇文章主要介绍了python字符串排序方法,基于lambda实现,是非常实用的技巧,需要的朋友可以参考下
    2014-08-08
  • python3安装及pip3报ERROR:No matching distribution found for解决方法

    python3安装及pip3报ERROR:No matching distribution found for解

    这篇文章主要给大家介绍了关于python3安装及pip3报ERROR:No matching distribution found for解决的相关资料,文中通过代码以及图文介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • 基于Python制作一个多进制转换工具

    基于Python制作一个多进制转换工具

    这篇文章主要介绍了如何利用Python制作一个多进制转换工具,可以实现2进制、4进制、8进制、10进制、16进制、32进制直接的互转,需要的可以参考一下
    2022-02-02
  • Python中的并发编程实例

    Python中的并发编程实例

    这篇文章主要介绍了Python中的并发编程实例,主要是对Threading模块的应用,文中自定义了一个Threading类库,需要的朋友可以参考下
    2014-07-07
  • Windows下实现pytorch环境搭建

    Windows下实现pytorch环境搭建

    这篇文章主要介绍了Windows下实现pytorch环境搭建,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 解决python3 pika之连接断开的问题

    解决python3 pika之连接断开的问题

    今天小编就为大家分享一篇解决python3 pika之连接断开的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 基于Python实现语音合成小工具

    基于Python实现语音合成小工具

    TTS(Text To Speech)是一种语音合成技术,可以让机器将输入文本以语音的方式播放出来,实现机器说话的效果。本文将使用pyttsx3库作为示范,编写一个语音合成小工具,感兴趣的可以了解一下
    2022-12-12

最新评论