update assets & flow

main
reng 4 months ago
parent e8c557cd2f
commit 0dba15b34e
  1. BIN
      vite/public/assets/ai/ai-01.mp3
  2. BIN
      vite/public/assets/ai/ai-03.mp3
  3. BIN
      vite/public/assets/ai/ai-04.mp3
  4. BIN
      vite/public/assets/ai/ai-05.mp3
  5. BIN
      vite/public/assets/ai/ai-06.mp3
  6. BIN
      vite/public/assets/ai/ai-07.mp3
  7. BIN
      vite/public/assets/ai/ai-08.mp3
  8. 0
      vite/public/assets/archive/q1.mp3
  9. 0
      vite/public/assets/archive/q2.mp3
  10. 0
      vite/public/assets/archive/q3.mp3
  11. 0
      vite/public/assets/archive/q4-1.mp3
  12. 0
      vite/public/assets/archive/q4-2.mp3
  13. 0
      vite/public/assets/archive/q4-2__.mp3
  14. 0
      vite/public/assets/archive/q4.mp3
  15. 0
      vite/public/assets/archive/q5-2.mp3
  16. 0
      vite/public/assets/archive/q5.mp3
  17. 0
      vite/public/assets/archive/q6.mp3
  18. BIN
      vite/public/assets/bg-03.mp3
  19. BIN
      vite/public/assets/number/0.mp3
  20. BIN
      vite/public/assets/number/1.mp3
  21. BIN
      vite/public/assets/number/2.mp3
  22. BIN
      vite/public/assets/number/3.mp3
  23. BIN
      vite/public/assets/number/4.mp3
  24. BIN
      vite/public/assets/number/5.mp3
  25. BIN
      vite/public/assets/number/6.mp3
  26. BIN
      vite/public/assets/number/7.mp3
  27. BIN
      vite/public/assets/number/8.mp3
  28. BIN
      vite/public/assets/number/9.mp3
  29. BIN
      vite/public/assets/number/a.mp3
  30. BIN
      vite/public/assets/number/error.mp3
  31. BIN
      vite/public/assets/number/old/0.mp3
  32. BIN
      vite/public/assets/number/old/1.mp3
  33. BIN
      vite/public/assets/number/old/2.mp3
  34. BIN
      vite/public/assets/number/old/3.mp3
  35. BIN
      vite/public/assets/number/old/4.mp3
  36. BIN
      vite/public/assets/number/old/5.mp3
  37. BIN
      vite/public/assets/number/old/6.mp3
  38. BIN
      vite/public/assets/number/old/7.mp3
  39. BIN
      vite/public/assets/number/old/8.mp3
  40. BIN
      vite/public/assets/number/old/9.mp3
  41. BIN
      vite/public/assets/number/old/a.mp3
  42. BIN
      vite/public/assets/number/old/error.mp3
  43. BIN
      vite/public/assets/number/old/q.mp3
  44. BIN
      vite/public/assets/number/q.mp3
  45. BIN
      vite/public/assets/record/record-01.mp3
  46. BIN
      vite/public/assets/record/record-02.mp3
  47. BIN
      vite/public/assets/record/record-03.mp3
  48. BIN
      vite/public/assets/record/record-04.mp3
  49. BIN
      vite/public/assets/record/record-05.mp3
  50. BIN
      vite/public/assets/sfx/sfx-01.mp3
  51. BIN
      vite/public/assets/sfx/sfx-02.mp3
  52. BIN
      vite/public/assets/sfx/sfx-03.mp3
  53. BIN
      vite/public/assets/sfx/sfx-04.mp3
  54. BIN
      vite/public/assets/sfx/sfx-05.mp3
  55. BIN
      vite/public/assets/sfx/sfx-06.mp3
  56. BIN
      vite/public/assets/sfx/sfx-07.mp3
  57. BIN
      vite/public/assets/sfx/sfx-08.mp3
  58. BIN
      vite/public/assets/sfx/sfx-09.mp3
  59. BIN
      vite/public/assets/sfx/sfx-10.mp3
  60. BIN
      vite/public/assets/sfx/sfx-11.mp3
  61. 197
      vite/public/cuelist_demo2.json
  62. 12
      vite/src/comps/numpad.jsx
  63. 39
      vite/src/pages/flow_free.jsx
  64. 5
      vite/src/util/useData.jsx
  65. 9
      vite/src/util/useUser.jsx

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,197 @@
{
"cuelist": [
{
"id": 1,
"name": "Q1",
"type": "space",
"description": "Annonce",
"audioFile": "assets/bg-03.mp3",
"loop": true,
"status":"reset"
},
{
"id": 2,
"name": "Q2",
"type": "headphone",
"description": "Guide for drink",
"auto": true,
"audioFile": "assets/record/record-01.mp3",
"nextcue": 3,
"status":"reset"
},
{
"id": 3,
"name": "Q3",
"description": "Guide for phone",
"type": "headphone",
"auto": true,
"audioFile": "assets/record/record-02.mp3",
"nextcue":4
},
{
"id": 4,
"name": "Q4",
"type": "phone",
"description": "引導撥號",
"auto": false,
"audioFile": "assets/ai/ai-01.mp3",
"nextcue": 4.01,
"callback":"numpad"
},
{
"id": 4.01,
"name": "Q4.01",
"type": "phone",
"description": "撥接音效",
"auto": false,
"audioFile": "assets/sfx/sfx-03.mp3",
"nextcue": 4.1
},
{
"id": 4.1,
"name": "Q4.1",
"type": "phone",
"description": "輸入完成,請描述腦中的記憶畫面",
"auto": true,
"audioFile": "assets/ai/ai-03.mp3",
"nextcue": 4.11
},
{
"id": 4.11,
"name": "Q4.11",
"type": "phone",
"description": "裝置啟動音效",
"auto": true,
"audioFile": "assets/sfx/sfx-04.mp3",
"nextcue": 4.2,
"status":"intro",
"callback":"fade_out_light"
},
{
"id": 4.2,
"name": "Q4.2",
"type": "chat",
"description": "chat",
"auto": true,
"nextcue": 4.3,
"duration": 90,
"status":"go"
},
{
"id": 4.21,
"name": "Q4.21",
"type": "phone",
"description": "裝置完成音效",
"auto": true,
"audioFile": "assets/sfx/sfx-06.mp3",
"nextcue": 4.3
},
{
"id": 4.3,
"name": "Q4.3",
"type": "phone",
"description": "記憶提取完成",
"auto": true,
"audioFile": "assets/ai/ai-04.mp3",
"nextcue": 4.4
},
{
"id": 4.4,
"name": "Q4.4",
"type": "phone",
"description": "準備打電話",
"audioFile": "assets/record/record-03.mp3",
"auto": true,
"nextcue": 5.1
},
{
"id": 4.5,
"name": "Q4.5",
"type": "phone",
"description": "電話將自動接通",
"audioFile": "assets/ai/ai-05.mp3",
"auto": true,
"nextcue": 4.51
},
{
"id": 4.51,
"name": "Q4.51",
"type": "phone",
"description": "接通音效",
"audioFile": "assets/sfx/sfx-07.mp3",
"auto": true,
"nextcue": 5.1
},
{
"id": 5.1,
"name": "Q5.1",
"type": "user_input",
"description": "call",
"duration": 30,
"auto": true,
"nextcue": 5.2,
"callback":"summary"
},
{
"id": 5.2,
"name": "Q5.2",
"type": "phone",
"description": "保留刪除",
"auto": true,
"nextcue": 5.3,
"audioFile": "assets/record/record-04.mp3"
},
{
"id": 5.3,
"name": "Q5.3",
"type": "phone",
"description": "保留刪除操作說明",
"audioFile": "assets/ai/ai-06.mp3",
"callback":"numpad",
"auto": false,
"branch":{
"1": {
"nextcue": 5.4,
"description": "保留"
},
"9": {
"nextcue": 5.5,
"description": "刪除"
},
"default": {
"nextcue": 5.4,
"description": "保留"
}
}
},
{
"id": 5.4,
"name": "Q5.4",
"type": "phone",
"description": "保留",
"auto": false,
"nextcue": 6,
"audioFile": "assets/ai/ai-07.mp3",
"callback":"numpad"
},
{
"id": 5.5,
"name": "Q5.5",
"type": "phone",
"description": "刪除",
"auto": false,
"nextcue": 6,
"audioFile": "assets/ai/ai-08.mp3"
},
{
"id": 6,
"name": "Q6",
"type": "space",
"description": "Ending",
"audioFile": "assets/record/record-05.mp3",
"status":"end",
"callback":"fade_in_light"
}
]
}

