文字生成视频 TTV(Text to Video)
效果展示:
ps:简单AI第一版迭代过程
v1.0
用户
- session校验,存储到本地浏览器
视频处理
- 输入文字不能超过
1000字符
- 将String文本转为txt文件(供讯飞接口使用)
- 调用讯飞模型,读取txt文件,生成
lame
音频 - 调用
toWav脚本
将lame
转为wav
格式的音频 - 调用
merge脚本
将文字朗读的音频搭配随机音乐生成新的wav
音频文件 - 使用
coze
根据输入的文本生成图片 - 对输入的文本进行处理,将其进行断句组合为
List<String>
- 加载上述生成的音频文件
- 根据音频文件的总时长以及每一句文字的长短,设置每一句字幕的显示时间,生成srt字幕文件
- 使用ffmpeg初始化视频(30帧,1000000比特率,mp4格式等)
- 根据srt文件(或音频文件)的总时长,以及图片的数量来确定一张图片出现的时间
- 一张图片出现30次,按帧将图片以及音频写入视频,并设置镜头上下移动6帧切换一个图片
- 完成视频编码,输出mp4
- 调用
main脚本
将字幕文件与上述mp4合成,生成最终mp4
注意:一定要先输出mp4再合成字幕生成新的mp4,不然字幕会随着镜头移动而出现混乱
脚本解释
toWav脚本
#!/bin/bash
# 使用 $1 和 $2 来接收命令行参数
lame_path="$1"
wav_path="$2"
# 调试输出
echo "输入文件: ${lame_path}"
echo "输出文件: ${wav_path}"
# 执行ffmpeg命令
./ffmpeg -i "${lame_path}" "${wav_path}"
merge脚本
voice="$1"
background="$2"
output="$3"
./ffmpeg -i "${voice}" -i "${background}" -filter_complex "[1]volume=0.3[a];[0][a]amix=inputs=2:duration=first:dropout_transition=3" "${output}"
main脚本
#!/bin/bash
# 使用 $1 和 $2 来接收命令行参数
srt_path="$1"
video_path="$2"
output_path="$3"
./ffmpeg -i "${video_path}" -vf "subtitles=${srt_path}:force_style='Fontsize=18,PrimaryColour=&H0000b8e6,MarginV=20,Fontname=Arial,OutlineColour=&H00000000,Outline=1'" -c:a copy -f mp4 -metadata charset=utf-8 "${output_path}"
待优化事项
- session设置过期时间
- 实现单用户会话策略
- 设置访问限制:12小时内限制50次
- 并发调用生成视频的接口
v1.1
新增接口
/user/getAccessTimes
获取用户可访问次数,无参
用户权限控制
- 单用户登录:同一账号,同时只能在一个设备上登录。后面登录会把前面的状态挤掉
- session过期时间:3天
简单AI
访问次数限制:12小时限制50次
redis存储
- session存储格式:
spring:session:sessions:{sessionId}
- session存储类型:Hash
响应码
- 参数错误:500
- 认证失败:50000 (泛指session出现问题,权限校验失败,不包括登录时的参数校验失败)
- 正常:200
v1.2
修改权限校验方式
权限校验:spring session redis -> spring security + jwt + redis
遇到的问题:
- 调用生成视频的接口,经常返回登录页面(一般就是认证失败,但是我这边接口也都执行了还返回页面。。),无法获得处理成功/失败的数据
- Jwt过滤器校验过程,出现的异常无法被全局异常处理捕获
解决:
- 自定义
权限访问拒绝处理器
以及身份验证入口点
(与Jwt校验过滤器不同)并注册为security的异常处理器。- 目前实现了,异常最终都可以通过自定义类返回给前端
- 但是,没有通过断点来查看具体的流程
- 暂未解决??
统计耗时
ps:打印日志,将生成视频所经历的每个步骤耗时计算出来。便于后续优化系统
- 使用StopWatch类计算时间
StopWatch stopwatch = new StopWatch();
stopWatch.start();
//...逻辑代码
stopWatch.stop();
log.info("这一阶段耗时:{}", stopWatch.getTotalTimeMillis());
- 使用getCurrentTime计算时间
long startTime = System.currentTimeMillis();
//...逻辑代码
long endTime = System.currentTimeMillis();
log.info("这一阶段耗时:{}", startTime - endTime);
报错则中断程序
ps:生成视频的过程,出现任何问题都会导致生成的视频效果不好或者失败。因此出现任何问题/报错,必须中止生成
生成视频的过程不中断程序的报错原因如下:
security
未配置异常处理- 在方法中使用
try catch
使得程序停止了这个方法后,继续往下执行其他方法 - 执行脚本,返回的
exitCode
并未进行处理,如果非0则执行失败,理应抛出异常,停止运行。
解决办法:
- 在security中配置异常处理
//配置异常处理
http.exceptionHandling(exceptionHandling -> exceptionHandling
.authenticationEntryPoint(customAuthenticationEntryPoint)
.accessDeniedHandler(customAccessDeniedHandler)
);
- 将方法里面的try catch全都替换为throws
- 对于脚本的执行结果
exitCode
进行处理
其他
- 服务器启动jar命令
shell nohup java -jar xxx.jar >output.log &
- 上传文件到服务器(jar过大)
shell scp -r -i "\path\to\dog.pem" "\path\to\MackRadio-0.0.1-SNAPSHOT.jar" root@xxx.xx.xx.xxx:~/
附录
3000字文本:
text
在遥远的东方,有一片神秘的大陆,这里充满了奇幻的传说和无尽的冒险。传闻中,这片大陆上有着古老的秘术和传承,凡是能够领悟其中奥秘的人,都会拥有超凡的力量,成就不朽的传奇。在这片大陆的中央,矗立着一座巍峨的山脉,山脉深处有一座隐秘的山谷,山谷里生活着一个小村庄。村庄里的村民大多过着平静的生活,然而,这里却隐藏着一个不为人知的秘密——每一代,都会有一个孩子被选中,成为未来的救世主,拯救这片大陆于危难之中。故事就发生在这座小村庄里。清晨的阳光洒在村庄的每个角落,村民们开始了一天的劳作。在村庄的尽头,有一间简陋的小屋,小屋里住着一个年轻人,他叫凌风。凌风今年十八岁,是村庄里最平凡的一个青年,但他有着一个不平凡的梦想——成为一名强大的修行者,探索这片神秘的大陆。凌风的父亲是村庄里的猎人,从小就教导凌风各种生存技能和狩猎技巧。在凌风十岁那年,父亲在一次狩猎中不幸遇难,从那以后,凌风便肩负起了照顾母亲和妹妹的责任。尽管生活艰辛,凌风从未放弃过自己的梦想。一天清晨,凌风像往常一样出门打猎,走进了深山。他熟练地在森林中穿梭,寻找着猎物的踪迹。突然,他听到一阵奇异的声音,仿佛有某种神秘的力量在召唤他。凌风循着声音走去,发现了一片从未见过的古老遗迹。遗迹中充满了古老的符文和石像,凌风心中隐隐感到,这里一定隐藏着巨大的秘密。他小心翼翼地走进遗迹的中心,发现了一块古老的石碑,石碑上刻着一段文字:“有缘者得之,非强者得之。心怀正义,勇者无敌。”凌风读完这段文字,心中一震,仿佛明白了什么。他伸出手触摸石碑,突然,一道强烈的光芒从石碑中爆发出来,将凌风笼罩其中。凌风感到一股强大的力量涌入体内,他的身体开始变得轻盈,意识也逐渐模糊。当凌风再次醒来时,发现自己身处一个奇异的空间,周围漂浮着无数的星辰和光点。一位身穿古老长袍的老者出现在他面前,老者慈祥地看着凌风,说道:“孩子,你是被选中的人。”凌风感到十分震惊,问道:“您是谁?这里是什么地方?”老者微笑着回答:“我乃守护这片大陆的古老灵魂,这里是星辰空间。你能够来到这里,说明你有成为救世主的潜质。”凌风听后,心中既激动又疑惑,他问道:“我该怎么做?”老者说道:“要成为救世主,你必须接受试炼。通过试炼,你将获得强大的力量和智慧,但这条道路充满了危险和挑战,你愿意接受吗?”凌风毫不犹豫地点头道:“我愿意!”老者点点头,伸手一挥,一道光门出现在凌风面前:“进入光门,试炼即将开始。”凌风深吸一口气,坚定地走进光门,瞬间,他感到一阵天旋地转,当他再次睁开眼睛时,发现自己置身于一个巨大的竞技场中。竞技场四周环绕着高高的观众席,观众席上坐满了各式各样的生灵,他们都在注视着凌风。一位身披铠甲的战士走到凌风面前,声音洪亮地宣布:“欢迎来到勇者的试炼!在这里,你将面对各种强大的对手,只有战胜他们,才能获得最终的力量!”凌风握紧拳头,心中燃起熊熊斗志。他知道,这是他证明自己的机会,也是实现梦想的开始。试炼正式开始,凌风的第一个对手是一头巨大的魔兽。这头魔兽身高数丈,浑身覆盖着厚厚的鳞甲,眼神凶狠。凌风深吸一口气,迅速做出战斗姿态。他知道,面对如此强大的对手,必须全力以赴。战斗开始,魔兽发出一声怒吼,巨大的身躯猛然扑向凌风。凌风灵活地闪避,抓住机会,对魔兽的弱点进行攻击。然而,魔兽的防御异常坚固,凌风的攻击似乎并没有起到太大作用。魔兽一爪挥来,凌风被击飞数丈,重重地摔在地上。观众席上发出一阵惊呼,然而,凌风并没有放弃,他咬紧牙关,挣扎着站起来。心中坚定的信念让他重新燃起斗志,他闭上眼睛,集中精神,回忆起父亲曾教过的每一个狩猎技巧和战斗经验。突然,凌风感到体内的力量开始涌动,他睁开眼睛,目光如电,锁定了魔兽的致命弱点。他迅速奔跑起来,身体变得轻盈如风,手中的武器闪烁着寒光。魔兽再次扑来,凌风闪电般地跃起,一剑刺向魔兽的眼睛。魔兽发出一声凄厉的惨叫,庞大的身躯轰然倒地,尘土飞扬。观众席上爆发出雷鸣般的掌声和欢呼声,凌风终于战胜了第一个对手。试炼并没有结束,接下来的每一场战斗都充满了挑战和危险。凌风遇到了各种各样的对手,有强大的战士、狡猾的刺客、还有操纵元素的法师。然而,每一次他都凭借着坚定的信念和顽强的意志,战胜了所有的对手。随着试炼的不断深入,凌风的力量和智慧也在不断提升。他逐渐掌握了古老的秘术,学会了控制体内的能量。他的战斗技巧越来越娴熟,精神也越来越强大。最后一场试炼终于来临,凌风的对手是一位神秘的黑袍法师。黑袍法师站在竞技场中央,周身环绕着浓浓的黑雾,眼神冰冷而犀利。凌风感到一股强大的压迫感,但他毫不畏惧,坚定地迎上前去。战斗开始,黑袍法师挥动法杖,释放出一片黑色的魔法阵,凌风迅速闪避,但魔法阵的力量太过强大,他的身体被黑暗能量包围,感到一阵剧痛。然而,凌风并没有放弃,他集中全部的力量,突破了黑暗的束缚。凌风迅速反击,手中的武器化作一道光芒,直刺黑袍法师的心脏。黑袍法师发出一声怒吼,黑雾瞬间消散,露出了真实的面貌——他竟然是一位被诅咒的古代王者。凌风没有停下攻击,他知道,只有彻底击败对手,才能结束这场试炼。最后一击,凌风将全部的力量注入武器,化作一道耀眼的光芒,刺穿了古代王者的心脏。古代王者发出一声凄厉的惨叫,身体化作灰烬,消散在空中。竞技场瞬间安静下来,所有的观众都屏住了呼吸。片刻后,爆发出雷鸣般的掌声和欢呼声,凌风终于完成了所有的试炼,成为了真正的勇者。凌风感到体内的力量不断涌动,他知道,这不仅仅是力量的提升,更是心灵的升华。他回到了星辰空间,老者再次出现在他面前,微笑着说道:“孩子,你已经通过了所有的试炼,从此你将拥有保护这片大陆的力量。”爆红从报警开始 微迪系,沙雕,轻松,主角无CP,男女CP都没有。 演员墨非获得了一个角色系统,他从佛子身上获得了罪犯吸引,从开膛手身上学到了人体结构,从侦探身上学会了和猫对话,从怪盗身上学到了魔术手速……而这一切在别人眼中显得那么诡异。 正常演员会带着一身杀气吗? 正常演员会那么精通人体构造吗? 正常演员会回警局如同回家吗? 当整个剧组都笼罩在名为墨非的阴影之下,阴影本人却在专心干饭。 当观众对饰演反派的墨非提出质疑,被质疑本人却在和警官勾肩搭背。 当警官对浑身杀气的墨非心生怀疑,墨非反手给警局狂刷业绩。 嗯……虽然看上去不像好人,但这怎么不算良好市民呢? 无CP,男女CP都没有。 对主角来说全都是朋友。第1章 万恶之源 在一个风和日丽的日子,刚上任没多久的小警官开始了一天的工作。 普通城市的普通警官一般来说不会遇见太重大的案件,毕竟国内治安并不是盖的。 只不过最近几天有些例外。 年轻警官看着面前这个眼熟的年轻人,不由发出疑问:“又是你?” 年轻人沉重地点头:“好巧。” 年轻警官沉默片刻:“这是警局,你在警局看见我并不巧吧。” “我上任才一个月,见到你——”警官掐指算了算,“四、五次了,你打算在这包月?” “包月管饭吗?”年轻人诚恳地问,“贵不?” “这是重点吗?”年轻警官叹了口气,“墨非,你是个好人,干的都是见义勇为的好事,但你怎么能遇上这么多事呢?” 墨非满脸无辜:“我不造啊。” 其实他知道。 自从六天前获得了一个角色扮演系统之后各种事就没断过。 一开始他还以为自己总算觉醒金手指了,但回过味来才发现这金手指还真不一定是纯金的。 可能是铜铬合金带点钨,摸多了不长个那种。 系统运行很简单,抽卡获得技能,带着卡牌活过七天就能永久获得其中一项技能。 听上去挺美好的,这么法制的社会活过七天能有什么难度。 而且技多不压身,谁会嫌学的少呢? 可事实就是免费的东西最贵,这个铜铬合金手指开局第一张卡就给墨非当头一击。 【身份:佛子 主动:佛法精通(佛子怎么能不会佛法?习得后熟悉一切佛学典籍,坐而论道和超度积德), 慈悲为怀(作为佛子,见众生苦楚不平之事,定出手相助), 怒目金刚(佛有怒目金刚,请物理超度该当往生之人)。 被动:众生平等(不是我针对谁,在座的各位都是垃圾), 慈眉善目(自带高僧光环,周围人对你的好感度提升了) 飞蛾赴火(善人吸引恶意,周围发生坏事概率提升了)。】