做一个一键生成抖音上百万播放量的微信对话视频?

查看 224|回复 16
作者:buyaobushuo   
1月3日更新:
弄了一晚上终于打包好了,下载地址
[color=]https://github.com/cuifengcn/wechat-video-generate/releases/tag/v0.1
但还是存在一些问题:
1. 文件太大超过蓝奏云100M限制,所以放github了
2. 解压后的大小超过了1G,其中pytorch占800M,playwright占300M
3. 由于某个未知的bug,控制台没有隐藏
感兴趣的小伙伴可以帮忙优化一下,比如把ocr识别改成tesseract,压缩一下打包文件大小。
----分割线----
相信大家有在抖音或视频号刷到过这样的视频


1.png (249.5 KB, 下载次数: 0)
下载附件
2023-1-2 18:42 上传

这样由微信对话合成的视频,因为内容有趣,很多人都喜欢看,播放量都是很恐怖的。
做这样的视频也很赚钱,某位大v的收益


2.png (126.38 KB, 下载次数: 0)
下载附件
2023-1-2 18:43 上传

原理就是利用巨大的播放量,添加商品推广链接,有人通过链接购买商品,你赚取佣金​。
制作这样的视频,一般做法是:
1. 去网上找对话素材
2. 找一个模拟微信对话的工具
3. 使用对话模拟器生成图片
4. 对图片进行剪辑,生成视频
这样下来几个步骤其实挺麻烦的,并且制作每个视频其实都属于是重复劳作。
所以我们今天,教大家制作一个一键生成`微信对话视频`的工具,让你能够省时省力,抢占先机!
### 先看成品


3.png (144.07 KB, 下载次数: 0)
下载附件
2023-1-2 18:44 上传

只需要在界面点点点就能生成视频了,很方便有木有!
### 技术原理
用到的技术有
1. 爬虫——从百度爬取图片
2. ocr识别——识别图片文字
3. 模拟微信对话工具
4. server服务
5. playwright自动化操作
6. 图片处理
7. 音频处理
8. 视频处理
9. 桌面gui
### 思路
1. 根据关键字在百度图片批量下载数据
2. 使用ocr识别图片中的文字
3. 分析文字的位置,区分左右对话
4. ocr精度有限,手工校对文字
5. 启动一个模拟微信对话服务
6. 进行自动化操作,将结果进行截图
7. 将截图、音频进行合成视频
### 根据关键字在百度图片批量下载数据
我们从`https://image.baidu.com/search`搜索图片,提取出每张图片的地址,然后进行下载,主要代码如下(代码为主要部分代码)
[Python] 纯文本查看 复制代码url = (
    "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj"
    "&ct=201326592&is=&fp=result&queryWord=%s&cl=2&lm=-1&ie=utf-8&oe=utf-8"
    "&adpicid=&st=-1&z=&ic=&hd=&latest=©right=&word=%s&s=&se=&tab=&width=&height=&face=0"
    "&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=%s&rn=%d&gsm=1e&1594447993172="
    % (search, search, str(pn), self.__per_page)
)
# 设置header防403
try:
    time.sleep(self.time_sleep)
    req = urllib.request.Request(url=url, headers=self.headers)
    page = urllib.request.urlopen(req)
    self.headers["Cookie"] = self.handle_baidu_cookie(
        self.headers["Cookie"], page.info().get_all("Set-Cookie")
    )
    rsp = page.read()
    page.close()
except UnicodeDecodeError as e:
    self.logger.error(e)
    self.logger.error("-----UnicodeDecodeErrorurl:", url)
### 使用ocr识别图片中的文字
使用`cnocr`库,我们就能实现本地ocr识别,而不需要网络,代码如下
[Python] 纯文本查看 复制代码self.model = CnOcr(
            det_model_name="ch_PP-OCRv3_det",
        )
out = self.model.ocr(
    cv2.imdecode(self.read_file(f), -1),
)
for i in out:
    i["score"] = float(i["score"])
    i["position"] = i["position"].astype(float).tolist()
    target_path.joinpath(file_name + ".json").write_text(
        json.dumps(out, ensure_ascii=False, indent=4)
    )
