一个人搞了两个月,聊聊用 AI 做短视频自动生成的技术方案和踩坑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
atomshadows

一个人搞了两个月,聊聊用 AI 做短视频自动生成的技术方案和踩坑

  •  
  •   atomshadows 1 天前 603 次点击

    最近半年一直在折腾一个项目用 AI 自动生成短视频。起因是身边做小生意的朋友总问我能不能帮忙剪视频发抖音,我想这事儿应该能自动化,就开始做了。

    分享一下技术方案和踩过的坑,希望对有类似想法的朋友有参考价值。


    整体架构

    用户上传素材 + 输入文案 ↓ TTS 语音合成( MiniMax / 火山引擎) ↓ 根据语音时长自动分配素材时间轴 ↓ 云端渲染(转场、字幕、BGM ) ↓ 成品视频 

    后端 FastAPI + MySQL ,前端 Vue 3 ,视频渲染走云端 API ,手机端用 Capacitor 套了个壳。一个人全栈,没有团队。


    几个有意思的技术点

    1. TTS 选型

    试了一圈,最后主力用 MiniMax speech-2.8-hd ,中文多音字准确率目前最好。火山引擎作为补充,主要是剪映生态的独有音色(奶气萌娃、广告解说这种)。Azure 的中文效果一般,Fish Audio 没深入测。

    踩坑:TTS 返回的音频时长和文字长度不是线性关系,语气词、停顿都会影响。批量生成时如果对时长有严格要求,需要做重试机制。

    2. 素材自动分配

    这块逻辑最复杂。用户上传 N 个素材(视频+图片混合),系统要自动决定每个素材展示多久、从视频的哪个位置截取。

    几个关键决策:

    • 视频从中间 70% 区域截取(跳过开头 20% 和结尾 10%),因为大部分手机拍的视频开头都是晃动的
    • 图片展示时长根据总时长动态计算,保证每张都出现,最少 1 秒/张
    • 批量生成时用发牌算法分配素材,保证每条视频的封面帧不同

    3. 批量生成去重

    做矩阵号的核心需求是"一组素材生成几十条不重复的视频"。去重策略:

    • AI 扩写多组文案时分配不同的切入角度(预定义了 30 个角度)
    • 每条视频的素材起始偏移不同
    • 视频截取位置随机化
    • 第一个 clip 强制用不同素材保证封面不同

    4. 浮点精度问题

    这个坑最隐蔽。视频时间轴用浮点数计算,多个 clip 拼接时 accumulated 会漂移,导致素材重叠或出现缝隙。解决方案是每次用 round 后的值更新 accumulated:

    cs = round(clip_start, 1) ce = round(clip_end, 1) accumulated += (ce - cs) # 不是 accumulated += clip_dur 

    5. 实时语音输入

    加了个语音输入功能,用户对着手机说文案直接转文字。技术上是浏览器 AudioContext 采集 PCM → WebSocket 传到后端 → 转发到阿里云 paraformer-realtime-v2 。

    踩坑:中间结果和最终结果的拼接如果处理不好会闪烁,最后用了"快照 + 增量"的方案解决。


    技术栈汇总

    技术
    前端 Vue 3 + Vite + Capacitor
    后端 Python 3.13 + FastAPI + SQLAlchemy
    数据库 MySQL 8
    存储 阿里云 OSS + CDN
    AI 文案 通义千问
    TTS 火山引擎
    语音识别 阿里云 paraformer-realtime-v2

    目前自己和几个朋友在用,做餐饮和服装的,反馈还行。有兴趣的可以体验一下 ios 可以直接用 PWA: https://zj.xinghepay.com ,Android 也有 APK

    技术上有什么想聊的欢迎评论区交流,特别是视频处理和 TTS 这块,踩的坑比较多,能聊的也多

    tool2dx
        1
    tool2dx  
       1 天前
    不能邮箱登陆吗? 上来就要手机号, 现在都是实名的, 不想给.
    atomshadows
        2
    atomshadows  
    OP
       1 天前 via iPhone
    @tool2dx 目前登录方式主要考虑到手机号验证更便捷,但完全理解您对隐私的顾虑。
    邮箱登录的功能已在计划中,后续版本会加入
    shoaly
        3
    shoaly  
       1 天前
    阿里云的语音识别 和 豆包 老哥对比过没, 我目前用豆包接口已经非常爽了, 不知道还有没有提升空间.
    atomshadows
        4
    atomshadows  
    OP
       18 小时 54 分钟前
    @shoaly 试试 MiniMax speech-2.8-hd
    shoaly
        5
    shoaly  
       18 小时 35 分钟前
    @atomshadows #4 方向反啦, 是语音转文字 不是生成语音
    atomshadows
        6
    atomshadows  
    OP
       11 小时 57 分钟前
    @shoaly #5 哈哈哈 是我一眼看错了

    豆包 Seed-ASR 在专业词汇、上下文推理这块确实比 paraformer 强, 还支持多模态识别,整体能力更新

    不过我这个场景用户说的都是普通话为主,paraformer 准确率够用,加上阿里云生态打通方便(账单也方便管),暂时就没动力换

    你主要用豆包 STT 做什么场景?如果是专业词汇多或者有方言,豆包确实值得优先考虑
    shoaly
        7
    shoaly  
       5 小时 15 分钟前
    @atomshadows #6 我就自己 vibe 用, 平替很贵的那个 typeless, 但是我发现豆包 2.0 流式接口中, 热词不生效, 发过工单了, 他们承认有问题, 但是说要等下一个大版本发布才能解决.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     843 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 20:23 PVG 04:23 LAX 13:23 JFK 16:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86