556浏览
查看: 556|回复: 1

[项目分享] 行空板M10扩展板助力实现“一句话生成视频”

[复制链接]
本帖最后由 云天 于 2025-5-26 00:12 编辑

一、项目背景
  • 在当今数字化时代,人工智能技术正以前所未有的速度改变着我们的生活和创作方式。作为一名创客,我一直对如何将人工智能技术与创意项目相结合充满兴趣。最近,我利用行空板和行空板M10扩展板,结合讯飞语音识别和硅基流动(SiliconFlow)的视频生成API,成功实现了一个“一句话生成视频”的项目。这个项目不仅展示了人工智能的强大功能,还体现了行空板M10扩展板在集成供电和功能扩展方面的优势。
  • 随着人工智能技术的飞速发展,自然语言处理和图像生成技术已经逐渐成熟。讯飞语音识别技术在语音转文字方面表现出色,而硅基流动提供的视频生成API则能够根据文本描述生成相应的视频内容。结合这些技术,我希望能够通过行空板实现一个简单的“一句话生成视频”项目,让用户可以通过语音输入,生成一段视频。
二、硬件与软件准备
(一)硬件准备
  • 行空板:作为项目的主控板,负责运行程序和处理数据。集成麦克风用于语音输入,集成显示屏用于显示提示信息和视频内容。
  • 行空板M10扩展板组合:包括电机IO扩展板、金手指扩展板和800mAh电池扩展板。在这个项目中,主要利用800mAh电池扩展板为行空板提供稳定的移动电源,确保项目可以在没有外部电源的情况下运行。
(二)软件准备
  • Mind+:用于图形化编程和上传代码到行空板。
  • Python环境:行空板支持Python编程,Mind+软件的Python模式下,连接行空板并安装相关库。
  • 讯飞语音识别SDK:用于将语音转换为文本。
  • 硅基流动API:用于根据文本生成视频。
    通过第三方的硅基流动注册获取API,如方便注册,使用我的邀请码注册:https://cloud.siliconflow.cn/i/KwyEBX3e,邀请码:KwyEBX3e。共同获取免费额度。如果不方便注册,可使用我的API:sk-kxwsrzianqfxsebnihblrgyyytrrtgvvdjvdiujcuvwymrfp。
行空板M10扩展板助力实现“一句话生成视频”图1
  5.OpenCV:用于视频播放。
三、项目实现
(一)语音识别
项目的第一步是通过麦克风录制语音,并利用讯飞语音识别技术将语音转换为文本。在行空板上,我使用了讯飞语音识别SDK,并设置了相应的APPID、APIKey和APISecret(注册获取)。通过按下按钮A开始录音,按下按钮B停止录音并开始识别。识别结果会显示在屏幕上。
(二)视频生成
识别出的文本将作为视频生成的输入。我使用了硅基流动提供的视频生成API,通过POST请求将文本描述发送到API服务器,并获取一个requestId。然后,通过另一个API接口查询视频生成的状态。当视频生成成功后,服务器会返回视频的URL。
(三)视频播放
获取到视频URL后,我使用OpenCV库在行空板上播放视频。OpenCV提供了强大的视频处理功能,可以方便地播放网络视频流。通过设置窗口属性,我将视频全屏显示在屏幕上。
行空板M10扩展板助力实现“一句话生成视频”图2


行空板M10扩展板助力实现“一句话生成视频”图3

