当前位置: 首页 > news >正文

MovieLife 电影生活

MovieLife 电影生活

今天看到一个很有意思的项目:https://www.lampysecurity.com/post/the-infinite-audio-book

在这里插入图片描述

“我有一个看似愚蠢的想法。通常,这类想法只是一闪而过,很少会付诸实践。但这次有所不同。假如你的生活是一部电影,它会讲述什么故事?会发生什么?我的想法就是从这里开始的。随着 AI 的兴起,我想看看是否可以让 AI 实时讲述我的生活。我们的设想是让相机拍摄一张照片,生成对照片的描述,然后由 ChatGPT 基于所看到的内容写一个叙事场景,再将文本转换为语音并播放。”

我的实现

在整个项目中,我使用了笔记本的摄像头进行操作,运行在笔记本上,感觉非常有趣。ChatGPT的描述充满了正能量!最初的代码无法运行,因此我参考了https://platform.openai.com/docs/guides/vision,进行了修改,并成功在我的电脑上运行起来。至于树莓派,我了解得不多,正在考虑是否可以在手机上部署,但还没有深入研究。

项目概念

  • 创意起源:作者反思了人生如电影的概念,探索了使用AI实时叙述他的人生。
  • 技术整合:该项目利用了OpenAI的各种服务,包括图像识别、语言模型和文字转语音。

硬件设置

  • 选择设备:一个带有Pi相机和Pi Sugar 3电池的Raspberry Pi Zero,以便携带。
  • 其他要求:
    • 带有micro HDMI的显示器,用于配置。
    • 鼠标/键盘进行交互。
    • USB micro转female A适配器。
    • SD卡用于Raspberry Pi OS。
    • 由于缺乏音频插孔,需要无线耳机。

设计和3D打印

  • 外壳设计:作者修改了现有的3D外壳设计,以适应电池,并使用Bambu Lab P1S 3D Printer。

软件和API集成

  • OpenAI API设置:
    • 创建账户并生成API密钥。
    • 解释API调用成本和使用情况。

