voice
This commit is contained in:
		@@ -1,12 +1,15 @@
 | 
			
		||||
"use client";
 | 
			
		||||
import { useEffect, useRef, useState } from "react";
 | 
			
		||||
import "@/deps/live2d.min.js";
 | 
			
		||||
 | 
			
		||||
import "@/deps/cubism5.js";
 | 
			
		||||
import useVoice2Txt from "@/hooks/useVoice2txt";
 | 
			
		||||
import useTxt2Voice from "@/hooks/useTxt2Voice";
 | 
			
		||||
import axios from "axios";
 | 
			
		||||
import * as PIXI from "pixi.js";
 | 
			
		||||
import { Live2DModel } from "pixi-live2d-display/cubism2";
 | 
			
		||||
import { Live2DModel } from "pixi-live2d-display/cubism4";
 | 
			
		||||
import { useSearchParams } from "next/navigation";
 | 
			
		||||
import useRequest from "@/hooks/use-openai-request";
 | 
			
		||||
import txt2Voice from "@/hooks/txt2VoiceAPI";
 | 
			
		||||
 | 
			
		||||
// fake list
 | 
			
		||||
const opList = [
 | 
			
		||||
@@ -38,6 +41,8 @@ export default function Home() {
 | 
			
		||||
    const query = useSearchParams();
 | 
			
		||||
    const characterId = query.get("id");
 | 
			
		||||
    const token = query.get("token");
 | 
			
		||||
    localStorage.setItem("token", token || "");
 | 
			
		||||
    const { complete, completion: data, isLoading, abort } = useRequest();
 | 
			
		||||
    const voice2txt = (txt: string) => {
 | 
			
		||||
        fetch("sharkapiBaseUrl/voice/txt2voice", {
 | 
			
		||||
            method: "POST",
 | 
			
		||||
@@ -113,61 +118,27 @@ export default function Home() {
 | 
			
		||||
    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);
 | 
			
		||||
        }
 | 
			
		||||
        complete(1, [], [{
 | 
			
		||||
            content: inputText,
 | 
			
		||||
            role: "user",
 | 
			
		||||
        }]);
 | 
			
		||||
    };
 | 
			
		||||
    useEffect(() => {
 | 
			
		||||
        (async () => {
 | 
			
		||||
            if (data) {
 | 
			
		||||
                setResponse(data);
 | 
			
		||||
                if (typeof speak !== "undefined" && isLoading === false) {
 | 
			
		||||
                    const base64Voice = "data:audio/mp3;base64," + await txt2Voice(data, 4);
 | 
			
		||||
                    const audio = document.createElement("audio");
 | 
			
		||||
                    audio.src = base64Voice;
 | 
			
		||||
                    audio.play();
 | 
			
		||||
                } else {
 | 
			
		||||
                    model!.motion("tap_body");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        })();
 | 
			
		||||
 | 
			
		||||
    }, [data, isLoading]);
 | 
			
		||||
 | 
			
		||||
    const { start, end, text, isListening, error } = useVoice2Txt({
 | 
			
		||||
        lang: "cmn-Hans-CN",
 | 
			
		||||
@@ -212,7 +183,7 @@ export default function Home() {
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            const model = await Live2DModel.from(
 | 
			
		||||
                "https://cdn.jsdelivr.net/gh/guansss/pixi-live2d-display/test/assets/shizuku/shizuku.model.json"
 | 
			
		||||
                "https://cdn.jsdelivr.net/gh/guansss/pixi-live2d-display/test/assets/haru/haru_greeter_t03.model3.json"
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            app.stage.addChild(model);
 | 
			
		||||
@@ -241,7 +212,7 @@ export default function Home() {
 | 
			
		||||
    return (
 | 
			
		||||
        <main className="w-full h-full bg-blue-200">
 | 
			
		||||
            {typeof window !== "undefined" &&
 | 
			
		||||
                typeof window.Live2D !== "undefined" && (
 | 
			
		||||
                typeof window.Live2DCubismCore !== "undefined" && (
 | 
			
		||||
                    <div className="flex w-full flex-col h-full items-center justify-center relative text-white">
 | 
			
		||||
                        {/* live2d */}
 | 
			
		||||
                        <canvas className="w-full " id="canvas"></canvas>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user