@ -83,9 +83,15 @@ export default function NumPad({onSend, disabled}){
refAudio.current = {}; refAudio.current = {};
for(var k in keys){ for(var k in keys){
const file=`assets/number/${keys[k]}.mp3`; if(parseInt(keys[k])>=0 && parseInt(keys[k])<=9){
// console.log(`Loading audio file: ${file}`); refAudio.current[keys[k]]=new Audio(`assets/number/${keys[k]}.mp3`);
refAudio.current[keys[k]]=new Audio(file); }else if(keys[k]===KEY_ENTER){
refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-02.mp3`);
}else if(keys[k]===KEY_BACKSPACE){
refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-01.mp3`);
}else if(keys[k]==='error'){
refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-01.mp3`);
}
} }
},[]); },[]);

@ -15,6 +15,8 @@ import { DebugControl, TEST_PROMPT } from "../comps/debug";
import { useUser } from "../util/useUser"; import { useUser } from "../util/useUser";
const CUELIST_FILE = 'cuelist_demo2.json';
const EmojiType={ const EmojiType={
phone: '📞', phone: '📞',
headphone: '🎧', headphone: '🎧',
@ -49,11 +51,11 @@ export function FreeFlow(){
const [autoSend, setAutoSend] = useState(true); const [autoSend, setAutoSend] = useState(true);
// const [userId, setUserId] = useState(); // const [userId, setUserId] = useState();
const [summary, setSummary] = useState(null); const [summary, setSummary] = useState(null);
const [voice, setVoice] = useState(Voice.ONYX); // const [voice, setVoice] = useState(Voice.ONYX);
//const [speechPaused, setSpeechPaused]=useState(false); //const [speechPaused, setSpeechPaused]=useState(false);
const [chatStatus, setChatStatus] = useState(ChatStatus.System); // System, User, Processing const [chatStatus, setChatStatus] = useState(ChatStatus.System); // System, User, Processing
const { userId, setUserId, getFileId } = useUser(); const { userId, setUserId, getFileId, setPassword, reset:resetUser } = useUser();
const refTimer=useRef(); const refTimer=useRef();
const refAudio=useRef(); const refAudio=useRef();
@ -110,8 +112,8 @@ export function FreeFlow(){
} }
let audioUrl = url; let audioUrl = url;
if(voice==Voice.SHIMMER) audioUrl = url.replace(Voice.ONYX, Voice.SHIMMER); // if(voice==Voice.SHIMMER) audioUrl = url.replace(Voice.ONYX, Voice.SHIMMER);
console.log('Using voice:', voice, 'for audio:', audioUrl); // console.log('Using voice:', voice, 'for audio:', audioUrl);
const audio = new Audio(audioUrl); const audio = new Audio(audioUrl);
audio.loop=refCurrentCue.current?.loop || false; // Set loop if defined in cue audio.loop=refCurrentCue.current?.loop || false; // Set loop if defined in cue
@ -193,14 +195,14 @@ export function FreeFlow(){
refChatCueEnd.current=false; refChatCueEnd.current=false;
resetTranscript(); resetTranscript();
console.log('Starting conversation...'); console.log('Starting conversation...');
sendMessage(null, false, false, voice); // Send initial message with voice sendMessage(null, false, false, null); // Send initial message with voice
setChatWelcome(true); setChatWelcome(true);
resetData(); // Reset data for new conversation resetData(); // Reset data for new conversation
break; break;
case 'chat_end': case 'chat_end':
const message= refInput.current?.value?.trim(); const message= refInput.current?.value?.trim();
console.log('Ending conversation with message:', message); console.log('Ending conversation with message:', message);
sendMessage(message, false, true, voice); sendMessage(message, false, true, null);
setChatWelcome(false); setChatWelcome(false);
setChatStatus(ChatStatus.Clear); setChatStatus(ChatStatus.Clear);
break; break;
@ -312,11 +314,26 @@ export function FreeFlow(){
function onNumpad(mess){ function onNumpad(mess){
console.log('Numpad input:', mess); console.log('Numpad input:', mess);
if(refCurrentCue.current?.callback!='numpad') return; if(refCurrentCue.current?.callback!='numpad') return;
console.log('Numpad input:', mess); let cue=refCurrentCue.current;
let next=cue.nextcue;
switch(cue.id){
case 4:
setUserId(()=>mess); setUserId(()=>mess);
break;
case 5.3:
next=cue.branch[mess.toString()].nextcue;
break;
case 5.4:
setPassword(()=>mess);
break;
}
if(next){
console.log('Finish enter number, next cue:', next);
playCue(cuelist.find(c => c.id === next));
}
} }
function saveImage(){ function saveImage(){
sendOsc('/export', 'output/test.png'); // Send OSC message to save image sendOsc('/export', 'output/test.png'); // Send OSC message to save image
@ -326,7 +343,7 @@ export function FreeFlow(){
if(userId>=1 && userId<=24) { if(userId>=1 && userId<=24) {
console.log('User ID set:', userId); console.log('User ID set:', userId);
playCue(cuelist.find(c => c.id === currentCue.nextcue)); // Play cue 5 when userId is set playCue(cuelist.find(c => c.id === refCurrentCue.current.nextcue)); // Play cue 5 when userId is set
} }
},[userId]); },[userId]);
@ -360,7 +377,7 @@ export function FreeFlow(){
const message= refInput.current?.value?.trim(); const message= refInput.current?.value?.trim();
if(message && message.length>0) { if(message && message.length>0) {
console.log('Ending conversation with message:', message); console.log('Ending conversation with message:', message);
sendMessage(message, false, false, voice); sendMessage(message, false, false, null);
setChatWelcome(false); setChatWelcome(false);
setChatStatus(ChatStatus.Processing); // Set chat status to Processing setChatStatus(ChatStatus.Processing); // Set chat status to Processing
@ -465,7 +482,7 @@ export function FreeFlow(){
useEffect(()=>{ useEffect(()=>{
fetch('/cuelist_free.json') fetch(CUELIST_FILE)
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
console.log('Cuelist data:', data); console.log('Cuelist data:', data);

@ -59,8 +59,9 @@ export function DataProvider({children}) {
} }
try{ try{
const res_write=await writeTextFile(filePath, JSON.stringify(towrite), { baseDir: BaseDirectory.AppData }) const folder = await path.appDataDir();
console.log("File written successfully:", res_write); const res_write=await writeTextFile(`${folder}\\${filePath}`, JSON.stringify(towrite))
console.log("File written successfully", `${folder}\\${filePath}`);
}catch(error){ }catch(error){
console.error("Error writing file:", error); console.error("Error writing file:", error);
} }

@ -17,13 +17,18 @@ export function UserProvider({children}) {
const [userId, setUserId] = useState(null); const [userId, setUserId] = useState(null);
const [sessionId, setSessionId] = useState(null); const [sessionId, setSessionId] = useState(null);
const [password, setPassword] = useState(null);
function getFileId(){ function getFileId(){
if(!userId) return `test-${moment().format("YYYYMMDDmmss")}-${sessionId}`; if(!userId) return `test-${moment().format("YYYYMMDDmmss")}-${sessionId}`;
return `${moment().format("YYYYMMDD").substring(2)}-${sessionId}-${userId}`; return `${moment().format("YYYYMMDD").substring(2)}-${sessionId}-${userId}`;
} }
function reset(){
setUserId(null);
setSessionId(null);
setPassword(null);
}
useEffect(() => { useEffect(() => {
@ -44,7 +49,7 @@ export function UserProvider({children}) {
}, [userId]); }, [userId]);
return ( return (
<userContext.Provider value={{ userId, setUserId, getFileId }}> <userContext.Provider value={{ userId, setUserId, getFileId, setPassword, reset }}>
{children} {children}
</userContext.Provider> </userContext.Provider>
); );

Loading…
Cancel
Save