python+moviepy音视频处理(二):视频添加文字(字幕)、视频添加汉字不显示问题

本文介绍如何使用moviepy处理视频,包括解决文字报错、中文显示问题,并提供添加滚动文字的代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

添加文字报错处理

中文不显示处理

代码实例

给视频添加滚动文字(一)

给视频添加滚动文字(二)


添加文字报错处理

报错内容:OSError: MoviePy Error: creation of None failed because of the following error:
[WinError 2] 系统找不到指定的文件。.
.This error can be due to the fact that ImageMagick is not installed on your computer, or (for Windows users) that you didn't specify the path to the ImageMagick binary in file conf.py, or that the path you specified is incorrect.

报错原因:moviepy处理视频使用的是 ffmpeg,生成文字使用的是 ImageMagick。Windows系统在执行 editor.TextClip() 的时候,会报出如上错误,原因是由于电脑上缺少ImageMagick造成的。
处理方法:需要去官网下载对应操作系统的ImageMagick。下载地址:http://www.imagemagick.org/script/download.php,由于是外网,下载速度比较慢。下载完成并安装到指定位置,然后修改site-packages\moviepy\config_defaults.py,在文件的尾部有如下内容:

import os

FFMPEG_BINARY = os.getenv('FFMPEG_BINARY', 'ffmpeg-imageio')
IMAGEMAGICK_BINARY = os.getenv('IMAGEMAGICK_BINARY', 'auto-detect')

# 把 `IMAGEMAGICK_BINARY = ` 后面的内容
# 换成 ImageMagick 安装路径下 magick.exe 的绝对路径,如下:

import os

FFMPEG_BINARY = os.getenv('FFMPEG_BINARY', 'ffmpeg-imageio')
IMAGEMAGICK_BINARY = r"C:\Program Files\ImageMagick-7.1.0-Q16\magick.exe"

中文不显示处理

moviepy对中文和多语言环境的支持做得并不好,包括中文文件名以及用于显示文字的TextClip就是典型的中文支持方面存在问题的。对于编解码的问题,可以通过修改解码语句中的编码类型为’asn’或‘cp936’等方式解决,对于文字显示的处理,稍微麻烦。解决办法:找到对应中文字库,将其字库文件拷贝到代码所在目录,将TextClip的参数font不用字体名,而是用字体文件名。字体库位置:C:\Windows\Fonts,鼠标右击字体文件,找到属性中安全下的对象名称,将对象名称复制下来作为font的值。

代码实例

from moviepy.editor import VideoFileClip
from moviepy import editor

clip = VideoFileClip('video.mp4')
text = '''
红笺小字。
说尽平生意。
鸿雁在云鱼在水。
惆怅此情难寄。

斜阳独倚西楼。
遥山恰对帘钩。
人面不知何处,
绿波依旧东流。
'''
text_clip = editor.TextClip(text, font=r'./font/STKAITI.TTF', fontsize=30, color='blue', bg_color='white', transparent=True)
"""
set_position:設置文字顯示位置【屏幕左上角为(0, 0),右下角为(屏幕宽度, 屏幕高度)】
    1、set_position((800, 500)): 显示在800, 500的位置上
    2、set_position(("center", "center")): 显示在屏幕的正中央
    3、set_position((0.4, 0.6), True): 显示在距离左边百分之40、距离上边百分之60的位置上
set_duration(10): 持续10秒
set_opacity(0.6): 设置透明度为0.6
set_start(5):设置开始显示的时间点
set_end(10):设置结束的时间点

"""
text_clip = text_clip.set_position(("center", "center")).set_duration(20).set_opacity(0.8)

video_clip = editor.CompositeVideoClip([clip, text_clip])  # 把文本剪贴板贴在视频上

video_clip.write_videofile("demo1.mp4")  # 保存視頻

给视频添加滚动文字(一)

from moviepy.editor import VideoFileClip, vfx
from moviepy import editor

