實驗室 3 分钟阅读

【Marp×VOICEVOX×VTubeStudio】让ずんだもん来做 LT(短演讲)発表的故事

这个项目源于“想用 AI 做些无聊的事情!”的纯粹好奇心。作为一项有趣且富有创造性地利用技术的实验,我们构建了一个能让ずんだもん自动进行 LT 発表(短演讲)的系统。

Terisuke
Share this article:

【Marp×VOICEVOX×VTubeStudio】让ずんだもん来做 LT(短演讲)発表的故事

这个项目源于“想用 AI 做些无聊的事情!”的纯粹好奇心。作为一项有趣且富有创造性地利用技术的实验,我们构建了一个能让ずんだもん自动进行 LT 発表(短演讲)的系统。

反正我自己発表也腻了,就全部交给ずんだもん了。结果,她比我更受欢迎,这是秘密。

项目构成要素

1. Marp - 演示文稿制作

---
marp: true
theme: default
class: lead
---

# ずんだもん的 LT
## 让我们一起玩转技术吧!

---

# 今天聊什么
- 自动化太有趣了!
- 大家一起来享受技术吧!

2. VOICEVOX - 语音合成

import requests

API_URL = "http://localhost:50021"

def generate_zundamon_voice(text: str) -> bytes:
    """调用 VOICEVOX API 获取音频数据 (wav)"""

    query_params = {"text": text, "speaker": 3}

    # 生成语音查询
    query_resp = requests.post(f"{API_URL}/audio_query", params=query_params, timeout=10)
    if query_resp.status_code != 200:
        raise RuntimeError(f"audio_query 失败 → {query_resp.status_code}: {query_resp.text}")

    # 语音合成
    synth_resp = requests.post(
        f"{API_URL}/synthesis",
        params={"speaker": 3},
        data=query_resp.content,
        timeout=30
    )
    if synth_resp.status_code != 200:
        raise RuntimeError(f"synthesis 失败 → {synth_resp.status_code}: {synth_resp.text}")

    return synth_resp.content

3. VTubeStudio - 角色控制

// 使用 VTubeStudio API 进行角色控制
class VTubeStudioController {
  constructor(wsUrl = "ws://localhost:8001") {
    this.wsUrl = wsUrl;
    this.isOpen = false;
    this.websocket = new WebSocket(this.wsUrl);

    this.websocket.addEventListener("open", () => {
      this.isOpen = true;
      console.log("✅ VTubeStudio WebSocket 已连接");
    });

    this.websocket.addEventListener("error", (err) => {
      console.error("❌ WebSocket 错误", err);
    });

    this.websocket.addEventListener("close", () => {
      this.isOpen = false;
      console.warn("⚠️ WebSocket 已关闭");
    });
  }

  send(data) {
    if (!this.isOpen) {
      console.warn("WebSocket 未打开。消息已跳过。");
      return;
    }
    this.websocket.send(JSON.stringify(data));
  }

  triggerExpression(expressionFile) {
    const message = {
      apiName: "VTubeStudioPublicAPI",
      apiVersion: "1.0",
      requestID: crypto.randomUUID(),
      messageType: "HotkeyTriggerRequest",
      data: { hotkeyID: expressionFile }
    };
    this.send(message);
  }

  syncWithAudio(audioTimestamps) {
    // 根据音频时间戳触发口型同步
    audioTimestamps.forEach((ts) => {
      setTimeout(() => this.triggerExpression("mouth_animation"), ts);
    });
  }
}

系统集成

自动化工作流程

#!/bin/bash
# 自动 LT 生成脚本

# 1. 从 Markdown 生成幻灯片
marp presentation.md -o slides.html

# 2. 从幻灯片内容生成语音
python generate_voice.py

# 3. 在 VTubeStudio 中控制角色
node control_vtube.js

# 4. 使用 OBS 进行录制/直播
obs-cli start-recording

与クラウディア(Claudia)的合作

本项目还利用了另一个人物角色“クラウディア”(一位说博多方言的角色),旨在进行更具亲和力的技术発表(演讲)。

感觉就像“ずんだもん和クラウディア的相声”,出乎意料地受欢迎。明明是技术発表(演讲)的说。

获得的经验

  • 技术组合的乐趣: 联动不同工具的乐趣(API 连接到极致)
  • 与社区的交流: 分享“有趣”的价值(“无聊”是一种赞美)
  • 创造性的重要性: 技术是手段,重要的是表达什么(虽然这么说,但主要还是因为ずんだもん很可爱)

项目的未来发展

该系统目前仍在不断发展,并计划添加以下功能:

  • 实时问答: 与 ChatGPT API 集成(ずんだもん回答问题的未来)
  • 表情表现的提升: 更丰富的动画(也想看生气的ずんだもん)
  • 多语言支持: 英语発表(演讲)功能(全球化ずんだもん的诞生)

这个项目让我再次认识到,不仅仅要“认真”地使用技术,更要“有趣”地使用技术。

归根结底,工程学也许就是“如何一本正经地做些不正经的事情”吧。


如果你有任何有趣的科技实验想法,请务必通过 联系我们 告诉我!

“让ずんだもん唱说唱”、“让初音未来审查代码”之类的无聊想法,才能让世界变得更有趣。*

Support this article

If this article was helpful, please support us with a tip. You can choose any amount.

Secure payment via Stripe

相关文章

阅读文章
Codex MCPの設定方法
實驗室

在 Claude Desktop 中设置使用 Codex MCP 的方法

Claude Code MCP 无法使用,因此引入了新的 Codex CLI MCP。这是从错误频发的设置地狱中,在 Warp AI 的建议下脱困的实录故障排除。

#MCP #Claude Desktop +4
阅读文章
YouTube LIVEの企画
實驗室

【闪电15分钟】用MCP服务器构建MCP服务器!“随心所欲处理应用”开发秘辛

七月最后一天傍晚,原本在岩盘浴里暖烘烘的心情瞬间冷却。故事始于我们迎来了第60周的LT(Lightning Talk)活动被紧急取消的那个瞬间。

#MCP #Claude Desktop +3
阅读文章
實驗室

完全Markdown指南:博客文章撰写的全部

本指南将介绍Cor.inc博客中可用的所有Markdown语法和富内容功能。我们将为您提供大量创建美观、易于阅读的文章的技巧。通往Markdown大师之路由此开始。

#Markdown #ブログ +3