diff --git a/src/app/helper.tsx b/src/app/helper.tsx index 95b96f6..530a838 100644 --- a/src/app/helper.tsx +++ b/src/app/helper.tsx @@ -10,323 +10,323 @@ import { Live2DModel } from "pixi-live2d-display/cubism2"; // fake list const opList = [ - { - id: 1, - title: "幸运转盘", - src: "http://picdown.jchysoft.com/uiIcon/xingyunzhuanpan.png", - }, - { - id: 2, - title: "领券中心", - src: "http://picdown.jchysoft.com/uiIcon/lingjuanzhongxin.png", - }, // bjt错别字将错就错版 - { - id: 3, - title: "0元抽", - src: "http://picdown.jchysoft.com/uiIcon/0yuanchou.png", - }, - { - id: 4, - title: "欧宝赏", - src: "http://picdown.jchysoft.com/uiIcon/oubanshang.png", - }, // bjt错别字 + { + id: 1, + title: "幸运转盘", + src: "http://picdown.jchysoft.com/uiIcon/xingyunzhuanpan.png", + }, + { + id: 2, + title: "领券中心", + src: "http://picdown.jchysoft.com/uiIcon/lingjuanzhongxin.png", + }, // bjt错别字将错就错版 + { + id: 3, + title: "0元抽", + src: "http://picdown.jchysoft.com/uiIcon/0yuanchou.png", + }, + { + id: 4, + title: "欧宝赏", + src: "http://picdown.jchysoft.com/uiIcon/oubanshang.png", + }, // bjt错别字 ]; //import "@/deps/live2dcubismcore.min.js" export default function Home() { - const [useVoice, setUseVoice] = useState(false); + const [useVoice, setUseVoice] = useState(false); - function draggable(model: any) { - model.buttonMode = true; - model.on("pointerdown", (e: any) => { - model.dragging = true; - model._pointerX = e.data.global.x - model.x; - model._pointerY = e.data.global.y - model.y; - }); - model.on("pointermove", (e: any) => { - if (model.dragging) { - model.position.x = e.data.global.x - model._pointerX; - model.position.y = e.data.global.y - model._pointerY; - } - }); - model.on("pointerupoutside", () => (model.dragging = false)); - model.on("pointerup", () => (model.dragging = false)); - } - - function addFrame(model: any) { - const foreground = PIXI.Sprite.from(PIXI.Texture.WHITE); - foreground.width = model.internalModel.width; - foreground.height = model.internalModel.height; - foreground.alpha = 0.2; - - model.addChild(foreground); - // 这里先叉了 - // checkbox("Model Frames", (checked: any) => (foreground.visible = checked)); - } - - function addHitAreaFrames(model: any) { - try { - //@ts-ignore - const hitAreaFrames = new PIXI.live2d.HitAreaFrames(); - - model.addChild(hitAreaFrames); - - checkbox( - "Hit Area Frames", - (checked: any) => (hitAreaFrames.visible = checked) - ); - } catch (err) {} - } - - function checkbox(name: any, onChange: any) { - const id = name.replace(/\W/g, "").toLowerCase(); - - let checkbox = document.getElementById(id); - - if (!checkbox) { - const p = document.createElement("p")!; - p.innerHTML = ` `; - - document!.getElementById("control")!.appendChild(p); - checkbox = p.firstChild as HTMLElement; - } - - checkbox.addEventListener("change", () => { - //@ts-ignore - onChange(checkbox.checked); - }); - //@ts-ignore - onChange(checkbox.checked); - } - const send = (inputText: string) => { - setResponse(inputText); - if (!inputText) return; - console.log(inputText); - let data = JSON.stringify({ - messages: [ - { - content: `回答用户的问题,尽可能简短。`, - role: "system", - }, - { - content: inputText, - role: "user", - }, - ], - model: "deepseek-chat", - frequency_penalty: 0, - max_tokens: 2048, - presence_penalty: 0, - stop: null, - stream: false, - temperature: 1, - top_p: 1, - }); - - let config = { - method: "post", - maxBodyLength: Infinity, - url: "https://api.deepseek.com/chat/completions", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - Authorization: "Bearer sk-dd24ae704e8d4939aeed8f050d04d36b", - }, - data: data, - }; - try { - axios(config) - .then((response) => { - console.log(`response`, response); - console.log(response.data); - - if (typeof speak !== "undefined") { - setResponse(response.data.choices[0].message.content); - speak(response.data.choices[0].message.content); - } else { - model!.motion("tap_body"); - } - }) - .catch((error) => { - // setResponse(error!.toString()); - console.log(error); + function draggable(model: any) { + model.buttonMode = true; + model.on("pointerdown", (e: any) => { + model.dragging = true; + model._pointerX = e.data.global.x - model.x; + model._pointerY = e.data.global.y - model.y; }); - } catch (error) { - setResponse(error!.toString()); - console.log(error); + model.on("pointermove", (e: any) => { + if (model.dragging) { + model.position.x = e.data.global.x - model._pointerX; + model.position.y = e.data.global.y - model._pointerY; + } + }); + model.on("pointerupoutside", () => (model.dragging = false)); + model.on("pointerup", () => (model.dragging = false)); } - }; - const { start, end, text, isListening, error } = useVoice2Txt({ - lang: "cmn-Hans-CN", - continuous: false, - }); + function addFrame(model: any) { + const foreground = PIXI.Sprite.from(PIXI.Texture.WHITE); + foreground.width = model.internalModel.width; + foreground.height = model.internalModel.height; + foreground.alpha = 0.2; - const { isSpeaking, speak, stop } = useTxt2Voice(); - const [inputText, setInputText] = useState(""); - const isMouthOpen = useRef(false); - const [response, setResponse] = useState("来和我聊天吧~"); - useEffect(() => { - console.log(text, error); - if (!text) return; - send(text); - // 先叉了这里防止消息展示error - // if (error) { - // setResponse(error); - // return; - // } - }, [text, error]); - const [model, setModel] = useState(); - useEffect(() => { - if (!isSpeaking) { - isMouthOpen.current = false; + model.addChild(foreground); + // 这里先叉了 + // checkbox("Model Frames", (checked: any) => (foreground.visible = checked)); } - }, [isSpeaking]); - useEffect(() => { - if (!isListening && !isSpeaking) { + function addHitAreaFrames(model: any) { + try { + //@ts-ignore + const hitAreaFrames = new PIXI.live2d.HitAreaFrames(); + + model.addChild(hitAreaFrames); + + checkbox( + "Hit Area Frames", + (checked: any) => (hitAreaFrames.visible = checked) + ); + } catch (err) { } } - }, [isListening]); - useEffect(() => { - // expose PIXI to window so that this plugin is able to - // reference window.PIXI.Ticker to automatically update Live2D models - //@ts-ignore - typeof window !== "undefined" && (window.PIXI = PIXI); - (async function () { - const app = new PIXI.Application({ - view: document.getElementById("canvas") as HTMLCanvasElement, - backgroundAlpha: 1, - }); + function checkbox(name: any, onChange: any) { + const id = name.replace(/\W/g, "").toLowerCase(); - const model = await Live2DModel.from( - "https://cdn.jsdelivr.net/gh/guansss/pixi-live2d-display/test/assets/shizuku/shizuku.model.json" - ); + let checkbox = document.getElementById(id); - app.stage.addChild(model); - const scaleX = (innerWidth * 0.4) / model.width; - const scaleY = (innerHeight * 0.8) / model.height; + if (!checkbox) { + const p = document.createElement("p")!; + p.innerHTML = ` `; - // fit the window - model.scale.set(0.3); - - model.y = innerHeight * 0.1; - - draggable(model); - addFrame(model); - addHitAreaFrames(model); - setModel(model); - model.on("hit", (hitAreas) => { - if (hitAreas.includes("body")) { - model.motion("tap_body"); - model.motion("speak"); + document!.getElementById("control")!.appendChild(p); + checkbox = p.firstChild as HTMLElement; } - }); - })(); - }, []); - return ( -
- {typeof window !== "undefined" && - typeof window.Live2D !== "undefined" && ( -
- {/* live2d */} - + checkbox.addEventListener("change", () => { + //@ts-ignore + onChange(checkbox.checked); + }); + //@ts-ignore + onChange(checkbox.checked); + } + const send = (inputText: string) => { + setResponse(inputText); + if (!inputText) return; + console.log(inputText); + let data = JSON.stringify({ + messages: [ + { + content: `回答用户的问题,尽可能简短。`, + role: "system", + }, + { + content: inputText, + role: "user", + }, + ], + model: "deepseek-chat", + frequency_penalty: 0, + max_tokens: 2048, + presence_penalty: 0, + stop: null, + stream: false, + temperature: 1, + top_p: 1, + }); - {/* 旧叉 */} - {/*
+ let config = { + method: "post", + maxBodyLength: Infinity, + url: "https://api.deepseek.com/chat/completions", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: "Bearer sk-dd24ae704e8d4939aeed8f050d04d36b", + }, + data: data, + }; + try { + axios(config) + .then((response) => { + console.log(`response`, response); + console.log(response.data); + + if (typeof speak !== "undefined") { + setResponse(response.data.choices[0].message.content); + speak(response.data.choices[0].message.content); + } else { + model!.motion("tap_body"); + } + }) + .catch((error) => { + // setResponse(error!.toString()); + console.log(error); + }); + } catch (error) { + setResponse(error!.toString()); + console.log(error); + } + }; + + const { start, end, text, isListening, error } = useVoice2Txt({ + lang: "cmn-Hans-CN", + continuous: false, + }); + + const { isSpeaking, speak, stop } = useTxt2Voice(); + const [inputText, setInputText] = useState(""); + const isMouthOpen = useRef(false); + const [response, setResponse] = useState("来和我聊天吧~"); + useEffect(() => { + console.log(text, error); + if (!text) return; + send(text); + // 先叉了这里防止消息展示error + // if (error) { + // setResponse(error); + // return; + // } + }, [text, error]); + const [model, setModel] = useState(); + useEffect(() => { + if (!isSpeaking) { + isMouthOpen.current = false; + } + }, [isSpeaking]); + + useEffect(() => { + if (!isListening && !isSpeaking) { + } + }, [isListening]); + + useEffect(() => { + // expose PIXI to window so that this plugin is able to + // reference window.PIXI.Ticker to automatically update Live2D models + //@ts-ignore + typeof window !== "undefined" && (window.PIXI = PIXI); + (async function () { + const app = new PIXI.Application({ + view: document.getElementById("canvas") as HTMLCanvasElement, + backgroundAlpha: 0, + }); + + const model = await Live2DModel.from( + "https://cdn.jsdelivr.net/gh/guansss/pixi-live2d-display/test/assets/shizuku/shizuku.model.json" + ); + + app.stage.addChild(model); + const scaleX = (innerWidth * 0.4) / model.width; + const scaleY = (innerHeight * 0.8) / model.height; + + // fit the window + model.scale.set(0.3); + + model.y = innerHeight * 0.1; + + draggable(model); + addFrame(model); + addHitAreaFrames(model); + setModel(model); + model.on("hit", (hitAreas) => { + if (hitAreas.includes("body")) { + model.motion("tap_body"); + model.motion("speak"); + } + }); + console.log("ok") + })(); + }, []); + + return ( +
+ {typeof window !== "undefined" && + typeof window.Live2D !== "undefined" && ( +
+ {/* live2d */} + + + {/* 旧叉 */} + {/*
{response ? response : "请输入文字和我聊天吧"}
*/} - {/* 角色信息 */} -
-
-
昵称
-
+ {/* 角色信息 */} +
+
+
昵称
+
- {/* 消息泡泡 */} -
- {response ? response : "请输入文字和我聊天吧"} -
+ {/* 消息泡泡 */} +
+ {response ? response : "请输入文字和我聊天吧"} +
- {/* 选项 */} -
- {opList.map((item) => ( -
-
- {item.title} -
-
{item.title}
-
- ))} -
+ {/* 选项 */} +
+ {opList.map((item) => ( +
+
+ {item.title} +
+
{item.title}
+
+ ))} +
- {/* 旧叉 */} - {/*
*/} - {/* + {/* 旧叉 */} + {/*
*/} + {/* */} - {/* 输入框 */} -
- - {useVoice ? ( - - ) : ( - { - setInputText(e.target.value); - console.log(e.target.value); - }} - > - )} - -
-
- )} -
- ); + {/* 输入框 */} +
+ + {useVoice ? ( + + ) : ( + { + setInputText(e.target.value); + console.log(e.target.value); + }} + > + )} + +
+
+ )} +
+ ); }