### 分析文字的位置,区分左右对话
我们基于文字的内容和位置,判断文字是属于
* 标题——距离顶部的位置[Python] 纯文本查看 复制代码res = []
"""去掉标题栏"""
if json_content and "中国" in json_content[0]["text"]:
    # 中国联通行,去掉
    x = json_content[0]["position"][0][0]
    for i in range(1, len(json_content)):
        if abs(json_content["position"][0][0] - x)  0
        and abs(
            json_content["position"][0][1]
            - json_content[i - 1]["position"][0][1]
        )
        
当然了,判断无法百分百正确,所以我们后续添加了手工修正
### ocr精度有限,手工校对文字
基于flet库, 实现了ui界面


4.png (97.48 KB, 下载次数: 0)
下载附件
2023-1-2 18:46 上传

### 启动一个模拟微信对话服务
我们启动了一个fastapi服务,用于调用模拟微信对话
[Python] 纯文本查看 复制代码app = FastAPI()
app.mount(
    "/static",
    StaticFiles(directory=MAIN_PATH.joinpath("weixin_chat", "static")),
    name="static",
)
@app.route("/")
def index(*args, **kwargs):
    return HTMLResponse(
        MAIN_PATH.joinpath(
            "weixin_chat",
            "index.html",
        ).read_text(encoding="utf-8")
    )
### 进行自动化操作,将结果进行截图
使用`playwright`库,打开浏览器,自动化进行操作,输入每条对话内容后,进行截图,保存到本地。
[Python] 纯文本查看 复制代码browser = playwright.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
page.goto("http://127.0.0.1:36999")
page.wait_for_load_state()
"""生成标题"""
if formatted_jsons[0]["position"] == "title":
    page.fill(title, formatted_jsons[0]["text"])
    formatted_jsons = formatted_jsons[1:]
else:
    titles = ["佳佳", "小小", "♥", "❀", "啊呜", "奔波儿灞与灞波儿奔", "亲亲"]
    page.fill(title, random.choice(titles))
time.sleep(0.2)
"""跳转到对话页"""
page.click(
    "#vueApp > div > div.edit-content > div.tab > ul > li:nth-child(2) > a"
)
time.sleep(0.2)
page.wait_for_selector(
    "#tabContent2 > div > div.dialog-user-items > div:nth-child(1) > div > a.dialog-user-face-a > input[type=file]"
)
"""清空对话"""
page.on("dialog", lambda dialog: dialog.accept())
page.click(clear_conv)
time.sleep(0.2)
"""选取头像"""
photos = self.two_random_photo()
page.set_input_files(my_photo, photos[0])
time.sleep(0.2)
page.set_input_files(second_photo, photos[1])
time.sleep(0.2)
_uuid = "".join(
    re.compile(r"[0-9a-zA-Z\u4e00-\u9fa5]*").findall(
        "".join(map(lambda e: e["text"], formatted_jsons))
    )
)
save_path = WORK_PATH.joinpath(self.keyword, "images", _uuid[:15])
save_path.mkdir(parents=True, exist_ok=True)
index = 0
for _json in formatted_jsons:
    if _json["position"] == "left":
        page.click(select_left)
    else:
        page.click(select_right)
    time.sleep(0.2)
    page.fill(input_words, _json["text"])
    page.click(add_words)
    time.sleep(0.2)
    save_file = save_path.joinpath(f"{index}.jpg")
    page.locator(target_area).screenshot(
        path=save_file, quality=100, type="jpeg"
    )
    index += 1


5.gif (385.6 KB, 下载次数: 0)
下载附件
2023-1-2 18:47 上传

### 将截图、音频进行合成视频
截图、音频合成视频,我们用到了`moviepy`,`Pillow`库,将图片按照名称,以固定的间隔拼合为视频,并在每个拼合的位置添加微信消息提示音。
[Python] 纯文本查看 复制代码images = glob.glob(str(path.joinpath("*.jpg")))
if not images:
    return
