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