demo_video = VideoFileClip('video.mp4')

text = '''
红笺小字。
说尽平生意。
鸿雁在云鱼在水。
惆怅此情难寄。

斜阳独倚西楼。
遥山恰对帘钩。
人面不知何处,
绿波依旧东流。
'''

text_clip = editor.TextClip(text * 4, font=r'./font/STKAITI.TTF', fontsize=20, color="red").set_position(
    ('center', 0)).set_duration(20).set_opacity(0.8).set_start(5).set_end(25)  # 可以直接使用链式操作

w, h = demo_video.size

x_speed = x_start = y_start = 0
y_speed = 20
text_clip = text_clip.fx(vfx.scroll, w, h, x_speed, y_speed, x_start, y_start)

video_clip = editor.CompositeVideoClip([demo_video, text_clip])
video_clip.write_videofile('demo_video01.mp4')

给视频添加滚动文字(二)

from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip

# 同畫面中合併視頻,視頻顯示位置設置或屏幕中文本字幕顯示位置set_pos('center')、set_pos((45,150)),見http://doc.moviepy.com.cn/index.html#中的剪輯定位
## 1、添加文字
clip = VideoFileClip('video.mp4')
text = '其形也,翩若惊鸿,婉若游龙。\n荣曜秋菊,华茂春松。\n髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。\n远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。\n秾纤得衷,修短合度。肩若削成,腰如约素。\n延颈秀项,皓质呈露。芳泽无加,铅华弗御。\n云髻峨峨,修眉联娟。丹唇外朗,皓齿内鲜,明眸善睐,靥辅承权。\n瑰姿艳逸,仪静体闲。柔情绰态,媚于语言。奇服旷世,骨像应图。\n披罗衣之璀粲兮,珥瑶碧之华琚。戴金翠之首饰,缀明珠以耀躯。\n践远游之文履,曳雾绡之轻裾。微幽兰之芳蔼兮,步踟蹰于山隅。'

txt_clip = TextClip(txt=text, fontsize=20, color='red', font=r'./font/STKAITI.TTF')

txt_clip = txt_clip.set_pos(lambda t: ('center', -100 + t * 20)).set_duration(25)  # 設置一個隨時間變化自動移動的動態字幕

video = CompositeVideoClip([clip, txt_clip])  # 将文本剪辑覆盖在第一个视频剪辑上

video.write_videofile('demo2023.mp4')

补充(视频属性判断)

clip = VideoFileClip('video.mp4')

# 是否作为遮罩使用
print(clip.ismask)  

# 帧的构建方法,通过构造方法传入或set_make_frame方法设置,帧的构建方法用于根据时间构建帧,该方法是get_frame获取帧时调用的方法。帧的构建可以从已有剪辑中获取或变换,也可以代码自己填充
print(clip.make_frame)  

# 当一个视频帧有遮罩时,使用该属性记录遮罩的剪辑。如果为None,则视频剪辑完全不透明。可以通过add_mask、set_opacity等方法来构建剪辑的遮罩,也可以通过set_mask来将已有的剪辑设置为视频剪辑的遮罩
print(clip.mask)