四、程序代码

  1. # -*- coding: UTF-8 -*-
  2. # MindPlus
  3. # Python
  4. import json
  5. import time,sys
  6. sys.path.append("/root/mindplus/.lib/thirdExtension/liliang-xunfeiyuyin-thirdex")
  7. import xunfeiasr
  8. from unihiker import GUI
  9. from unihiker import Audio
  10. import requests
  11. import cv2
  12. # 定义API URL和请求头S
  13. url_submit = "https://api.siliconflow.cn/v1/video/submit"
  14. url_status = "https://api.siliconflow.cn/v1/video/status"
  15. headers = {
  16.     "Authorization": "Bearer sk-kxwsrzianqfxsebnihblrgyyytrrtgvvdjvdiujcuvwymrfp",
  17.     "Content-Type": "application/json"
  18. }
  19. # 初始化变量
  20. requestStatus = ""
  21. bs = 0
  22. payload = {}
  23. u_gui = GUI()
  24. u_audio = Audio()
  25. # 事件回调函数
  26. def on_buttona_click_callback():
  27.     global u_audio,bs2
  28.     显示.config(text="开始录音")
  29.     显示.config(x=50)
  30.     显示.config(font_size=30)
  31.     print("开始录音")
  32.     time.sleep(0.1)
  33.     u_audio.start_record("record.wav")
  34. def on_buttonb_click_callback():
  35.     global u_audio, url_submit, url_status, headers, requestStatus, bs, payload,xunfeiasr
  36.     u_audio.stop_record()
  37.    
  38.     显示.config(text="开始识别")
  39.     显示.config(x=50)
  40.     显示.config(font_size=30)
  41.     print("停止录音,开始识别")
  42.     text = xunfeiasr.xunfeiasr(r"record.wav")
  43.     time.sleep(3)
  44.     显示.config(x=0)
  45.     显示.config(font_size=20)
  46.     print(f"识别结果:{text}")
  47.     wrap_text(text)
  48.    
  49.     # 提交视频生成请求
  50.     payload = {
  51.         "model": "Wan-AI/Wan2.1-T2V-14B",
  52.         "prompt": text,
  53.         "negative_prompt": "模糊",
  54.         "image_size": "960x960",
  55.         "seed": 123
  56.     }
  57.     try:
  58.         response = requests.post(url_submit, json=payload, headers=headers)
  59.         response.raise_for_status()  # 检查请求是否成功
  60.         response_json = response.json()
  61.         requestId = response_json.get("requestId")
  62.         print(f"提交成功,requestId: {requestId}")
  63.         # 查询视频生成状态
  64.         payload = {"requestId": requestId}
  65.         bs = 1
  66.     except requests.exceptions.RequestException as e:
  67.         print(f"提交请求失败:{e}")
  68. # 屏幕宽度(以像素为单位)
  69. SCREEN_WIDTH = 240
  70. # 字符宽度
  71. CHAR_WIDTH = 30
  72. def wrap_text(text):
  73.     wrapped_text = ""
  74.     current_line = ""
  75.     current_line_width = 0
  76.    
  77.     for char in text:
  78.         if char == '\r':
  79.             # 如果遇到 \r,将当前行加入到 wrapped_text 中,并开始新的一行
  80.             wrapped_text += current_line + "\n"
  81.             current_line = ""
  82.             current_line_width = 0
  83.         else:
  84.             # 检查当前行加上新字符是否超出屏幕宽度
  85.             if current_line_width + CHAR_WIDTH > SCREEN_WIDTH:
  86.                 # 如果超出屏幕宽度,将当前行加入到 wrapped_text 中,并开始新的一行
  87.                 wrapped_text += current_line + "\n"
  88.                 current_line = char
  89.                 current_line_width = CHAR_WIDTH
  90.             else:
  91.                 current_line += char
  92.                 current_line_width += CHAR_WIDTH
  93.    
  94.     # 添加最后一行
  95.     if current_line:
  96.         wrapped_text += current_line
  97.     wrapped_text+="\r\r视频正在生成中……"
  98.     显示.config(text=wrapped_text)
  99. # 设置按键回调
  100. u_gui.on_a_click(on_buttona_click_callback)
  101. u_gui.on_b_click(on_buttonb_click_callback)
  102. u_gui.draw_text(text="行空板",x=60,y=20,font_size=30, color="#0000FF")
  103. 显示=u_gui.draw_text(text="一句话生成视频",x=20,y=100,font_size=20, color="#FF0000")
  104. # 设置讯飞语音识别参数
  105. xunfeiasr.xunfeiasr_set(APPID="*****", APISecret="*****", APIKey="*****")
  106. bs2=0
  107. # 主循环
  108. while True:
  109.     if bs == 1:
  110.         try:
  111.             response = requests.post(url_status, json=payload, headers=headers)
  112.             response.raise_for_status()  # 检查请求是否成功
  113.             response_json = response.json()
  114.             requestStatus = response_json.get("status")
  115.             print(f"查询状态:{requestStatus}")
  116.             if requestStatus == "Succeed":
  117.                 bs = 0
  118.                 video_url = response_json['results']['videos'][0]['url']
  119.                 print(f"视频URL:{video_url}")
  120.                 # 播放视频
  121.                 cap = cv2.VideoCapture(video_url)
  122.                 if not cap.isOpened():
  123.                     print("无法打开视频流,请检查URL是否有效")
  124.                 else:
  125.                     print("成功打开视频流")
  126.                     # 创建窗口并设置窗口大小
  127.                     cv2.namedWindow('Video', cv2.WINDOW_NORMAL)
  128.                     #cv2.resizeWindow('Video', 240, 320)  # 设置窗口大小为240x320
  129.                     cv2.setWindowProperty("Video", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
  130.                     bs2=1
  131.                     last_frame = None  # 用于保存最后一帧
  132.                     # 设置帧率(每秒25帧)
  133.                     fps = 25
  134.                     frame_delay = int(1000 / fps)  # 每帧的显示时间(毫秒)
  135.                     # 循环读取视频帧
  136.                     while True:
  137.                         ret, frame = cap.read()
  138.                         if ret:
  139.                             last_frame = frame.copy()  # 保存当前帧为最后一帧
  140.                             cv2.imshow('Video', frame)
  141.                         else:
  142.                             print("视频流播放完成")
  143.                             break
  144.                         if cv2.waitKey(frame_delay) == ord('q'):
  145.                             break
  146.                     
  147.                     # 释放资源
  148.                     cap.release()
  149.                     cv2.destroyAllWindows()
  150.         except requests.exceptions.RequestException as e:
  151.             print(f"查询状态失败:{e}")
  152.             time.sleep(3)  # 等待一段时间后重试
复制代码


五、行空板M10扩展板的应用
  • 行空板M10扩展板组合在这个项目中发挥了重要作用。800mAh电池扩展板为行空板提供了稳定的电源,使得项目可以在没有外部电源的情况下运行。这大大增加了项目的便携性和实用性。同时,金手指扩展板提供了更多的接口,可以方便地连接其他外设。
行空板M10扩展板助力实现“一句话生成视频”图4

六、演示视频

生成过程耗时较长,大概4至6分钟。为显示效果,本视频做了特别处理。

七、项目总结
  • 通过这个项目,我不仅实现了“一句话生成视频”的功能,还深入体会到了行空板M10扩展板的强大功能。它不仅提供了稳定的供电,还扩展了行空板的接口能力,使得项目更加灵活和多样化。未来,我将继续探索行空板和扩展板的更多可能性,尝试将更多的人工智能技术应用到创意项目中,创造出更多有趣的作品。
  • 如果你也对这个项目感兴趣,不妨尝试一下。相信你会在实践中发现更多乐趣和可能性。




easy猿  初级技师

发表于 2025-5-26 11:01:15

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail