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的心情也随之变得轻松起来 彷佛可以感受到这个男子所散发出的友好气息 他觉得在这个快速发展的时代 能有这样一份从容不迫和愉快的交流 是多么美好的事情 或许这就是生活的意义所在。

测试案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149237.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Stable Diffusion 使用详解(13)--- 3D纹理增强

目录 背景 Normal Map 描述 原理 使用心得 例子 描述 原图 参数设置 底模 ​编辑 正负相关性提示词 其他参数 controlnet 效果 还能做点啥 调整 效果 背景 实际上,在stable diffusion 中,你获取发现很多controlnet 其实功能有点类似&…

webview2加载本地页面

加载方式 通过导航到文件 URL 加载本地内容 使用方式: webView->Navigate( L"file:///C:/Users/username/Documents/GitHub/Demos/demo-to-do/index.html"); 但是这种方式存在一些问题,比如: 存在跨域问题(我加载…

Java语言程序设计基础篇_编程练习题***18.33 (游戏:骑士旅途的动画)

目录 ***18.33 (游戏:骑士旅途的动画) 习题思路 代码示例 动画演示 ***18.33 (游戏:骑士旅途的动画) 为骑士旅途的问题编写一个程序,该程序应该允许用户将骑士放到任何一个起始正方形,并单击Solve按钮,用动画展示骑士沿着路径的移动&…

9.5HSV体系进行颜色分割

基本概念 inRange() 函数是 OpenCV 中用于图像处理的一个非常有用的函数,即从图像中提取出介于指定范围内的像素值。这个函数在图像处理中特别有用,比如颜色检测、背景去除等应用。它主要用于图像的阈值处理,但与其他阈值方法(如…

前端——浮动+定位样式

一、浮动float——浮动是会使盒子脱离文档流 添加了浮动的元素 1.原本的位置不占用 脱离文档流 2.设置了浮动 就不支持auto自适应居中 3.文字会感受到浮动 跟着进行文字环绕效果 而不是浮动元素覆盖文字 文字和浮动处于同一层的关系 4.可以使行内元素支持 高…

苍穹外卖——day3

1.公共字段自动填充 我们在添加功能的时候常常要重复执行一些重复的操作 如下图 我们在执行update或者insert数据库操作的时候,总是要给下面的一些属性赋值 这样如果代码功能一多,这会显得代码很冗长 所以我们引入了公共字段自动填充这个功能的实现…

从入门到精通:SQL 100个关键技术关键词

无论你是刚刚接触数据库管理的新手,还是希望提升技能水平的数据分析师,掌握SQL都是至关重要的一步。SQL是一种强大的工具,用于管理和操作关系型数据库。从简单的数据检索到复杂的事务处理,SQL提供了广泛的功能来满足各种需求。为了…

软件设计师:01计算机组成与结构

文章目录 一、校验码1.奇偶校验码2.海明码3.循环冗余检验码 二、原码反码补码移码三、浮点数表示法1.浮点数相加时 四、寻址方式五、CPU1.访问速度2.cpu的组成 六、RISC和CISC&#xff08;<font color red>只用记住不同就可以&#xff09;七、冗余技术1.结构冗余2.信息冗…

unix中的vfork函数

一、前言 本文介绍unix中的vfork函数&#xff0c;vfork函数功能和fork函数类似&#xff0c;也是用于创建新的进程&#xff0c;只不过调用vfork函数创建的子进程将共享父进程的进程空间&#xff0c;且只有当子进程调用exec()或者exit()函数后&#xff0c;父进程才会继续运行。 …

统信服务器操作系统【Cron定时任务服务】

Cron定时任务服务服务介绍、服务管理、服务配置 文章目录 一、功能概述二、功能介绍1. Cron 服务管理2.Cron 服务管理3.Cron 服务配置run-parts一、功能概述 cron是一个可以用来根据时间、日期、月份、星期的组合来 调度对周期性任务执行的守护进程。利用 cron 所提供的功能,可…

苹果电脑系统重磅更新——macOS Sequoia 15 系统 新功能一 览

有了 macoS Sequoia&#xff0c;你的工作效率将再次提升&#xff1a;快速调整桌面布局&#xff0c;一目了然地浏览网页重点&#xff0c;还可以通过无线镜像功能操控你的iPhone。 下面就来看看几项出色新功能&#xff0c;还有能够全面发挥这些功能的 App 和游戏。 macOS Sequo…

Vue 中 watch 的使用方法及注意事项

前言 Vue 的 Watch 是一个非常有用的功能&#xff0c;它能够监听 Vue 实例数据的变化并执行相应的操作。本篇文章将详细介绍 Vue Watch 的使用方法和注意事项&#xff0c;让你能够充分利用 Watch 来解决 Vue 开发中的各种问题。 1. Watch 是什么&#xff1f; 1.1 Watch 的作…

NVIDIA发布端到端自动驾驶框架Hydra-MDP

自动驾驶是目前人工智能领域的一个主要分支&#xff0c;目前特斯拉的FSD确实是为数不多的大模型框架。与其说特斯拉是一个造车公司&#xff0c;不如说是一个人工智能大数据公司。特斯拉每天靠行驶在道路上的汽车搜集的道路数据不胜其数&#xff0c;而拥有海量的数据是人工智能领…

数据结构——顺序表、链表

目录 前言 一&#xff0c;数据结构 1&#xff0c;什么是数据结构&#xff1f; 2&#xff0c;有什么类型&#xff1f; 二&#xff0c;顺序表 1&#xff0c;线性表 2&#xff0c;顺序表基本结构 3&#xff0c;动态顺序表的功能实现 三&#xff0c;链表 1&#xff0c;链…

乌克兰因安全风险首次禁用Telegram

据BleepingComputer消息&#xff0c;乌克兰国家网络安全协调中心 &#xff08;NCCC&#xff09; 以国家安全为由&#xff0c;已下令限制在政府机构、军事单位和关键基础设施内使用 Telegram 消息应用程序。 这一消息通过NCCC的官方 Facebook 账号对外发布&#xff0c;在公告中乌…

2024icpc(Ⅱ)网络赛补题 L

L、502 Bad Gateway 题意&#xff1a; 给定一个 T T T&#xff0c;每一步可以做以下两个操作&#xff1a; 1、减1 2、随机重置为 [ 1 , T ] [1,T] [1,T]中的某个整数 求在最优策略下&#xff0c;得到 0 0 0的期望步数 思路&#xff1a; 最优策略为选择一个阈值 S S S&…

01.系统IO

文章的函数说明只是简单的说明&#xff0c;具体还得查看man手册 Linux文件说明 linux下一切皆是文件。 Linux 下的文件类型&#xff1a; 1&#xff0c;普通文件&#xff08;regular&#xff09;&#xff1a;存在于外部存储器中&#xff0c;用于存储普通数据。 2&#xff0…

深入理解音视频pts,dts,time_base以及时间数学公式

引入 首先介绍一下基础名词 DTS&#xff08;Decoding Time Stamp&#xff09;&#xff1a;即解码时间戳&#xff0c;这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。当数据没b帧时&#xff0c;dts pts&#xff0c;有兴趣可参阅我前面视频知识类文章。 PTS&a…

统信服务器操作系统【开机自启动】配置方法

开机自启动的四种配置方法,包括systemctl命令、rc.local文件、crontab任务,通过desktop配置开机自动,前三种方法适合后台程序或者脚本启动,最后一种方法适合图形化程序启动。 文章目录 准备环境配置方法一、通过编写service的方法,使用systemctl配置开机自启二、通过rc.lo…

展锐平台的手机camera 系统isptool 架构

展锐平台的isptool 主要用于支持展锐各代芯片isp的各效果模块快速tuning和参数生成打包。 具体需要&#xff1a; 一、工具段能在线实时预览到调试sensor经过isp 处理后的图像&#xff0c;也就是各模块的参数在当下实时生效&#xff0c;通过工具能在PC 上在线观看到修改的效果。…