python实现视频转文字

2023-05-16

最近在做视频转文本的工作,遇到了不少问题,记录一下。
本博客包括以下内容:
1.如何将视频转换成音频
2.如何调用科大讯飞API实现音频转文字
首先,视频转文本,如果调用科大讯飞API的话,那么是需要先将视频提取成音频,这里很简单,python几行代码就可以搞定。

from moviepy.editor import AudioFileClip

my=AudioFileClip("myvideo.mp4") # 你的视频地址
my.write_audiofile("my.mp3") # 设置生成的音频

安装moviepy即可,建议使用conda。运行没问题那么恭喜你!

如果出现和我类似的问题,请看下文:
问题1
网上这个问题似乎很少,出现这个问题,建议先检查自己的anaconda是否曾多次安装,但之前的环境变量没有更改。
其次,检查自己的环境变量是否如下,少了就添加在这里插入图片描述
如果还是有问题,打开anaconda prompt,将numpy重新卸载安装,可能是numpy版本冲突了。

conda uninstall numpy
conda install numpy

再去运行一下,会发现之前no module named "numpy.typing"没有了。如果你运气好,到这一步就会成功生成音频文件。不得不说,有时候改bug就是玄学。
另外,如果是刚入坑的同学,切记环境变量不要写中文,否则很多包调用的时候都会出问题。
成功以后:此时正在转换中
转换成功之后
接着我们可以看到已经生成了完整的音频文件请添加图片描述
完成视频转音频,那就可以继续转文字。记得去注册一个科大讯飞的账号,可以免费使用一小段时间。
科大讯飞:科大讯飞
![请添加图片描述](https://img-blog.csdnimg.cn/80ae785ad73d44a6a3c796de286e6154.png
申请成功以后复制自己的id和secret即可。

# -*- coding: utf-8 -*-

import base64
import hashlib
import hmac
import json
import os
import time
import re
import requests
from moviepy.editor import AudioFileClip

my=AudioFileClip("myvideo.mp4")
my.write_audiofile("my.mp3")

lfasr_host = 'http://raasr.xfyun.cn/api'

api_prepare = '/prepare'
api_upload = '/upload'
api_merge = '/merge'
api_get_progress = '/getProgress'
api_get_result = '/getResult'
file_piece_sice = 10485760

lfasr_type = 0
has_participle = 'false'
has_seperate = 'true'
max_alternatives = 0
suid = ''


class SliceIdGenerator:
    """slice id生成器"""

    def __init__(self):
        self.__ch = 'aaaaaaaaa`'

    def getNextSliceId(self):
        ch = self.__ch
        j = len(ch) - 1
        while j >= 0:
            cj = ch[j]
            if cj != 'z':
                ch = ch[:j] + chr(ord(cj) + 1) + ch[j + 1:]
                break
            else:
                ch = ch[:j] + 'a' + ch[j + 1:]
                j = j - 1
        self.__ch = ch
        return self.__ch


class RequestApi(object):
    def __init__(self, appid, secret_key, upload_file_path):
        self.appid = appid
        self.secret_key = secret_key
        self.upload_file_path = upload_file_path

    def gene_params(self, apiname, taskid=None, slice_id=None):
        appid = self.appid
        secret_key = self.secret_key
        upload_file_path = self.upload_file_path
        ts = str(int(time.time()))
        m2 = hashlib.md5()
        m2.update((appid + ts).encode('utf-8'))
        md5 = m2.hexdigest()
        md5 = bytes(md5, encoding='utf-8')
        
        signa = hmac.new(secret_key.encode('utf-8'), md5, hashlib.sha1).digest()
        signa = base64.b64encode(signa)
        signa = str(signa, 'utf-8')
        file_len = os.path.getsize(upload_file_path)
        file_name = os.path.basename(upload_file_path)
        param_dict = {}

        if apiname == api_prepare:
            slice_num = int(file_len / file_piece_sice) + (0 if (file_len % file_piece_sice == 0) else 1)
            param_dict['app_id'] = appid
            param_dict['signa'] = signa
            param_dict['ts'] = ts
            param_dict['file_len'] = str(file_len)
            param_dict['file_name'] = file_name
            param_dict['slice_num'] = str(slice_num)
        elif apiname == api_upload:
            param_dict['app_id'] = appid
            param_dict['signa'] = signa
            param_dict['ts'] = ts
            param_dict['task_id'] = taskid
            param_dict['slice_id'] = slice_id
        elif apiname == api_merge:
            param_dict['app_id'] = appid
            param_dict['signa'] = signa
            param_dict['ts'] = ts
            param_dict['task_id'] = taskid
            param_dict['file_name'] = file_name
        elif apiname == api_get_progress or apiname == api_get_result:
            param_dict['app_id'] = appid
            param_dict['signa'] = signa
            param_dict['ts'] = ts
            param_dict['task_id'] = taskid
        return param_dict

    def gene_request(self, apiname, data, files=None, headers=None):
        response = requests.post(lfasr_host + apiname, data=data, files=files, headers=headers)
        result = json.loads(response.text)
        if result["ok"] == 0:
            if apiname=='/getResult':
                results=re.findall(r"\"onebest\":\"(.+?)\",",result['data'])
                print(results)
                upload_file_path = self.upload_file_path
                with open(str(upload_file_path)+".txt", "a", encoding='utf-8') as f:
                    for i in results:
                        f.write(i)
            print("{} success:".format(apiname) + str(result))
            return result
        else:
            print("{} error:".format(apiname) + str(result))
            exit(0)
            return result

    def prepare_request(self):
        return self.gene_request(apiname=api_prepare,
                                 data=self.gene_params(api_prepare))

    def upload_request(self, taskid, upload_file_path):
        file_object = open(upload_file_path, 'rb')
        try:
            index = 1
            sig = SliceIdGenerator()
            while True:
                content = file_object.read(file_piece_sice)
                if not content or len(content) == 0:
                    break
                files = {
                    "filename": self.gene_params(api_upload).get("slice_id"),
                    "content": content
                }
                response = self.gene_request(api_upload,
                                             data=self.gene_params(api_upload, taskid=taskid,
                                                                   slice_id=sig.getNextSliceId()),
                                             files=files)
                if response.get('ok') != 0:
                    print('upload slice fail, response: ' + str(response))
                    return False
                print('upload slice ' + str(index) + ' success')
                index += 1
        finally:
            'file index:' + str(file_object.tell())
            file_object.close()
        return True

    def merge_request(self, taskid):
        return self.gene_request(api_merge, data=self.gene_params(api_merge, taskid=taskid))

    def get_progress_request(self, taskid):
        return self.gene_request(api_get_progress, data=self.gene_params(api_get_progress, taskid=taskid))

    def get_result_request(self, taskid):
        return self.gene_request(api_get_result, data=self.gene_params(api_get_result, taskid=taskid))

    def all_api_request(self):
        pre_result = self.prepare_request()
        taskid = pre_result["data"]
        self.upload_request(taskid=taskid, upload_file_path=self.upload_file_path)
        self.merge_request(taskid=taskid)
        while True:
            progress = self.get_progress_request(taskid)
            progress_dic = progress
            if progress_dic['err_no'] != 0 and progress_dic['err_no'] != 26605:
                print('task error: ' + progress_dic['failed'])
                return
            else:
                data = progress_dic['data']
                task_status = json.loads(data)
                if task_status['status'] == 9:
                    print('task ' + taskid + ' finished')
                    break
                print('The task ' + taskid + ' is in processing, task status: ' + str(data))
            time.sleep(20)
        self.get_result_request(taskid=taskid)
        
if __name__ == '__main__':
	# 这里记得输入自己的id和key
    api = RequestApi(appid="***", secret_key="***", upload_file_path=r"my.mp3")
    api.all_api_request()

成功后:请添加图片描述
生成的txt文件
请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python实现视频转文字 的相关文章

随机推荐

  • day65 JavaWeb框架阶段——全文检索技术Lucene(非结构化数据查询方法,中文分析器IKAnalyzer)

    1 今日内容 什么是全文检索 xff0c 如何实现全文检索Lucene实现全文检索的流程 a 创建索引 b 查询索引配置开发环境入门程序分析器的分析过程 a 测试分析器的分词效果 b 第三方中文分析器索引库维护 a 添加文档 b 删除文档
  • 【已解决】阿里云配置安全组后,仍无法访问端口问题

    文章首发于如下链接 xff1a http 80sdianying xyz id 61 8 最近在搭python的falsk服务器 xff0c 遇到一个问题 xff0c 在服务器运行python程序后 xff0c 外网无法访问到该程序 xff
  • ubuntu 14.04 软件中心闪退解决方案

    ubuntu 14 04 软件中心闪退解决方案 参考文章 xff1a xff08 1 xff09 ubuntu 14 04 软件中心闪退解决方案 xff08 2 xff09 https www cnblogs com lvchaoshun
  • “No X11 DISPLAY variable was set”问题的解决过程

    No X11 DISPLAY variable was set 问题的解决过程 参考文章 xff1a xff08 1 xff09 No X11 DISPLAY variable was set 问题的解决过程 xff08 2 xff09 h
  • postgreSql查询复杂json数组字段

    因为在生产环境中使用到两次 故而记录一下对复杂json字段提取字段值的SQL 先看数据格式 xff1a 假设表名为 ry xff1b 下面的数据格式是我们的字段ryxx 34 bh 34 34 123 34 34 jbxx 34 34 xm
  • VS调用大恒相机sdk实时显示图像并进行图像处理+OPENCV

    前言 xff1a 近期企业需要用大恒相机的sdk开发项目 xff0c 我采用VS2017 43 QT5 10 1 43 MSVC 一 环境配置 VS2017和qt的安装不多介绍 xff0c 主要介绍大恒sdk的配置 1 https www
  • 元学习 每日学习之路

    参考视频 2 21 元学习 xff1a 学会如何去学习 xff0c 就是带着这种对人类这种 学习能力 的期望诞生的 Meta Learning希望使得模型获取一种 学会学习 的能力 xff0c 使其可以在获取已有 知识 的基础上快速学习新的
  • 笔记本电脑连接WIFI速度很慢-解决办法 亲测有效【5MB/S直达10MB/S】

    电脑连接WIFI 经常发生连续断网 xff0c 或者家里的网明明是100M 但是连接电脑WIFI 却连50M都不到 于是在网上查了很多资料 xff0c 网上大多的方法 我讲两个 xff1a 一 用电脑管家 xff0c 360 xff0c 鲁
  • react-native 调用Settings.Secure.getstring获取了android_id / app上架违规获取android_id被拒

    华为上架时 被违规获取android id原因拒绝上架 使用HookLoginDemo检测结果如下 span class token number 2022 span span class token operator span span
  • Linux——网络桥接

    什么是网络桥接 xff1f 在网络的使用中 xff0c 有时需要搭建网络桥来实现网络桥接 例如在一台主机上制作一台虚拟机 xff0c 虚拟机是没有物理网卡的 xff0c 这时虚拟机数据的发送和接收就需要通过主机上的物理网卡 xff0c 需要
  • STM32实战之LED循环点亮

    接着上一章讲 本章我们来讲一讲LED流水灯 xff0c 循环点亮LED 在LED章节有的可能没有讲到 xff0c 本章会对其进行说明 xff0c 尽量每个函数说一下作用 也会在最后说一下STM32的寄存器 xff0c 在编程中寄存器是避免不
  • 远程连接桌面到ubuntu登录闪退

    问题 xff1a 远程连接到Ubuntu的时候登录闪退 xff0c 密码正确 xff0c 且之前在本地登录过没有问题 xff0c ssh登录没有问题 原因 xff1a 就是因为之前在本地登录了没有登出 xff0c 只是锁屏了 xff0c 导
  • CSRF跨站请求伪造漏洞修复

    文章目录 一 漏洞描述二 解决建议二 解决方法Springboot 配置文件增加配置编写配置类编写过滤器 提示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供参考 一 漏洞描述 跨站请求伪造 xff08 Cross site
  • Linux挂载磁盘(扩容)

    磁盘相关介绍 xff1a fdisk l 查看磁盘占用情况 sda xff1a 代表一个磁盘 s SCSI d 磁盘 a 代表挂在在SCSI类型的硬盘的第一块 Linux文件系统 xff1a 都是用文件 形式描述的 SCSI xff1a 用
  • 动规例题C++代码

    动规题目 xff1a 字符串S由小写字母构成 xff0c 长度为n 定义一种操作 xff0c 每次都可以挑选字符串中任意的两个相邻字母进行交换 询问在至多交换m次之后 xff0c 字符串中最多有多少个连续的位置上的字母相同 xff1f 参考
  • Centos7下Samba服务器配置

    环境 vm下centos7 6 xff0c IP地址 xff1a 192 168 139 200 Samba概述 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件 xff0c 由服务器及客户端程序构成 SMB xff08
  • iOS 自定义tableView Cell、高度自适应

    1 xib方式创建 每个cell的显示的内容都是固定的 xff0c 也就是cell的高度都是相同的 加载数据 有plist文件数据结构如下 创建数据模型 Product span class token punctuation span h
  • Windows7修改socket默认缓冲区大小

    在工作中 xff0c 遇到游戏服通过UDP协议向日志服发送日志时 xff0c 日志服有时无法识别游戏服发送过来的日志消息 通过抓包发现 xff0c Windows收到的数据包大小 xff0c 比实例的数据包小 猜测是Windows sock
  • Windows10 上安装 Anaconda 后命令提示符(cmd)下无法执行python命令解决方案

    安装Anaconda后一段时间内能够在命令提示符 xff08 cmd xff09 界面运行python会进入python的交互界面 xff01 可是一段时间后突然间后突然运行不通过报错如图一所示 然后我们找到路径 C Program Fil
  • python实现视频转文字

    最近在做视频转文本的工作 xff0c 遇到了不少问题 xff0c 记录一下 本博客包括以下内容 xff1a 1 如何将视频转换成音频 2 如何调用科大讯飞API实现音频转文字 首先 xff0c 视频转文本 xff0c 如果调用科大讯飞API