chore: complete @yume → @infiplot rename (post-PR#9)
PR #9 已完成首页和 layout 的视觉品牌迁移,此 commit 补齐剩余的 技术性改名 —— workspace 包名、source import、localStorage 键、 CSS keyframe、内部 header logo、.env.example、README。 - @yume/* → @infiplot/* (6 package.json + 17 imports + lockfile) - localStorage/sessionStorage: yume:* → infiplot:* (含 PR #9 新增的 yume:hintClosed) - CSS keyframe yume-ripple → infiplot-ripple - new/play 页面 header logo "云梦" → "InfiPlot" - 代码注释中的「云梦」style 形容词删除(layout.tsx, page.tsx) - 根 package.json name + description(描述跟齐 staging "AI 实时交互剧情游戏") - README: tagline / Vercel deploy URL / 目录树 / engine 描述 保留:prompts.ts 的 LLM 体裁术语「视觉小说/galgame」、CustomForm placeholder 的「视觉小说画风」(图像模型识别的风格名词)。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# 云梦
|
||||
# InfiPlot
|
||||
|
||||
> An AI-driven visual novel painted by an AI, one scene at a time. You talk and explore within a scene; when the story turns a corner, it paints the next. You click. It paints. The story unfolds.
|
||||
> A real-time AI-generated interactive story game — painted scene by scene. You talk and explore within a scene; when the story turns a corner, it paints the next. You click. It paints. The story unfolds.
|
||||
|
||||
---
|
||||
|
||||
@@ -37,7 +37,7 @@ There is no traditional game UI baked into the art. The AI paints the world in w
|
||||
|
||||
## One-click deploy
|
||||
|
||||
[](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/yume&root-directory=apps/web&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision%2Ftts.&envLink=https://github.com/zonghaoyuan/yume%23environment-variables)
|
||||
[](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&root-directory=apps/web&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision%2Ftts.&envLink=https://github.com/zonghaoyuan/infiplot%23environment-variables)
|
||||
|
||||
After deploy, set the environment variables (see below) in your Vercel project. Nine are required; TTS is optional (leave blank to run silently); `MOCK_IMAGE=true` skips image generation for cheap TTS-only testing. The Vercel project's **Root Directory** must be set to `apps/web` (the deploy button passes this; if you configure manually, set it in Project Settings).
|
||||
|
||||
@@ -81,7 +81,7 @@ pnpm dev
|
||||
## Project layout
|
||||
|
||||
```
|
||||
yume/
|
||||
infiplot/
|
||||
├── apps/web/ Next.js 16 app — pages + API routes (Vercel root)
|
||||
└── packages/
|
||||
├── types/ shared TypeScript types
|
||||
@@ -90,7 +90,7 @@ yume/
|
||||
└── engine/ multi-agent AI orchestration (open core)
|
||||
```
|
||||
|
||||
`packages/engine` is the open core — pure TS, no Next.js or browser dependency. Import it directly to build your own visual-novel front-end (Tauri, Electron, CLI, anywhere).
|
||||
`packages/engine` is the open core — pure TS, no Next.js or browser dependency. Import it directly to build your own interactive-narrative front-end (Tauri, Electron, CLI, anywhere).
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# =============================================================
|
||||
# 云梦 — AI 视觉小说
|
||||
# InfiPlot — AI 实时交互剧情游戏
|
||||
# Recommended setup: Xiaomi MiMo Token Plan for TEXT / VISION / TTS
|
||||
# (one API key covers all three) + Runware for IMAGE (FLUX.2 [klein]).
|
||||
#
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { requestBeatAudio } from "@yume/engine";
|
||||
import type { BeatAudioRequest } from "@yume/types";
|
||||
import { requestBeatAudio } from "@infiplot/engine";
|
||||
import type { BeatAudioRequest } from "@infiplot/types";
|
||||
import { NextResponse } from "next/server";
|
||||
import { loadEngineConfig } from "@/lib/config";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { requestInsertBeat } from "@yume/engine";
|
||||
import type { InsertBeatRequest } from "@yume/types";
|
||||
import { requestInsertBeat } from "@infiplot/engine";
|
||||
import type { InsertBeatRequest } from "@infiplot/types";
|
||||
import { NextResponse } from "next/server";
|
||||
import { loadEngineConfig } from "@/lib/config";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { requestScene } from "@yume/engine";
|
||||
import type { SceneRequest } from "@yume/types";
|
||||
import { requestScene } from "@infiplot/engine";
|
||||
import type { SceneRequest } from "@infiplot/types";
|
||||
import { NextResponse } from "next/server";
|
||||
import { loadEngineConfig } from "@/lib/config";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { startSession } from "@yume/engine";
|
||||
import type { StartRequest } from "@yume/types";
|
||||
import { startSession } from "@infiplot/engine";
|
||||
import type { StartRequest } from "@infiplot/types";
|
||||
import { NextResponse } from "next/server";
|
||||
import { loadEngineConfig } from "@/lib/config";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { visionDecide } from "@yume/engine";
|
||||
import type { VisionRequest } from "@yume/types";
|
||||
import { visionDecide } from "@infiplot/engine";
|
||||
import type { VisionRequest } from "@infiplot/types";
|
||||
import { NextResponse } from "next/server";
|
||||
import { loadEngineConfig } from "@/lib/config";
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes yume-ripple {
|
||||
@keyframes infiplot-ripple {
|
||||
0% {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
|
||||
@@ -2,7 +2,7 @@ import type { Metadata } from "next";
|
||||
import { Cormorant_Garamond, Inter } from "next/font/google";
|
||||
import "./globals.css";
|
||||
|
||||
// Editorial 云梦 fonts: drive tailwind `font-serif`/`font-sans` via
|
||||
// Editorial fonts: drive tailwind `font-serif`/`font-sans` via
|
||||
// --font-serif / --font-sans across every page (home, /play, /new, CustomForm).
|
||||
const cormorant = Cormorant_Garamond({
|
||||
subsets: ["latin"],
|
||||
|
||||
@@ -10,7 +10,7 @@ export default function NewPage() {
|
||||
className="text-[10px] smallcaps text-clay-700 hover:text-clay-900 transition-colors flex items-center gap-2"
|
||||
>
|
||||
<i className="fa-solid fa-arrow-left text-[9px]" />
|
||||
云梦
|
||||
InfiPlot
|
||||
</Link>
|
||||
<span className="text-[10px] smallcaps text-clay-500">
|
||||
编 织 一 个 世 界
|
||||
|
||||
@@ -4,7 +4,7 @@ import { useRouter } from "next/navigation";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
|
||||
/* ============================================================================
|
||||
InfiPlot · 首页(云梦编辑式视觉风格 · 居中构图,呼应低保真原型)
|
||||
InfiPlot · 首页(编辑式视觉风格 · 居中构图,呼应低保真原型)
|
||||
- 顶部 Header:左上角衬线 wordmark logo
|
||||
- Hero 控制区(居中):标题 / prompt 输入框 + 开始 / 5 个类别选择器
|
||||
- 统一瀑布流(居中定宽):7 张主推 + 16 张画廊,按性向整体 crossfade 切换
|
||||
@@ -399,7 +399,7 @@ export default function HomePage() {
|
||||
const [prompt, setPrompt] = useState("");
|
||||
const inputRef = useRef<HTMLTextAreaElement>(null);
|
||||
|
||||
// 顶部使用提示:默认展示,用户可点 × 永久关闭(localStorage:yume:hintClosed)。
|
||||
// 顶部使用提示:默认展示,用户可点 × 永久关闭(localStorage:infiplot:hintClosed)。
|
||||
const [hintClosed, setHintClosed] = useState(false);
|
||||
|
||||
const styleRow = OPTS.findIndex((o) => o.modal);
|
||||
@@ -432,7 +432,7 @@ export default function HomePage() {
|
||||
|
||||
useEffect(() => {
|
||||
try {
|
||||
if (localStorage.getItem("yume:hintClosed") === "1") setHintClosed(true);
|
||||
if (localStorage.getItem("infiplot:hintClosed") === "1") setHintClosed(true);
|
||||
} catch {
|
||||
/* ignore */
|
||||
}
|
||||
@@ -449,7 +449,7 @@ export default function HomePage() {
|
||||
const closeHint = () => {
|
||||
setHintClosed(true);
|
||||
try {
|
||||
localStorage.setItem("yume:hintClosed", "1");
|
||||
localStorage.setItem("infiplot:hintClosed", "1");
|
||||
} catch {
|
||||
/* ignore */
|
||||
}
|
||||
@@ -496,7 +496,7 @@ export default function HomePage() {
|
||||
const audioEnabled = voice === "开启";
|
||||
|
||||
sessionStorage.setItem(
|
||||
"yume:custom",
|
||||
"infiplot:custom",
|
||||
JSON.stringify({ worldSetting, styleGuide, audioEnabled }),
|
||||
);
|
||||
router.push("/play?custom=1");
|
||||
@@ -610,7 +610,7 @@ export default function HomePage() {
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* 使用提示:可被用户永久关闭(localStorage:yume:hintClosed) */}
|
||||
{/* 使用提示:可被用户永久关闭(localStorage:infiplot:hintClosed) */}
|
||||
{!hintClosed && (
|
||||
<div className="relative mx-auto mt-10 md:mt-12 max-w-[640px] rounded-sm border border-clay-900/10 bg-cream-100/50 px-8 py-3.5">
|
||||
<p className="font-serif text-[13px] md:text-sm leading-relaxed text-clay-500">
|
||||
|
||||
@@ -24,9 +24,9 @@ import type {
|
||||
Session,
|
||||
StartResponse,
|
||||
VisionResponse,
|
||||
} from "@yume/types";
|
||||
} from "@infiplot/types";
|
||||
|
||||
const MUTED_STORAGE_KEY = "yume:muted";
|
||||
const MUTED_STORAGE_KEY = "infiplot:muted";
|
||||
|
||||
// Cap how long we wait for the browser to download + decode a scene image
|
||||
// before giving up and rendering anyway. Runware's CDN is normally <2s for a
|
||||
@@ -485,7 +485,7 @@ function PlayInner() {
|
||||
const p = PRESETS.find((x) => x.id === presetId);
|
||||
if (p) payload = { worldSetting: p.worldSetting, styleGuide: p.styleGuide };
|
||||
} else if (params.get("custom") === "1") {
|
||||
const stored = sessionStorage.getItem("yume:custom");
|
||||
const stored = sessionStorage.getItem("infiplot:custom");
|
||||
if (stored) {
|
||||
try {
|
||||
const parsed = JSON.parse(stored) as {
|
||||
@@ -890,7 +890,7 @@ function PlayInner() {
|
||||
className="text-[10px] smallcaps text-clay-600 hover:text-clay-900 transition-colors flex items-center gap-2"
|
||||
>
|
||||
<i className="fa-solid fa-arrow-left text-[9px]" />
|
||||
云梦
|
||||
InfiPlot
|
||||
</Link>
|
||||
<div className="flex items-center gap-3 text-[10px] smallcaps text-clay-500 num">
|
||||
<span>第 · {String(sceneCount).padStart(3, "0")} · 幕</span>
|
||||
|
||||
@@ -19,7 +19,7 @@ export function CustomForm() {
|
||||
if (!canSubmit) return;
|
||||
setSubmitting(true);
|
||||
sessionStorage.setItem(
|
||||
"yume:custom",
|
||||
"infiplot:custom",
|
||||
JSON.stringify({ worldSetting, styleGuide }),
|
||||
);
|
||||
router.push("/play?custom=1");
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"use client";
|
||||
|
||||
import { useCallback, useEffect, useRef, useState } from "react";
|
||||
import type { Beat, BeatChoice } from "@yume/types";
|
||||
import type { Beat, BeatChoice } from "@infiplot/types";
|
||||
|
||||
export type Phase =
|
||||
| "loading-first" // first scene not yet rendered
|
||||
@@ -439,7 +439,7 @@ export function PlayCanvas({
|
||||
width: 30,
|
||||
height: 30,
|
||||
animation:
|
||||
"yume-ripple 1.6s cubic-bezier(0.16,1,0.3,1) infinite",
|
||||
"infiplot-ripple 1.6s cubic-bezier(0.16,1,0.3,1) infinite",
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { EngineConfig, TtsConfig } from "@yume/types";
|
||||
import type { EngineConfig, TtsConfig } from "@infiplot/types";
|
||||
|
||||
function readVar(name: string): string {
|
||||
const v = process.env[name];
|
||||
|
||||
@@ -5,10 +5,10 @@ const config: NextConfig = {
|
||||
reactStrictMode: true,
|
||||
typedRoutes: false,
|
||||
transpilePackages: [
|
||||
"@yume/engine",
|
||||
"@yume/ai-client",
|
||||
"@yume/types",
|
||||
"@yume/tts-client",
|
||||
"@infiplot/engine",
|
||||
"@infiplot/ai-client",
|
||||
"@infiplot/types",
|
||||
"@infiplot/tts-client",
|
||||
],
|
||||
serverExternalPackages: ["sharp"],
|
||||
turbopack: {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "@yume/web",
|
||||
"name": "@infiplot/web",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
@@ -11,9 +11,9 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@yume/ai-client": "workspace:*",
|
||||
"@yume/engine": "workspace:*",
|
||||
"@yume/types": "workspace:*",
|
||||
"@infiplot/ai-client": "workspace:*",
|
||||
"@infiplot/engine": "workspace:*",
|
||||
"@infiplot/types": "workspace:*",
|
||||
"next": "^16.0.0",
|
||||
"react": "^19.0.0",
|
||||
"react-dom": "^19.0.0",
|
||||
|
||||
+5
-5
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"name": "yume",
|
||||
"name": "infiplot",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "AI 驱动的视觉小说(云梦)",
|
||||
"description": "AI 实时交互剧情游戏",
|
||||
"license": "UNLICENSED",
|
||||
"packageManager": "pnpm@9.12.0",
|
||||
"engines": {
|
||||
"node": ">=20"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "pnpm --filter @yume/web dev",
|
||||
"build": "pnpm --filter @yume/web build",
|
||||
"start": "pnpm --filter @yume/web start",
|
||||
"dev": "pnpm --filter @infiplot/web dev",
|
||||
"build": "pnpm --filter @infiplot/web build",
|
||||
"start": "pnpm --filter @infiplot/web start",
|
||||
"lint": "pnpm -r lint",
|
||||
"typecheck": "pnpm -r typecheck"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "@yume/ai-client",
|
||||
"name": "@infiplot/ai-client",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
@@ -12,6 +12,6 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@yume/types": "workspace:*"
|
||||
"@infiplot/types": "workspace:*"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { ProviderConfig } from "@yume/types";
|
||||
import type { ProviderConfig } from "@infiplot/types";
|
||||
import { fetchWithRetry } from "./fetchWithRetry";
|
||||
|
||||
export type ChatMessage = {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { ProviderConfig } from "@yume/types";
|
||||
import type { ProviderConfig } from "@infiplot/types";
|
||||
import { fetchWithRetry } from "./fetchWithRetry";
|
||||
|
||||
// Runware uses its own task-array protocol (not OpenAI-compatible).
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { ProviderConfig } from "@yume/types";
|
||||
import type { ProviderConfig } from "@infiplot/types";
|
||||
import { fetchWithRetry } from "./fetchWithRetry";
|
||||
|
||||
export async function interpretClick(
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "@yume/engine",
|
||||
"name": "@infiplot/engine",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
@@ -12,9 +12,9 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@yume/ai-client": "workspace:*",
|
||||
"@yume/tts-client": "workspace:*",
|
||||
"@yume/types": "workspace:*",
|
||||
"@infiplot/ai-client": "workspace:*",
|
||||
"@infiplot/tts-client": "workspace:*",
|
||||
"@infiplot/types": "workspace:*",
|
||||
"jsonrepair": "^3.14.0",
|
||||
"sharp": "^0.33.5"
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { chat, generateImage } from "@yume/ai-client";
|
||||
import { provisionVoice } from "@yume/tts-client";
|
||||
import { chat, generateImage } from "@infiplot/ai-client";
|
||||
import { provisionVoice } from "@infiplot/tts-client";
|
||||
import type {
|
||||
Character,
|
||||
CharacterVoice,
|
||||
EngineConfig,
|
||||
Session,
|
||||
} from "@yume/types";
|
||||
} from "@infiplot/types";
|
||||
import { parseJsonLoose } from "../jsonParser";
|
||||
import { mockImageDataUri } from "../mockImage";
|
||||
import {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { chat } from "@yume/ai-client";
|
||||
import type { BeatActiveCharacter, ProviderConfig } from "@yume/types";
|
||||
import { chat } from "@infiplot/ai-client";
|
||||
import type { BeatActiveCharacter, ProviderConfig } from "@infiplot/types";
|
||||
import { parseJsonLoose } from "../jsonParser";
|
||||
import {
|
||||
CINEMATOGRAPHER_SYSTEM,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { generateImage } from "@yume/ai-client";
|
||||
import type { GenerateImageOptions, GenerateImageResult } from "@yume/ai-client";
|
||||
import { generateImage } from "@infiplot/ai-client";
|
||||
import type { GenerateImageOptions, GenerateImageResult } from "@infiplot/ai-client";
|
||||
import type {
|
||||
Beat,
|
||||
Character,
|
||||
EngineConfig,
|
||||
ProviderConfig,
|
||||
} from "@yume/types";
|
||||
} from "@infiplot/types";
|
||||
import { mockImageDataUri } from "../mockImage";
|
||||
import { buildPainterPrompt } from "../prompts";
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { chat } from "@yume/ai-client";
|
||||
import { chat } from "@infiplot/ai-client";
|
||||
import type {
|
||||
Beat,
|
||||
BeatActiveCharacter,
|
||||
@@ -7,7 +7,7 @@ import type {
|
||||
BeatNext,
|
||||
ProviderConfig,
|
||||
Session,
|
||||
} from "@yume/types";
|
||||
} from "@infiplot/types";
|
||||
import { parseJsonLoose } from "../jsonParser";
|
||||
import { WRITER_SYSTEM, buildWriterUserMessage } from "../prompts";
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { chat } from "@yume/ai-client";
|
||||
import { chat } from "@infiplot/ai-client";
|
||||
import type {
|
||||
Character,
|
||||
EngineConfig,
|
||||
@@ -6,7 +6,7 @@ import type {
|
||||
ProviderConfig,
|
||||
Scene,
|
||||
Session,
|
||||
} from "@yume/types";
|
||||
} from "@infiplot/types";
|
||||
import { designCharacter, provisionVoiceForName } from "./agents/characterDesigner";
|
||||
import { runCinematographer } from "./agents/cinematographer";
|
||||
import { runPainter } from "./agents/painter";
|
||||
|
||||
@@ -11,5 +11,5 @@ export { mergeCharacters } from "./director";
|
||||
export type { SceneResult } from "./director";
|
||||
export type { WriterOutput } from "./agents/writer";
|
||||
export type { CinematographerOutput } from "./agents/cinematographer";
|
||||
export type { InsertBeatPartial } from "@yume/types";
|
||||
export type { InsertBeatPartial } from "@infiplot/types";
|
||||
export * from "./prompts";
|
||||
|
||||
@@ -11,7 +11,7 @@ import type {
|
||||
StartResponse,
|
||||
VisionRequest,
|
||||
VisionResponse,
|
||||
} from "@yume/types";
|
||||
} from "@infiplot/types";
|
||||
import { annotateClick } from "./annotate";
|
||||
import { directInsertBeat, directScene } from "./director";
|
||||
import { synthesizeBeat } from "./voice";
|
||||
|
||||
@@ -3,7 +3,7 @@ import type {
|
||||
Character,
|
||||
Scene,
|
||||
Session,
|
||||
} from "@yume/types";
|
||||
} from "@infiplot/types";
|
||||
|
||||
// ══════════════════════════════════════════════════════════════════════
|
||||
// Multi-agent scene generation pipeline:
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { interpretClick } from "@yume/ai-client";
|
||||
import { interpretClick } from "@infiplot/ai-client";
|
||||
import type {
|
||||
ClickIntent,
|
||||
ProviderConfig,
|
||||
Scene,
|
||||
VisionClassify,
|
||||
} from "@yume/types";
|
||||
} from "@infiplot/types";
|
||||
import { parseJsonLoose } from "./jsonParser";
|
||||
import { VISION_SYSTEM_PROMPT, buildVisionUserPrompt } from "./prompts";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { synthesize } from "@yume/tts-client";
|
||||
import type { BeatAudio, CharacterVoice, TtsConfig } from "@yume/types";
|
||||
import { synthesize } from "@infiplot/tts-client";
|
||||
import type { BeatAudio, CharacterVoice, TtsConfig } from "@infiplot/types";
|
||||
|
||||
// Per-beat synth budget. MiMo's median synth is 3–7s; the tail can spike
|
||||
// to 30–70s under concurrent load. Capping here means a single bad beat
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "@yume/tts-client",
|
||||
"name": "@infiplot/tts-client",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
@@ -12,6 +12,6 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@yume/types": "workspace:*"
|
||||
"@infiplot/types": "workspace:*"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { CharacterVoice, TtsConfig } from "@yume/types";
|
||||
import type { CharacterVoice, TtsConfig } from "@infiplot/types";
|
||||
|
||||
// Xiaomi MiMo currently outputs wav / pcm16 only (mp3 not supported for output).
|
||||
// The reference clip we persist is therefore wav. Kept as a single switch so we
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "@yume/types",
|
||||
"name": "@infiplot/types",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
|
||||
Generated
+25
-25
@@ -14,13 +14,13 @@ importers:
|
||||
|
||||
apps/web:
|
||||
dependencies:
|
||||
'@yume/ai-client':
|
||||
'@infiplot/ai-client':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/ai-client
|
||||
'@yume/engine':
|
||||
'@infiplot/engine':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/engine
|
||||
'@yume/types':
|
||||
'@infiplot/types':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/types
|
||||
next:
|
||||
@@ -60,19 +60,19 @@ importers:
|
||||
|
||||
packages/ai-client:
|
||||
dependencies:
|
||||
'@yume/types':
|
||||
'@infiplot/types':
|
||||
specifier: workspace:*
|
||||
version: link:../types
|
||||
|
||||
packages/engine:
|
||||
dependencies:
|
||||
'@yume/ai-client':
|
||||
'@infiplot/ai-client':
|
||||
specifier: workspace:*
|
||||
version: link:../ai-client
|
||||
'@yume/tts-client':
|
||||
'@infiplot/tts-client':
|
||||
specifier: workspace:*
|
||||
version: link:../tts-client
|
||||
'@yume/types':
|
||||
'@infiplot/types':
|
||||
specifier: workspace:*
|
||||
version: link:../types
|
||||
jsonrepair:
|
||||
@@ -84,7 +84,7 @@ importers:
|
||||
|
||||
packages/tts-client:
|
||||
dependencies:
|
||||
'@yume/types':
|
||||
'@infiplot/types':
|
||||
specifier: workspace:*
|
||||
version: link:../types
|
||||
|
||||
@@ -448,8 +448,8 @@ packages:
|
||||
peerDependencies:
|
||||
postcss: ^8.1.0
|
||||
|
||||
baseline-browser-mapping@2.10.32:
|
||||
resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==}
|
||||
baseline-browser-mapping@2.10.33:
|
||||
resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
hasBin: true
|
||||
|
||||
@@ -516,8 +516,8 @@ packages:
|
||||
dlv@1.1.3:
|
||||
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
|
||||
|
||||
electron-to-chromium@1.5.361:
|
||||
resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==}
|
||||
electron-to-chromium@1.5.364:
|
||||
resolution: {integrity: sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==}
|
||||
|
||||
es-errors@1.3.0:
|
||||
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
||||
@@ -566,8 +566,8 @@ packages:
|
||||
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
||||
engines: {node: '>=10.13.0'}
|
||||
|
||||
hasown@2.0.3:
|
||||
resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==}
|
||||
hasown@2.0.4:
|
||||
resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
is-arrayish@0.3.4:
|
||||
@@ -822,8 +822,8 @@ packages:
|
||||
thenify@3.3.1:
|
||||
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
|
||||
|
||||
tinyglobby@0.2.16:
|
||||
resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
|
||||
tinyglobby@0.2.17:
|
||||
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
|
||||
to-regex-range@5.0.1:
|
||||
@@ -1120,7 +1120,7 @@ snapshots:
|
||||
postcss: 8.5.15
|
||||
postcss-value-parser: 4.2.0
|
||||
|
||||
baseline-browser-mapping@2.10.32: {}
|
||||
baseline-browser-mapping@2.10.33: {}
|
||||
|
||||
binary-extensions@2.3.0: {}
|
||||
|
||||
@@ -1130,9 +1130,9 @@ snapshots:
|
||||
|
||||
browserslist@4.28.2:
|
||||
dependencies:
|
||||
baseline-browser-mapping: 2.10.32
|
||||
baseline-browser-mapping: 2.10.33
|
||||
caniuse-lite: 1.0.30001793
|
||||
electron-to-chromium: 1.5.361
|
||||
electron-to-chromium: 1.5.364
|
||||
node-releases: 2.0.46
|
||||
update-browserslist-db: 1.2.3(browserslist@4.28.2)
|
||||
|
||||
@@ -1182,7 +1182,7 @@ snapshots:
|
||||
|
||||
dlv@1.1.3: {}
|
||||
|
||||
electron-to-chromium@1.5.361: {}
|
||||
electron-to-chromium@1.5.364: {}
|
||||
|
||||
es-errors@1.3.0: {}
|
||||
|
||||
@@ -1223,7 +1223,7 @@ snapshots:
|
||||
dependencies:
|
||||
is-glob: 4.0.3
|
||||
|
||||
hasown@2.0.3:
|
||||
hasown@2.0.4:
|
||||
dependencies:
|
||||
function-bind: 1.1.2
|
||||
|
||||
@@ -1235,7 +1235,7 @@ snapshots:
|
||||
|
||||
is-core-module@2.16.2:
|
||||
dependencies:
|
||||
hasown: 2.0.3
|
||||
hasown: 2.0.4
|
||||
|
||||
is-extglob@2.1.1: {}
|
||||
|
||||
@@ -1272,7 +1272,7 @@ snapshots:
|
||||
dependencies:
|
||||
'@next/env': 16.2.6
|
||||
'@swc/helpers': 0.5.15
|
||||
baseline-browser-mapping: 2.10.32
|
||||
baseline-browser-mapping: 2.10.33
|
||||
caniuse-lite: 1.0.30001793
|
||||
postcss: 8.4.31
|
||||
react: 19.2.6
|
||||
@@ -1465,7 +1465,7 @@ snapshots:
|
||||
lines-and-columns: 1.2.4
|
||||
mz: 2.7.0
|
||||
pirates: 4.0.7
|
||||
tinyglobby: 0.2.16
|
||||
tinyglobby: 0.2.17
|
||||
ts-interface-checker: 0.1.13
|
||||
|
||||
supports-preserve-symlinks-flag@1.0.0: {}
|
||||
@@ -1506,7 +1506,7 @@ snapshots:
|
||||
dependencies:
|
||||
any-promise: 1.3.0
|
||||
|
||||
tinyglobby@0.2.16:
|
||||
tinyglobby@0.2.17:
|
||||
dependencies:
|
||||
fdir: 6.5.0(picomatch@4.0.4)
|
||||
picomatch: 4.0.4
|
||||
|
||||
Reference in New Issue
Block a user