images = sorted(images, key=lambda e: int(e.split("\\")[-1].split(".")[0]))
images = self.resize_images(images)
if not self.output_path:
    video_path = WORK_PATH.joinpath(self.keyword, "output")
    video_path.mkdir(parents=True, exist_ok=True)
else:
    video_path = Path(self.output_path)
video_file = video_path.joinpath(str(path).split("\\")[-1] + ".mp4")
fps = 1 / 1.5
video_clip = ImageSequenceClip(images, fps=fps)
during = video_clip.duration
wechat_audio = AudioFileClip(
    str(MAIN_PATH.joinpath("wechat_sound", "9411.mp3"))
)
audio_clips = []
i = 0
while i
这样我们的视频就制作完成啦。
### 成果
生成完后,文件保存在`workspace/output`文件夹中


6.png (34.32 KB, 下载次数: 0)
下载附件
2023-1-2 18:48 上传

效果⬇


7.gif (261.04 KB, 下载次数: 0)
下载附件
2023-1-2 18:49 上传

我还做了测试,在抖音发了两个视频!


8.jpg (34.2 KB, 下载次数: 0)
下载附件
2023-1-2 18:49 上传

第一个只有167的播放量,第二个视频就冲到了1.6万!
所以完全是行得通的!
所有代码保存在github上了,需要的请自取!

https://github.com/cuifengcn/wechat-video-generate

视频, 下载次数

buyaobushuo
OP
  


xy168168 发表于 2023-1-2 22:31
先给楼主点个赞
但是 咱不太会用啊  楼主兄弟看到后 能不能告诉咱咋用
到了安装安装requirement ...

啊怪我,等我有时间(这两天)打包成exe,到时候直接用就好了
xy168168   

给楼主兄弟提个醒 你可以做成微信小程序  放上去  好优化的同时  你还能多份零花钱  多好啊  这个肯定有人用  我分析过那些抖音快手上的视频  他们不是对话动态视频   是聊天截图做成的视频。你这个体验要好于那种的。
或者你做成独立软件 卖注册码 我身边有人就是提出过你这种创意,但是我们都是小白,做不出来。
一句话   你这个有潜力!
leonas30200   

