大模型生成个性化剧集评论

嘿,你知道吗?新剧一出,评论区总是热火朝天!但你知道吗,这些热评可能都是大模型的杰作哦!我们利用先进的大模型技术,通过提取视频关键信息,为你量身定制个性化剧评。无论是剧情分析还是演员表现,都能轻松应对。从此,你不再是追剧的旁观者,而是评论区的主角!快来试试吧,让你的剧评也火起来!

实现方案

总体上,我们考虑利用大语言模型对指定视频来生成评论。

逆向推导

首先,我们先聚焦目标,以终为始,逆向推导实现方案。

  • 首先,大模型接收文字prompt信息,可以按指令生成评论数据
  • 再考虑,文字prompt需要包含指定视频的关键信息,给大模型来提供情境
  • 再考虑,视频关键信息提取,我们可以得到连续剧整体的简介信息,包含剧情、演员等
  • 再考虑,每一集的信息也需要包含,有两种方式
    • 方式一:提取当集视频的人物对白语言,识别出台词文本,当做关键信息
    • 方式二:视频内容识别,识别视频语意,输出为文字,当做关键信息
  • 将视频的【所在剧整体信息】+【当前集信息】+【生成评论指令】组装成prompt,调用大模型生成评论

实现流程

正向整理一下,实现流程

视频信息,我们采用获取人物对白方式实现(适合有对白的剧哦),不采用难度更大的视频内容识别方案。

实现效果

组装的prompt

你是一名短剧观众评论生成器,现在需要你根据给定的短剧信息和当集台词,生成一批有趣、生动的评论数据。  

#### 短剧信息
短剧名:短剧example
短剧简介:海外M国姜氏集团的千金姜思凝遭姜家养女姜思雪陷害,和M国赌王秦深一夜温存、失去双亲、险些丧命。六年后,姜思雪成为秦深妻子,姜思凝便化身荷官袁浅潜入秦深的赌场,意图色诱秦深并使得姜思雪失去一切。渐渐地,六年前的真相浮出水面,秦深袁浅的感情也发生了变化。 #### 当前集信息
- 集数:14
- 总集数:60
- 当集台词(节选):
大家都以为我和思念很恩爱大家都是假象不过是他在人前做出的样子吧这才是真相我从小没了爸妈又没能力胡可只能靠他养活所以才听他的话是没有他打吧一起说我不想他不是说他不屌所以这和我有什么关系吗我全本以为师爷你会心疼不然你回来了刚刚还在这块不知道去哪了谁也还在忙吗嗯一直没出来了你凭什么决斗或心疼你休息我们现在亲密无情共处于是你还没有把我推开将自己知道吧你处星期日的接近他原来打的是他老公的出去会让他知道吗老公元在书房 #### 评论生成要求
1. 生成的评论要 **有趣、生动、贴近剧情**,可包含惊讶、吐槽、心疼、磕CP、期待后续等情绪。
2. 评论要简短(1-2 句话),避免跑题。
3. 评论格式为 JSON 数组,每条评论包含:
- id:评论唯一编号(从1开始递增)
- parentid:若为顶层评论则为0,若为回复则为对应父评论id
- content:评论内容
4. 回复(盖楼)层级为 1-5 层,适当随机生成。
5. 输出只需返回 JSON,不要额外解释。 #### 输出示例
[
{
"id": 1,
"parentid": 0,
"content": "这段剧情太虐了,思凝好可怜!"
},
{
"id": 2,
"parentid": 1,
"content": "对啊,看得我都想哭了"
},
]

llm返回的内容

[
{
"id": 1,
"parentid": 0,
"content": "这集信息量好大!原来秦深和姜思雪的恩爱都是演出来的?豪门水太深了"
},
{
"id": 2,
"parentid": 1,
"content": "回复楼上:而且姜思雪说自己靠秦深养活才听话,细思极恐啊,这婚姻根本就是交易吧"
},
{
"id": 3,
"parentid": 0,
"content": "袁浅听到这些心里肯定很复杂,既恨秦深又忍不住心疼?这感情线太带感了"
},
{
"id": 4,
"parentid": 3,
"content": "确实!她本来是想报复的,现在发现仇人可能也是受害者,这反转绝了"
},
{
"id": 5,
"parentid": 0,
"content": "最后那句'老公元在书房'是不是在暗示什么?感觉下集要有大事发生"
}
]