# aspect_ratio属性为剪辑的纵横比,实际上就是剪辑的宽/高。注意该属性为浮点数,只读,通过属性名访问
print(clip.aspect_ratio)
<think>嗯,用户想用Python通过语音识别提取抖音视频文字,整理成文本。首先,我得理清楚整个流程需要哪些步骤。可能需要先下载抖音视频,然后提取音频,再进行语音转文字过下载抖音视频可能涉及到版权问题,得提醒用户注意这一点。 接下来,下载视频的话,可能需要用requests或者专门的库,比如youtube-dl,但抖音可能有反爬措施,可能需要模拟浏览器或者使用API。过用户可能没有权限,所以可能需要找其他方法,比如解析视频链接。但这里可能会有困难,可能需要第三方库或者工具,比如TikTokApi,但确定是否稳定。 然后是提取音频,下载好的视频文件可以用moviepy库来处理,把视频中的音频提取出来保存为mp3或者wav文件。这一步应该没问题moviepy的文档比较清楚。 接下来是语音识别,常用的库有SpeechRecognition,它支持多种引擎,比如Google的,还有Whisper,准确率可能更高。特别是Whisper,需要安装OpenAI的whisper库,但可能需要配置环境,比如PyTorch。另外,如果音频较长,可能需要分割处理,避免内存问题。 用户可能遇到的问题包括:下载抖音视频的权限,音频质量影响识别准确率,长音频处理,以及依赖库的安装。需要一步步引导,先安装必要的库,再分步骤实现代码。 还要考虑代码的可行性,比如下载视频的部分可能需要用户自己处理,或者给出示例代码,但需要注意法律问题。可能建议用户先下载好视频,或者使用合法的途径获取视频内容。 最后,整理文本可能需要后处理,比如分段、标点添加,或者使用自然语言处理库来优化结果。过这可能超出当前问题的范围,但可以提到作为后续优化方向。 总结步骤应该是:下载视频→提取音频→语音识别→输出文本。每个步骤给出代码示例,并提醒可能的问题和注意事项。同时强调版权问题,确保用户合法使用。</think>我将分步骤为您讲解如何用Python实现抖音视频语音转文字,并提供详细代码示例: 一、实现流程概览 1. 视频下载 → 2. 音频提取 → 3. 语音识别 → 4. 文本输出 、准备工作(需先安装依赖库) ```bash pip install moviepy SpeechRecognition pydub openai-whisper requests ``` 三、完整实现代码(分步骤说明) 1. 视频下载(需先获取合法授权) ```python import requests def download_video(url, save_path): headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get(url, headers=headers) with open(save_path, 'wb') as f: f.write(response.content) # 使用示例(需替换真实地址) video_url = "https://example.com/douyin-video.mp4" download_video(video_url, "temp_video.mp4") ``` 2. 提取音频(使用moviepy库) ```python from moviepy.editor import VideoFileClip def extract_audio(video_path, audio_path): video = VideoFileClip(video_path) audio = video.audio audio.write_audiofile(audio_path) audio.close() video.close() extract_audio("temp_video.mp4", "temp_audio.wav") ``` 3. 语音识别(推荐两种方案) 方案一:使用Whisper(高精度) ```python import whisper def transcribe_whisper(audio_path): model = whisper.load_model("base") # 可选 tiny, base, small, medium, large result = model.transcribe(audio_path) return result["text"] text = transcribe_whisper("temp_audio.wav") ``` 方案:使用SpeechRecognition(快速) ```python import speech_recognition as sr def transcribe_sr(audio_path): recognizer = sr.Recognizer() with sr.AudioFile(audio_path) as source: audio = recognizer.record(source) return recognizer.recognize_google(audio, language='zh-CN') text = transcribe_sr("temp_audio.wav") ``` 四、输出结果 ```python with open("output.txt", "w", encoding="utf-8") as f: f.write(text) ``` 五、关键注意事项 1. 法律合规:需确保已获得视频版权方授权 2. 环境要求:Whisper需要Python 3.8+和至少4GB内存 3. 精度优化: - 使用更大的Whisper模型(medium/large)提升准确率 - 对含背景音乐的视频需先进行人声分离 4. 长视频处理:建议分段处理(可用pydub分割音频) 六、扩展建议 1. 添加自动标点:使用NLP库补充标点符号 2. 集成字幕生成:将文本与时间轴对齐 3. 部署服务:使用Flask/Django搭建API服务 完整代码执行流程: 视频下载 → 音频提取 →(选择识别引擎)→ 文本输出 → 结果保存 请根据实际需求调整参数,建议优先使用Whisper方案获取更准确的中文识别结果。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值