代码实现

  • 编程语言:选择Python来编码项目。

  • 分步细节:

    • 配置文件.env

      OPENAI_API_KEY="这里填入你的API_KEY"
      
    • 导入必要的库。

      from pathlib import Path
      from openai import OpenAI
      import requests
      import os
      import cv2
      import base64
      import time
      import pygame
      from dotenv import load_dotenv# 加载 .env 文件
      load_dotenv()
      # OpenAI API key
      client = OpenAI()# OpenAI API Key
      api_key = os.getenv("OPENAI_API_KEY")
      # Path to your image
      image_path = "vision.jpg"# Getting the base64 string
      base64_image = "error"headers = {"Content-Type": "application/json","Authorization": f"Bearer {api_key}"
      }payload = {"model": "gpt-4o-mini","messages": [{"role": "user","content": [{"type": "text","text": "请描述这张图片?"},{"type": "image_url","image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}}]}],"max_tokens": 300
      }
    • 从相机捕获图像。

      def capture_webcam_photo(save_directory="webcam_photos"):# Create directory if it doesn't existif not os.path.exists(save_directory):os.makedirs(save_directory)# Open default camera (usually the first camera)cap = cv2.VideoCapture(1)# Capture frame-by-frameret, frame = cap.read()# Generate a unique filenamefilename = os.path.join(save_directory, "webcam_photo.jpg")# Save the captured frame as an imagecv2.imwrite(filename, frame)# Release the capturecap.release()return filename
      
    • 将图像编码为base64格式,以便提交API。

      # Function to encode the image
      def encode_image(image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')
      
    • 使用OpenAI的模型根据图像描述生成叙述性响应。

      def generate_response(prompt):name = "BoBo"age = "60"location = "体操之乡 湖北仙桃"response = client.chat.completions.create(model="gpt-4o-mini",messages=[{"role": "system","content": "你是一部电影的叙述者,讲述一个名叫 " + name + "。他的年龄  " + age + " ,生活在 " + location + "。当你看到一张场景图片时,你可以从" + name + "的角度描述这张照片,所有人物都用第三人称。 "},{"role": "user", "content": prompt}])return response.choices[0].message.content
      
    • 将文本响应转换为语音并播放。

      def text_to_speech(text):speech_file_path = Path(__file__).parent / "speech.mp3"response = client.audio.speech.create(model="tts-1",voice="alloy",input=text)response.stream_to_file(speech_file_path)return speech_file_pathdef play_mp3(file_path):# Initialize Pygamepygame.init()try:# Initialize the mixerpygame.mixer.init()# Load the MP3 filepygame.mixer.music.load(file_path)# Play the MP3 filepygame.mixer.music.play()# Wait until the music finishes playingwhile pygame.mixer.music.get_busy():pygame.time.Clock().tick(10)  # Adjust the playback speedexcept pygame.error as e:print(f"Error playing MP3: {e}")finally:# Cleanup Pygamepygame.mixer.music.stop()pygame.mixer.quit()pygame.quit()
      

      主函数:

      while True:start_time = time.time()saved_path = capture_webcam_photo()base64_image = encode_image(saved_path)# 将图像插入到 payload 中payload["messages"][0]["content"][1]["image_url"]["url"] = "data:image/jpeg;base64," + base64_image# 发送请求response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)# 检查响应状态if response.status_code != 200:print(f"Error: {response.status_code} - {response.text}")continue  # 跳过此次循环,继续尝试jsonZ = response.json()# 检查是否有 'choices' 键if 'choices' in jsonZ and len(jsonZ['choices']) > 0:try:response_text = generate_response(jsonZ["choices"][0]["message"]["content"])output_file = text_to_speech(response_text)  # play_mp3(output_file)  # except KeyError as e:print(f"KeyError: {e}")print("Received response:", jsonZ)continue  # 跳过此循环并记录错误else:print("No choices found in response")# 计算经过的时间elapsed_time = time.time() - start_time# 等待剩余时间remaining_time = max(0, 20 - int(elapsed_time))time.sleep(remaining_time)
      

主要功能

  • 连续运行:主循环每20秒捕获一次图像,通过OpenAI API进行处理,生成叙述,转换为语音,并播放。

完整代码

'''
@File    : movielife
@Author  : Bobo
@Blog    : https://blog.csdn.net/chinagaobo
@Note    : This code is for learning and communication purposes only
'''from pathlib import Path
from openai import OpenAI
import requests
import os
import cv2
import base64
import time
import pygame
from dotenv import load_dotenv# 加载 .env 文件
load_dotenv()
# OpenAI API key
client = OpenAI()# OpenAI API Key
api_key = os.getenv("OPENAI_API_KEY")
# Path to your image
image_path = "vision.jpg"# Getting the base64 string
base64_image = "error"headers = {"Content-Type": "application/json","Authorization": f"Bearer {api_key}"
}payload = {"model": "gpt-4o-mini","messages": [{"role": "user","content": [{"type": "text","text": "请描述这张图片?"},{"type": "image_url","image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}}]}],"max_tokens": 300
}# Function to encode the image
def encode_image(image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')def generate_response(prompt):name = "BoBo"age = "60"location = "体操之乡 湖北仙桃"response = client.chat.completions.create(model="gpt-4o-mini",messages=[{"role": "system","content": "你是一部电影的叙述者,讲述一个名叫 " + name + "。他的年龄  " + age + " ,生活在 " + location + "。当你看到一张场景图片时,你可以从" + name + "的角度描述这张照片,所有人物都用第三人称。 "},{"role": "user", "content": prompt}])return response.choices[0].message.contentdef text_to_speech(text):speech_file_path = Path(__file__).parent / "speech.mp3"response = client.audio.speech.create(model="tts-1",voice="alloy",input=text)response.stream_to_file(speech_file_path)return speech_file_pathdef capture_webcam_photo(save_directory="webcam_photos"):# Create directory if it doesn't existif not os.path.exists(save_directory):os.makedirs(save_directory)# Open default camera (usually the first camera)cap = cv2.VideoCapture(0)  # 使用内置摄像头# Capture frame-by-frameret, frame = cap.read()# Generate a unique filenamefilename = os.path.join(save_directory, "webcam_photo.jpg")# Save the captured frame as an imagecv2.imwrite(filename, frame)# Release the capturecap.release()return filenamedef play_mp3(file_path):# Initialize Pygamepygame.init()try:# Initialize the mixerpygame.mixer.init()# Load the MP3 filepygame.mixer.music.load(file_path)# Play the MP3 filepygame.mixer.music.play()# Wait until the music finishes playingwhile pygame.mixer.music.get_busy():pygame.time.Clock().tick(10)  # Adjust the playback speedexcept pygame.error as e:print(f"Error playing MP3: {e}")finally:# Cleanup Pygamepygame.mixer.music.stop()pygame.mixer.quit()pygame.quit()while True:start_time = time.time()saved_path = capture_webcam_photo()base64_image = encode_image(saved_path)# 将图像插入到 payload 中payload["messages"][0]["content"][1]["image_url"]["url"] = "data:image/jpeg;base64," + base64_image# 发送请求response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)# 检查响应状态if response.status_code != 200:print(f"Error: {response.status_code} - {response.text}")continue  # 跳过此次循环,继续尝试jsonZ = response.json()# 检查是否有 'choices' 键if 'choices' in jsonZ and len(jsonZ['choices']) > 0:try:response_text = generate_response(jsonZ["choices"][0]["message"]["content"])output_file = text_to_speech(response_text)  # play_mp3(output_file)  # except KeyError as e:print(f"KeyError: {e}")print("Received response:", jsonZ)continue  # 跳过此循环并记录错误else:print("No choices found in response")# 计算经过的时间elapsed_time = time.time() - start_time# 等待剩余时间remaining_time = max(0, 20 - int(elapsed_time))time.sleep(remaining_time)

实测案例

chatGPT的描述:在这张图片中 Bobo看到一个男子坐在桌前 面带微笑 眼镜反射出柔和的光泽 这个男人的手肘支撑在下巴旁 看起来十分放松 似乎正沉浸在与人交流的愉悦中 Bobo想这样的瞬间很难得 尤其是在压力重重的生活中 室内环境给人一种温馨舒适的感觉 整齐的墙面与那扇门形成一种和谐的背景 似乎在提醒每一个人 生活中依旧有着宁静与安详 Bobo的心情也随之变得轻松起来 彷佛可以感受到这个男子所散发出的友好气息 他觉得在这个快速发展的时代 能有这样一份从容不迫和愉快的交流 是多么美好的事情 或许这就是生活的意义所在。

测试案例

相关文章:

MovieLife 电影生活

MovieLife 电影生活 今天看到一个很有意思的项目:https://www.lampysecurity.com/post/the-infinite-audio-book “我有一个看似愚蠢的想法。通常,这类想法只是一闪而过,很少会付诸实践。但这次有所不同。假如你的生活是一部电影&#xff0c…...

网工内推 | 中级云运维工程师,双休,五险一金

01 博达人才 🔷招聘岗位:中级云运维工程师 🔷岗位职责 1、受理数据中心、云租户投诉、受理故障工单,并在时限内完成。 2、协助客户开通云产品,解答客户使用过程中的疑问。 3、处理云产品故障,协助进行故…...

Thingsboard规则链:Related Entity Data节点详解

引言 在复杂的物联网(IoT)生态系统中,数据的集成与分析是实现高效管理和智能决策的基础。Thingsboard作为一个强大的开源物联网平台,其规则链(Rule Chains)机制允许用户构建自定义的数据处理流程。其中&am…...

C++结尾

面试题 1.什么是虚函数?什么是纯虚函数 在定义函数时前面加virtual。虚函数是为了,父子类中只有一个该函数。如果在子类重写虚函数,那么用的就是子类重写的虚函数;如果子类没有重写虚函数,那么调用的是父类继承的虚函…...

Flutter鸿蒙化环境配置(windows)

Flutter鸿蒙化环境配置(windows) 参考资料Window配置Flutter的鸿蒙化环境下载配置环境变量HarmonyOS的环境变量配置配置Flutter的环境变量Flutter doctor -v 检测的问题flutter_flutter仓库地址的警告问题Fliutter doctor –v 报错[!] Android Studio (v…...

Vue入门之生命周期

文章目录 一、Vue 生命周期概述二、生命周期的四个阶段1. 创建阶段2. 挂载阶段3. 更新阶段4. 销毁阶段 三、代码案例四、总结 在 Vue 开发中,理解生命周期是非常重要的。Vue 的生命周期可以帮助我们在不同的阶段执行特定的逻辑,从而更好地控制组件的行为…...

UNI-SOP应用场景(1)- 纯前端预开发

在平时新项目开发中,前端小伙伴是否有这样的经历,hi,后端小伙伴们,系统啥时候能登录,啥时候能联调了,这是时候往往得到的回答就是,再等等,我们正在搭建系统呢,似曾相识的…...

力扣9.23

1014. 最佳观光组合 给你一个正整数数组 values&#xff0c;其中 values[i] 表示第 i 个观光景点的评分&#xff0c;并且两个景点 i 和 j 之间的 距离 为 j - i。 一对景点&#xff08;i < j&#xff09;组成的观光组合的得分为 values[i] values[j] i - j &#xff0c;…...

[Redis][事务]详细讲解

目录 0.什么是事务&#xff1f;1.Redis 事务本质2.Redis 事务意义3.事务操作1.MULTI2.EXEC3.DISCARD4.WATCH5.UNWATCH 0.什么是事务&#xff1f; Redis的事务和MySQL的事务概念上是类似的&#xff0c;都是把一系列操作绑定成一组&#xff0c;让这一组能够批量执行Redis事务和M…...

Latex——一行的划线 如何分开

代码&#xff1a; \cmidrule(r){3-4} \cmidrule(r){5-6} \cmidrule(r){7-8}效果&#xff1a; 参考文章&#xff1a; LaTeX技巧653&#xff1a;如何隔开LaTeX表格邻近\cline表格线&#xff1f;...

大数据:快速入门Scala+Flink

一、什么是Scala Scala 是一种多范式编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性。Scala 这个名字是“可扩展语言”&#xff08;Scalable Language&#xff09;的缩写&#xff0c;意味着它被设计为能够适应不同规模的项目&#xff0c;从小型脚本到大型分布式…...

侧边菜单的展开和折叠

环境准备&#xff1a;Vue3Element-UI Plus <script setup> import {ref} from "vue";// 是否折叠菜单&#xff0c;默认折叠 const isCollapse ref(true)</script><template><el-container><el-aside><el-menu:collapse"isCo…...

自动化办公-Python中的for循环

for 循环是 Python 中用于迭代&#xff08;遍历&#xff09;序列&#xff08;如列表、元组、字典、集合、字符串&#xff09;或其他可迭代对象的控制结构。它允许您逐一访问序列中的每个元素&#xff0c;并对其执行操作。以下是对 for 循环的详细介绍&#xff0c;包括语法、使用…...

Python_itertools

itertools itertools.count(start, step) 返回一个无限迭代器&#xff0c;从指定的start开始&#xff0c;每次增加step。 import itertools # 从1开始&#xff0c;每次增加1&#xff0c;输出前5个数 for i in itertools.count(1, 1):if i > 5:breakprint(i)运行结果&#…...

Apache Iceberg 数据类型参考表

Apache Iceberg 概述-链接 Apache Iceberg 数据类型参考表 数据类型描述实例方法注意事项BOOLEAN布尔类型&#xff0c;表示真或假true, false用于条件判断&#xff0c;例如 WHERE is_active true。确保逻辑条件的正确性。INTEGER32位有符号整数42, -7可用于计算、聚合&#xf…...

职责链模式

职责链模式 责任链&#xff08;Chain of Responsibility&#xff09;模式&#xff1a;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&#xff0c;可将请求沿着这…...

新品 | Teledyne FLIR IIS 推出Forge 1GigE SWIR 短波红外工业相机系列

近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出了新品Forge 1GigE SWIR 130万像素的红外相机。 Forge 1GigE SWIR系列的首款相机配备宽频带、高灵敏度的Sony SenSWIR™️ 130万像素IMX990 InGaAs传感器。这款先进的传感器采用5um像素捕捉可见光和SWIR光谱&#xff…...

深入MySQL:掌握索引、事务、视图、存储过程与性能优化

在掌握了MySQL的基本操作之后&#xff0c;你可能会遇到更复杂的数据管理和优化需求。本文将介绍一些MySQL的进阶特性&#xff0c;包括索引、事务、视图、存储过程和函数、以及性能优化等内容。通过学习这些高级功能&#xff0c;你可以更高效地管理和优化你的数据库。 索引 索…...

【WSL——Windows 上使用 Linux 环境】

引入 以前在windows上使用linux工具链&#xff0c;一般都要安装虚拟机&#xff08;VMware/virtualBox)。虚拟机的缺点是&#xff0c;因为是完整的虚拟环境&#xff0c;消耗系统资源比较多。 windows自己开发了WSL功能&#xff0c;实现了虚拟机的功能&#xff0c;但是比虚拟机性…...

Redis:事务

什么是Redis事务 Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令&#xff0c;一个事务中所有命令都会被序列化。在事务执行过程&#xff0c;会按照顺序串行化执行队列中的命令&#xff0c;其他客户端提交的命令请求不会插入到事务执行命令序列中。 总结说&…...

实战配置:5个提升MPC-HC播放器性能的专业技巧

实战配置&#xff1a;5个提升MPC-HC播放器性能的专业技巧 【免费下载链接】mpc-hc MPC-HCs main repository. For support use our Trac: https://trac.mpc-hc.org/ 项目地址: https://gitcode.com/gh_mirrors/mpc/mpc-hc Media Player Classic - Home Cinema&#xff0…...

手把手教你学Simulink——基于 PWM 加相移混合控制的双向 DC-DC 变换器仿真

目录 手把手教你学Simulink——基于 PWM 加相移混合控制的双向 DC-DC 变换器仿真 摘要 Abstract 1. 引言 1.1 研究背景 1.2 本文目标 2. 混合控制机理 2.1 拓扑选择&#xff1a;双有源桥&#xff08;DAB&#xff09; 2.2 混合控制自由度 3. Simulink 主电路建模 3.1…...

半导体测试数据可视化终极指南:STDF-Viewer从入门到精通

半导体测试数据可视化终极指南&#xff1a;STDF-Viewer从入门到精通 【免费下载链接】STDF-Viewer A free GUI tool to visualize STDF (semiconductor Standard Test Data Format) data files. 项目地址: https://gitcode.com/gh_mirrors/st/STDF-Viewer STDF-Viewer是…...

原神帧率解锁终极指南:免费突破60FPS限制的完整教程

原神帧率解锁终极指南&#xff1a;免费突破60FPS限制的完整教程 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 原神帧率解锁工具&#xff08;genshin-fps-unlock&#xff09;是一款开源…...

开发团队如何通过 Taotoken 实现 API 密钥的统一管理与审计

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 开发团队如何通过 Taotoken 实现 API 密钥的统一管理与审计 对于开发团队而言&#xff0c;安全、高效地管理大模型 API 密钥是一项…...

告别龟速采样!用DDIM加速你的扩散模型推理(附PyTorch代码)

加速扩散模型推理&#xff1a;DDIM核心原理与实战优化指南 在图像生成领域&#xff0c;扩散模型以其卓越的质量表现迅速成为研究热点&#xff0c;但传统DDPM&#xff08;Denoising Diffusion Probabilistic Models&#xff09;的致命缺陷在于其缓慢的采样速度——生成一张图片往…...

CentOS8实战:ZeroTier构建安全异地虚拟局域网

1. 为什么选择ZeroTier替代传统内网穿透方案 最近在帮朋友搭建远程办公环境时&#xff0c;遇到了一个典型问题&#xff1a;分布在三个不同物理位置的服务器需要像在同一个办公室内网那样互相访问。最初考虑使用FRP方案&#xff0c;但实测下来发现几个痛点&#xff1a;首先是带宽…...

OpenSpire:开源贡献者协作平台的设计理念与实战指南

1. 项目概述&#xff1a;一个面向开源贡献者的协作平台最近在和一些刚接触开源的朋友交流时&#xff0c;发现一个挺普遍的现象&#xff1a;很多人对参与开源项目充满热情&#xff0c;但第一步“如何找到合适的项目并上手”就卡住了。GitHub上项目浩如烟海&#xff0c;一个新手面…...

SyntaxUI:基于原子设计与Web组件的现代UI库开发实践

1. 项目概述&#xff1a;一个为开发者而生的现代UI组件库 如果你是一名前端开发者&#xff0c;或者正在构建一个需要用户界面的应用&#xff0c;那么你肯定经历过这样的场景&#xff1a;为了一个按钮的样式、一个表格的交互&#xff0c;或者一个模态框的动画&#xff0c;反复在…...

GitClaw:基于Go的轻量级Git钩子服务器与集中式权限管理方案

1. 项目概述与核心价值如果你是一名开发者&#xff0c;尤其是经常在团队协作中处理Git仓库的工程师&#xff0c;那么你一定对“权限管理”这四个字又爱又恨。爱的是它能保障代码安全&#xff0c;恨的是它配置起来繁琐&#xff0c;尤其是在处理跨项目、跨团队的复杂权限矩阵时。…...