代码实现

利用ffmpeg提取音频、Whisper实现语音文字提取

import os
import requests
import subprocess
import tempfile
import time def download_video(video_url, save_path):
"""Downloads a video from the given URL to the specified local path."""
save_dir = os.path.dirname(save_path)
if not os.path.exists(save_dir):
os.makedirs(save_dir)
try:
response = requests.get(video_url, stream=True)
response.raise_for_status() with open(save_path, 'wb') as file:
for chunk in response.iter_content(chunk_size=8192):
file.write(chunk)
print(f"Video downloaded successfully: {save_path}")
return True
except requests.exceptions.RequestException as e:
print(f"Failed to download video: {e}")
return False def extract_audio_fast(video_path, audio_path):
"""快速提取音频,优化参数以提高处理速度"""
try:
# 使用更快的编码参数
cmd = [
'ffmpeg', '-y', '-i', video_path,
'-vn', '-acodec', 'pcm_s16le',
'-ar', '16000', # 16kHz是语音识别的最佳频率
'-ac', '1', # 单声道
'-threads', '4', # 使用多线程加速
audio_path
]
subprocess.run(cmd, check=True, capture_output=True, timeout=300) # 设置超时时间
print(f"Extracted audio to {audio_path}")
return True
except subprocess.CalledProcessError as e:
print(f"FFmpeg error: {e.stderr.decode()}")
return False
except subprocess.TimeoutExpired:
print("FFmpeg process timed out")
return False
except Exception as e:
print(f"Error extracting audio: {e}")
return False def recognize_with_whisper(audio_path, model_size="small"):
"""
使用Whisper进行语音识别 参数:
audio_path: 音频文件路径
model_size: Whisper模型大小,可选"tiny", "base", "small", "medium", "large"
"""
try:
import whisper # 记录开始时间
start_time = time.time() # 加载模型
print(f"Loading Whisper {model_size} model...")
model = whisper.load_model(model_size)
print(f"Model loaded in {time.time() - start_time:.2f} seconds") # 转录音频
print("Transcribing audio...")
result = model.transcribe(
audio_path,
language="zh",
fp16=False # 不使用FP16加速,兼容性更好
) print(f"Transcription completed in {time.time() - start_time:.2f} seconds")
return result["text"]
except ImportError:
print("Whisper not installed. Install with: pip install openai-whisper")
return None
except Exception as e:
print(f"Whisper recognition error: {e}")
return None def enhance_audio(audio_path):
"""增强音频质量以提高识别率"""
enhanced_path = audio_path + ".enhanced.wav"
try:
# 使用ffmpeg增强音频
cmd = [
'ffmpeg', '-y', '-i', audio_path,
'-af', 'highpass=f=200,lowpass=f=3000,afftdn=nf=-25',
'-ar', '16000',
'-ac', '1',
enhanced_path
]
subprocess.run(cmd, check=True, capture_output=True, timeout=60)
return enhanced_path
except Exception as e:
print(f"Audio enhancement failed: {e}")
return audio_path # 如果增强失败,返回原始音频 def parse_video_words_fast(video_path, whisper_model="small"):
"""快速解析视频中的语音"""
start_time = time.time() # 创建临时音频文件
with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_audio:
temp_audio_path = temp_audio.name try:
# 提取音频
print("Extracting audio from video...")
if not extract_audio_fast(video_path, temp_audio_path):
return None # 增强音频质量
print("Enhancing audio quality...")
enhanced_audio_path = enhance_audio(temp_audio_path) # 识别语音
print("Starting speech recognition...")
result = recognize_with_whisper(enhanced_audio_path, model_size=whisper_model) # 计算处理时间
end_time = time.time()
print(f"Processing completed in {end_time - start_time:.2f} seconds") return result
finally:
# 清理临时文件
try:
os.unlink(temp_audio_path)
if os.path.exists(enhanced_audio_path) and enhanced_audio_path != temp_audio_path:
os.unlink(enhanced_audio_path)
except:
pass # 如果已经有音频文件,可以直接使用这个函数
def recognize_audio_file(audio_path, whisper_model="small"):
"""直接识别音频文件"""
return recognize_with_whisper(audio_path, model_size=whisper_model) if __name__ == '__main__':
# 测试代码
video_url = "https://vdept3.bdstatic.com/mda-qmi0r105nea78y1j/cae_h264/1734568349688083721/mda-qmi0r105nea78y1j.mp4?v_from_s=hkapp-haokan-nanjing&auth_key=1758003682-0-0-9803f157b3c7387bae1c64ccd9782b3f&bcevod_channel=searchbox_feed&pd=1&cr=0&cd=0&pt=3&logid=1282299422&vid=11024655518102530142&klogid=1282299422&abtest="
path = "./example.mp4"
download_video(video_url, path)
result = parse_video_words_fast(path, whisper_model="small") if result:
print("识别结果:", result)
else:
print("未能识别出语音内容")

