云天 发表于 2025-5-25 23:53:29

行空板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。
5.OpenCV:用于视频播放。三、项目实现
(一)语音识别
项目的第一步是通过麦克风录制语音,并利用讯飞语音识别技术将语音转换为文本。在行空板上,我使用了讯飞语音识别SDK,并设置了相应的APPID、APIKey和APISecret(注册获取)。通过按下按钮A开始录音,按下按钮B停止录音并开始识别。识别结果会显示在屏幕上。
(二)视频生成
识别出的文本将作为视频生成的输入。我使用了硅基流动提供的视频生成API,通过POST请求将文本描述发送到API服务器,并获取一个requestId。然后,通过另一个API接口查询视频生成的状态。当视频生成成功后,服务器会返回视频的URL。
(三)视频播放
获取到视频URL后,我使用OpenCV库在行空板上播放视频。OpenCV提供了强大的视频处理功能,可以方便地播放网络视频流。通过设置窗口属性,我将视频全屏显示在屏幕上。



四、程序代码

# -*- coding: UTF-8 -*-

# MindPlus
# Python
import json
import time,sys
sys.path.append("/root/mindplus/.lib/thirdExtension/liliang-xunfeiyuyin-thirdex")
import xunfeiasr
from unihiker import GUI
from unihiker import Audio
import requests
import cv2

# 定义API URL和请求头S
url_submit = "https://api.siliconflow.cn/v1/video/submit"
url_status = "https://api.siliconflow.cn/v1/video/status"
headers = {
    "Authorization": "Bearer sk-kxwsrzianqfxsebnihblrgyyytrrtgvvdjvdiujcuvwymrfp",
    "Content-Type": "application/json"
}

# 初始化变量
requestStatus = ""
bs = 0
payload = {}
u_gui = GUI()
u_audio = Audio()

# 事件回调函数
def on_buttona_click_callback():
    global u_audio,bs2

    显示.config(text="开始录音")
    显示.config(x=50)
    显示.config(font_size=30)
    print("开始录音")
    time.sleep(0.1)
    u_audio.start_record("record.wav")

def on_buttonb_click_callback():
    global u_audio, url_submit, url_status, headers, requestStatus, bs, payload,xunfeiasr
    u_audio.stop_record()
   
    显示.config(text="开始识别")
    显示.config(x=50)
    显示.config(font_size=30)
    print("停止录音,开始识别")
    text = xunfeiasr.xunfeiasr(r"record.wav")
    time.sleep(3)
    显示.config(x=0)
    显示.config(font_size=20)
    print(f"识别结果:{text}")
    wrap_text(text)
   
    # 提交视频生成请求
    payload = {
      "model": "Wan-AI/Wan2.1-T2V-14B",
      "prompt": text,
      "negative_prompt": "模糊",
      "image_size": "960x960",
      "seed": 123
    }
    try:
      response = requests.post(url_submit, json=payload, headers=headers)
      response.raise_for_status()# 检查请求是否成功
      response_json = response.json()
      requestId = response_json.get("requestId")
      print(f"提交成功,requestId: {requestId}")

      # 查询视频生成状态
      payload = {"requestId": requestId}
      bs = 1
    except requests.exceptions.RequestException as e:
      print(f"提交请求失败:{e}")
# 屏幕宽度(以像素为单位)
SCREEN_WIDTH = 240
# 字符宽度
CHAR_WIDTH = 30

def wrap_text(text):
    wrapped_text = ""
    current_line = ""
    current_line_width = 0
   
    for char in text:
      if char == '\r':
            # 如果遇到 \r,将当前行加入到 wrapped_text 中,并开始新的一行
            wrapped_text += current_line + "\n"
            current_line = ""
            current_line_width = 0
      else:
            # 检查当前行加上新字符是否超出屏幕宽度
            if current_line_width + CHAR_WIDTH > SCREEN_WIDTH:
                # 如果超出屏幕宽度,将当前行加入到 wrapped_text 中,并开始新的一行
                wrapped_text += current_line + "\n"
                current_line = char
                current_line_width = CHAR_WIDTH
            else:
                current_line += char
                current_line_width += CHAR_WIDTH
   
    # 添加最后一行
    if current_line:
      wrapped_text += current_line
    wrapped_text+="\r\r视频正在生成中……"
    显示.config(text=wrapped_text)
# 设置按键回调
u_gui.on_a_click(on_buttona_click_callback)
u_gui.on_b_click(on_buttonb_click_callback)
u_gui.draw_text(text="行空板",x=60,y=20,font_size=30, color="#0000FF")
显示=u_gui.draw_text(text="一句话生成视频",x=20,y=100,font_size=20, color="#FF0000")

# 设置讯飞语音识别参数
xunfeiasr.xunfeiasr_set(APPID="*****", APISecret="*****", APIKey="*****")
bs2=0
# 主循环
while True:
    if bs == 1:
      try:
            response = requests.post(url_status, json=payload, headers=headers)
            response.raise_for_status()# 检查请求是否成功
            response_json = response.json()
            requestStatus = response_json.get("status")
            print(f"查询状态:{requestStatus}")

            if requestStatus == "Succeed":
                bs = 0
                video_url = response_json['results']['videos']['url']
                print(f"视频URL:{video_url}")

                # 播放视频
                cap = cv2.VideoCapture(video_url)
                if not cap.isOpened():
                  print("无法打开视频流,请检查URL是否有效")
                else:
                  print("成功打开视频流")

                  # 创建窗口并设置窗口大小
                  cv2.namedWindow('Video', cv2.WINDOW_NORMAL)
                  #cv2.resizeWindow('Video', 240, 320)# 设置窗口大小为240x320
                  cv2.setWindowProperty("Video", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
                  bs2=1
                  last_frame = None# 用于保存最后一帧

                  # 设置帧率(每秒25帧)
                  fps = 25
                  frame_delay = int(1000 / fps)# 每帧的显示时间(毫秒)

                  # 循环读取视频帧
                  while True:
                        ret, frame = cap.read()
                        if ret:
                            last_frame = frame.copy()# 保存当前帧为最后一帧
                            cv2.imshow('Video', frame)
                        else:
                            print("视频流播放完成")
                            break

                        if cv2.waitKey(frame_delay) == ord('q'):
                            break

                  

                  # 释放资源
                  cap.release()
                  cv2.destroyAllWindows()
      except requests.exceptions.RequestException as e:
            print(f"查询状态失败:{e}")
            time.sleep(3)# 等待一段时间后重试

五、行空板M10扩展板的应用

[*]行空板M10扩展板组合在这个项目中发挥了重要作用。800mAh电池扩展板为行空板提供了稳定的电源,使得项目可以在没有外部电源的情况下运行。这大大增加了项目的便携性和实用性。同时,金手指扩展板提供了更多的接口,可以方便地连接其他外设。

六、演示视频
https://www.bilibili.com/video/BV1aqj3zyEzM/?share_source=copy_web
生成过程耗时较长,大概4至6分钟。为显示效果,本视频做了特别处理。
七、项目总结

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




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

页: [1]
查看完整版本: 行空板M10扩展板助力实现“一句话生成视频”