本着一个小白的职业操守,下载了打包好的exe,但是生成的视频是黑屏的,没法使用。
今天趁着上班摸鱼的时候,老老实实下载了源码,看看问题出在哪里。最终成功生成了视频,把我的折腾过程分享在下面:
一、
问题:安装Python的包,用国内镜像源,每次在命令行后面加网址,如何一劳永逸?
解决:以清华镜像为例,直接在user目录中创建一个pip目录,如:C:\Users\用户名\pip,新建文件pip.ini,文件内容如下:
[Asm] 纯文本查看 复制代码[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
二、
问题:requirements.txt安装
解决:前面回复里面已经有人说了,我抄一下,
        pip install -r requirements.txt
        后续的过程中,提示缺啥就安啥
三、
问题:错误提示“Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools ”
解决:下载并安装【Microsoft Visual C++ Build Tools】,大概需要占用2G空间。
        链接:https://pan.baidu.com/s/1fJy_Erjw2HuR09Ts83nQuw
        提取码:52pj
上面这些配置完以后,用pycharm打开项目,pycharm仍旧自动更新了一些文件,看不懂,没管。继续往下进行。
四、
问题:运行main.py后看下面的提示信息。playwright install报错。提示信息“Looks like Playwright was just installed or updated.Please run the following command to download new browsers:playwright install”
解决:
  步骤1、安装Playwright
        pip install playwright
  步骤2、安装Playwright内置浏览器
        python -m playwright install   或者    playwright install chromium
        安装中报错:“unable to verify the first certificate”    “UNABLE_TO_VERIFY_LEAF_SIGNATURE”
        解决方法:windows 环境下设置环境变量,使用 set 语法,命名后不加空格,直接附上两个 &&, 然后空格,跟上新的命令。即在命令提示符下输入
                set NODE_TLS_REJECT_UNAUTHORIZED=0&& playwright install chromium
  步骤3、安装完成验证
           playwright -V
        出现版本号则成功
到这里我还是生成黑屏视频,怀疑是不是自己没装ffmepg。
五、
问题:ffmepg安装。
解决:
  步骤1:官网下载  https://ffmpeg.org/download.html下载对应版本。解压缩放置好。进入bin目录,能看到ffmpeg.exe、ffplay.exe、ffprobe.exe三个文件。  
  步骤2:配置环境变量:“我的电脑”右键,“属性”点击“高级系统设置->环境变量->用户变量”,选择“Path”条目,点击“编辑->新建”,把第一步的bin文件夹路径复制粘贴进去,然后点击确定即可。注意,此处我设置的是用户变量,仅当前windows用户可以使用,如果需要每个用户都能够使用,需要添加到“系统变量”的“Path”条目中。我们打开cmd命令行窗口,输入命令“ffmpeg –version”。窗口返回ffmpeg的版本信息,说明安装成功。
  步骤3、安装完成验证        打开cmd命令行窗口,输入命令“ffmpeg –version”。窗口返回ffmpeg的版本信息,说明安装成功。
六、
问题:对话双方的头像是随机的,不能指定。
解决:头像文件的存放位置在.\faces 大小是200*200,格式jpg。
        """选取头像"""使用的是在generate.py中的191行two_random_photo函数
        photos = self.two_random_photo()
        暂时不改变程序的选取头像方法,而是将.\faces文件夹中的头像全部删除,自己制作头像放入,只放两个,就不再是随机头像了。
七、
问题:生成的视频是黑屏。
解决:在 ffmpeg_writer.py 文件里面有一段这样的代码:
[Python] 纯文本查看 复制代码      if ((codec == 'libx264') and
                (size[0] % 2 == 0) and
                (size[1] % 2 == 0)):
            cmd.extend([
                '-pix_fmt', 'yuv420p'
            ])
        cmd.extend([
            filename
        ])
所以把图片的宽和高都调整为偶数,生成的视频就可以正常播放了。视频不再黑屏,也不再是编码错误。
修改generate.py的263行,
[Python] 纯文本查看 复制代码img = pic_org.resize((w * 15 + 1, int(w * 16 / 9) * 15), Image.ANTIALIAS)
八、
问题:生成的视频,微信发送可以查看,但不能从微信下载。
解决:视频的宽高太大。依旧修改generate.py的263行
[Python] 纯文本查看 复制代码img = pic_org.resize((540, 960), Image.ANTIALIAS)
也可以使用720/1280、1080/1920等分辨率,横屏视频尺寸为1920乘以1080,而竖屏尺寸为1080乘以1920。
九、
问题:上传到视频网站显示转码失败。抖音可传,B站提示转码失败。
解决:疑似码率太低,用剪映导入再导出一遍,成功上传。
十、
问题:生成的视频没有声音。
解决:用MKVToolNix查看生成的文件,并拆出音频流,播放音频发现声音正常。修改audio_codec为“aac”,改变下声道编码。
VideoClip.py的137行,修改:audio_codec=None为audio_codec="aac"
未解决的问题:
每次要先点“下载”,才会显示之前已经下载和识别的图片。
fubidong   

有成品麽 有需要这个 简化版也行 不用网上搜索对话素材 自己有素材
ylym8888   

生成的视频是 空白的,没有图片文字。楼主这是哪里的问题?
cn2jp   

我这水平只能坐等成品
lyy20   


zhangjiachen20 发表于 2023-1-3 11:55
楼主,打包显示少了模块,这个怎么搞。
Traceback (most recent call last):
  File "main.py", line 2,  ...

可以使用如下命令安装
pip install xxx -i https://xxx.xx.org/simple
# 比如下面是清华的源
# https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
转贴自--https://zhuanlan.zhihu.com/p/416872266
NOOB   

可以的,回头下载了研究研究
xiaoming52   


邪帝 发表于 2023-1-13 23:05
运行如上,这边好像说的是没办法找到ocr识别的文件,看了下确实没有该文件
觉得应该是ocr的问题,调 ...

numpy版本和环境不匹配
https://blog.csdn.net/weixin_43690520/article/details/104316553
您需要登录后才可以回帖 登录 | 立即注册