代码运行输出

识别结果: 接下來呢 給大家帶來一個棚刻搖滾這首歌的名叫做快樂打工人不希望你們在早上聽到我們的聲音突然間逐漸被時間偷走了三年Let me go當我離開出走偷偷離開門口一段不早的路上去散滿的白日夢於思考為一般的人從未感到孤獨失蹤不討厭學生是大流家的老賤變成一位出了社會社會會對我好點No no no no家人們一個大陸成長後的魔戀變成了面對面的欺騙純雜荒的不紅點被不把你一字放進去Oh 每一遍放著那圈跟著我念 發動再見忘記了 到夜上也忘記了時間轉過的空氣帶我回家失靈突然間我回到那個熟悉的房間突然間逐漸被時間偷走了三年Let me go當我離開出走偷偷到你家門口請請別說一亂打工人永遠的聲音各位去唱唱好嗎Come onShake itShake it說再見合一情過去的Oh 每一遍放著那圈跟著我念 發動再見忘記了 到夜上也忘記了時間轉過的空氣帶我回家失靈合一情過去的說抱歉我沒有想起的說再見和自己操演的說抱歉和曾經相愛過的人謝謝

AI成你的追剧“嘴替”?一键生成专属弹幕!的更多相关文章

  1. Win10《芒果TV》更新v3.6.0秋收版:新增追剧磁贴、记忆续播、跳转列表

    热血青春,唱响革命战歌,<秋收起义>正在芒果TV热播,Win10版<芒果TV>更新v3.6.0秋收版,新增追剧磁贴.记忆续播.跳转列表. Win10版<芒果TV>V ...

  2. 暑期档追剧指南曝光 HUAWEI nova 2系列再放实用三大招

    火辣辣的夏季来啦,每年这时火热的不只天气,还有暑期黄金档影视剧的激烈争夺战.今年有<择天记>收视率珠玉在前,<欢乐颂2>更是引发全民追剧热潮,"小花"赵丽颖 ...

  3. 不花钱~Python制作视频解析免费追剧神器

    同学们在闲暇之余是否喜欢看电影或者电视剧呢? 今天带领大家使用python制作能免费追剧的桌面软件.还在等什么?发车了! 效果我就不再这里演示了https://jq.qq.com/?_wv=1027& ...

  4. 用户上传gif动图分解成多张帧图片,并合并生成新gif图片

    背景 为什么要制作这么一款工具 首先公司最近在做一款表情包的产品,需要将文字生成到gif图片中,并可以控制文字显示的位置,并将不同的文字显示在不同的图片上 制作成网页端工具,随时随地,方便使用 探索 ...

  5. 七夕节来啦!AI一键生成情诗,去发给你的女朋友吧!

    [摘要] Hello大家好,今天就是七夕节了,为了增进和女朋友之间的情感,我写了一个自动生成情诗的AI: 大家可以在ModelArts尝试复现模型,然后快去发给你们的女朋友吧- 大家好,我是b站up主 ...

  6. AI智能剪辑,仅需2秒一键提取精彩片段

    如今短视频已成为人们娱乐社交的主要形式,很多用户也开始由观众逐渐转变为短视频制作传播者,然而复杂的视频剪辑工具却令他们望而止步.如何才能降低短视频制作剪辑门槛,让更多无经验者也能制作出优质的短视频内容 ...

  7. JSP编译成Servlet(一)语法树的生成——语法解析

    一般来说,语句按一定规则进行推导后会形成一个语法树,这种树状结构有利于对语句结构层次的描述.同样Jasper对JSP语法解析后也会生成一棵树,这棵树各个节点包含了不同的信息,但对于JSP来说解析后的语 ...

  8. 来自AI的Tips——情景智能

    来自AI的Tips--情景智能   上一次我们介绍了华为快服务智慧平台是什么,今天我们来侃一侃平台最有代表性的一个流量入口--情景智能(AI Tips).   首先情景智能在哪呢?大家可以拿出自己的华 ...

  9. 游戏AI系列内容 咋样才能做个有意思的AI呢

    游戏AI系列内容 咋样才能做个有意思的AI呢 写在前面的话 怪物AI怎么才能做的比较有意思.其实这个命题有点大,我作为一个仅仅进入游戏行业两年接触怪物AI还不到一年的程序员来说,来谈这个话题,我想我是 ...

  10. 我用AI(Adobe Illustrator CS6)合并路径的两个常用方法

    作为一个切图仔,经常与设计大佬的PSD打交道,PSD里面又有各种icon图标需要导出,偷懒的方法直接导出png图片,丢个背景图上页面完美解决问题!! 第二天来个需求,能不能把这个icon图标给我换个颜 ...

