Laboratorio 5 min de lectura

【Marp × VOICEVOX × VTubeStudio】La historia de cómo le pedí a Zundamon que hiciera una presentación relámpago (LT)

¡Uso creativo de la tecnología! Un proyecto experimental en el que combinamos Marp, VOICEVOX y VTubeStudio para construir un sistema de presentación LT automatizado a cargo de Zundamon

Terisuke
Share this article:

【Marp × VOICEVOX × VTubeStudio】La historia de cómo le pedí a Zundamon que hiciera una presentación relámpago (LT)

Este proyecto nació de la pura curiosidad de «querer hacer algo absurdo con IA». Como un experimento para utilizar la tecnología de forma divertida y creativa, creé un sistema para que Zundamon realizara presentaciones LT de manera automática.

Ya me había cansado de presentar yo mismo, así que decidí delegárselo todo por completo a Zundamon. Como resultado, tuvo más éxito que yo, aunque eso queda entre nosotros.

Componentes del proyecto

1. Marp: Creación de presentaciones

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

# ずんだもんのLT
## 技術で遊ぼう!

---

# 今日のお話
- 自動化って楽しいのだ!
- みんなで技術を楽しむのだ!

2. VOICEVOX: Síntesis de voz

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 failed → {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 failed → {synth_resp.status_code}: {synth_resp.text}")

    return synth_resp.content

3. VTubeStudio: Control del personaje

// 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 connected");
    });

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

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

  send(data) {
    if (!this.isOpen) {
      console.warn("WebSocket is not open. Message skipped.");
      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);
    });
  }
}

Integración del sistema

Flujo de trabajo de automatización

#!/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

Copresentación con Cloudia

En este proyecto también introduje a otra persona, «Cloudia» (un personaje que habla en dialecto de Hakata), con el objetivo de lograr una presentación técnica más cercana y accesible.

Acabó pareciendo una especie de «comedia en dúo (manzai) entre Zundamon y Cloudia», y sorprendentemente gustó mucho. Y eso que era una presentación técnica.

Aprendizajes obtenidos

  • Combinar e integrar diferentes herramientas es sumamente interesante (el culmen de conectar APIs sin parar).
  • Compartir lo «divertido» en la comunidad tiene un gran valor (que te digan «absurdo» es un cumplido).
  • La tecnología es un medio; lo importante es la creatividad de lo que se quiere expresar (aunque, a decir verdad, solo lo hice porque Zundamon es adorable).

Evolución del proyecto

Este sistema sigue evolucionando y se prevé añadir las siguientes funciones:

  • Preguntas y respuestas en tiempo real: integración con la API de ChatGPT (un futuro en el que Zundamon responda a las preguntas).
  • Mejora de la expresión emocional: animaciones más ricas (también quiero ver a Zundamon enfadado).
  • Soporte multilingüe: función de presentación en inglés (el nacimiento del Zundamon global).

Fue un proyecto que me hizo reafirmar el valor de utilizar la tecnología no solo de forma «seria», sino también «divertida».

Al final, puede que la ingeniería consista precisamente en eso: en «con cuánta seriedad nos tomamos el hacer tonterías».

¿Quiere aplicar esto en su empresa?

Nuestra recepción con IA «Cloudia» atiende solicitudes de entrevistas, charlas y preguntas sobre este artículo.

Support this article

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

Secure payment via Stripe
Última actualización: 23 de octubre de 2026

Artículos Relacionados

Leer artículo
Método de configuración de Codex MCP
Laboratorio

Cómo configurar Codex MCP para usarlo en Claude Desktop

Dado que Claude Code MCP dejó de funcionar, introduje el nuevo MCP de Codex CLI. Un registro real de resolución de problemas, desde el calvario de la configuración plagada de errores hasta la solución gracias a los consejos de Warp AI.

#MCP #Claude Desktop +4
Leer artículo
Planificación para YouTube LIVE
Laboratorio

【A toda velocidad en 15 minutos】 ¡Creando un servidor MCP con un servidor MCP! La historia detrás del desarrollo de la «app que se encarga de todo a la perfección»

El milagro nacido de la desesperación tras cancelarse una LT. Una crónica de la experiencia de vibe coding lograda con Claude Desktop y Claude Code

#MCP #Claude Desktop +3
Leer artículo
Laboratorio

Guía completa de Markdown: todo sobre la creación de artículos de blog

Guía completa de la sintaxis Markdown y las funciones de contenido enriquecido disponibles en el blog de Cor.Inc. Cubre todas las funciones para redactar artículos atractivos, como tarjetas de enlaces, fórmulas matemáticas y resaltado de código.

#Markdown #ブログ +3