随机推荐

  1. Bootstrap fileinput(ssm版)

    这是一篇我早起学习java-ssm的记录,这里主要是学习了文件上传 Bootstrap fileinput v1.0 前言bootstrap fileinput是一个很好的文件上传插件.但是官方不出a ...

  2. Java 中的 ==

    简介 如果没有重写 equals 方法, 相当于 == 比较, 即比较两个对象的地址是否相等. 如果是基本数据类型, 直接对值进行比较. code /** * Created by lee on 20 ...

  3. CSP-S 2023 T1 题解

    CSP-S 2023 T1 题解 很简单,我们只需要暴力枚举五位密码,每次判断拨一个齿轮和两个齿轮能达到的状态数,如果等于 \(n\),答案 \(+1\).时间复杂度 \(O(10^5 \times ...

  4. MinIO数据导出

    最近公司里需要将生产环境MinIO数据导出来一份,用于后续工作.导出的过程中尝试了三种方法(最终选择了方法三),内容如下: 方法一:MinIO Web控制台界面下载(适用于少量文件) 通过浏览器访问M ...

  5. Attention、Self-Attention 与 Multi-Head Attention

    Corpus语料库与DB数据库 World Knowledge世界常识库:OALD牛津高阶/Synonyms/Phrases/-, 新华字典/成语词典/辞海, 行业词典,大英百科,Wikipedia, ...

  6. SciTech-Mathmatics-Probability+Statistics-VIII-Statistics:Quantifing Uncertainty+ANOCOVA(ANalysis of COVAriance)协方差分析原理

    SciTech-Mathmatics-Probability+Statistics-VIII-Statistics:Quantifing Uncertainty ANOCOVA(ANalysis Of ...

  7. 图论 III

    本文主要讲解:网络流,二分图染色,2-sat,差分约束 定义与记号 基本定义 图:一张图 \(G\) 由若干个点和连接这些点的边构成.点的集合称为 点集 \(V\),边的集合称为 边集 \(E\),记 ...

  8. 进阶篇:3.2.6)DFM钣金-材料选择

    本章目的:了解钣金工艺常用材料及特性. 1.前言 钣金材料是产品结构设计中最常用的材料,了解材料的综合性能和正确的选材,对产品成本.产品性能.产品质量.加工工艺性都有重要的影响. 2.钣金材料的选材原 ...

  9. win11正式版如何修改密码的问题

    有很多雨林木风官网的小伙伴,都安装win11系统了.但是,因为win11正式版系统是新系统,有些问题大家都不知道怎么解决,比如win11系统如何修改开机密码的问题?下面win11官网小编就来分享具体的 ...

  10. ABC347F 题解

    我们考虑这三个正方形的相对位置有多少种情况. 我们把正方形的顶点设为 \((x_i,y_i)\).容易发现,放置合法当且仅当 \(\forall i \neq j, | \ x_i - x_j \ | ...