diff --git a/vite/public/cuelist_demo3.json b/vite/public/cuelist_demo3.json index 2a0edce..ab97e07 100644 --- a/vite/public/cuelist_demo3.json +++ b/vite/public/cuelist_demo3.json @@ -85,8 +85,7 @@ "description": "記憶提取完成", "auto": true, "audioFile": "assets/ai/sfx-06-ai-04-record-03-ai-05-sfx-07.mp3", - "nextcue": 5.1, - "hint":"電話已接通" + "nextcue": 5.1 }, { "id": 5.1, diff --git a/vite/src/comps/numpad.jsx b/vite/src/comps/numpad.jsx index 2e63abb..fee5229 100644 --- a/vite/src/comps/numpad.jsx +++ b/vite/src/comps/numpad.jsx @@ -27,6 +27,8 @@ export default function NumPad({onSend, disabled, type, clientId}){ const refInput=useRef(); const refType=useRef(type); + const refLatestInput=useRef(); + const setInput=(valueFunc)=>{ if(typeof valueFunc==='function'){ @@ -38,6 +40,12 @@ export default function NumPad({onSend, disabled, type, clientId}){ } } + function onAudioEnd(e){ + if(refLatestInput.current){ + onSend(refLatestInput.current); + refLatestInput.current=null; + } + } const refAudio=useRef([]); function onkeydown(e){ @@ -56,7 +64,8 @@ export default function NumPad({onSend, disabled, type, clientId}){ case NUMPAD_TYPE.USERID: if(num>=1 && num<=24){ - onSend(num); + // onSend(num); + refLatestInput.current=num; refAudio.current[KEY_ENTER]?.play(); }else{ refAudio.current['error']?.play(); @@ -64,16 +73,21 @@ export default function NumPad({onSend, disabled, type, clientId}){ break; case NUMPAD_TYPE.PASSWORD: if(refInput.current.length==4){ - onSend(refInput.current); - refAudio.current[KEY_ENTER]?.play(); + // onSend(refInput.current); + refLatestInput.current=refInput.current; + // refAudio.current[KEY_ENTER]?.play(); + refAudio.current['end']?.play(); }else{ refAudio.current['error']?.play(); } break; case NUMPAD_TYPE.CHOICE: if(num==1 || num==9){ - onSend(num); - refAudio.current[KEY_ENTER]?.play(); + // onSend(num); + refLatestInput.current=num; + // refAudio.current[KEY_ENTER]?.play(); + if(num==1) refAudio.current['save']?.play(); + if(num==9) refAudio.current['discard']?.play(); }else{ refAudio.current['error']?.play(); } @@ -122,7 +136,9 @@ export default function NumPad({onSend, disabled, type, clientId}){ '1','2','3', '4','5','6', '7','8','9', - '0',KEY_ENTER,KEY_BACKSPACE,'error' + '0',KEY_ENTER,KEY_BACKSPACE,'error', + 'save','discard', + 'end', ]; refAudio.current = {}; @@ -131,10 +147,28 @@ export default function NumPad({onSend, disabled, type, clientId}){ refAudio.current[keys[k]]=new Audio(`assets/number/${keys[k]}.mp3`); }else if(keys[k]===KEY_ENTER){ refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-02.mp3`); + refAudio.current[keys[k]].addEventListener('ended', onAudioEnd); }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`); + }else if(keys[k]==='save'){ + refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-09.mp3`); + refAudio.current[keys[k]].addEventListener('ended', onAudioEnd); + }else if(keys[k]==='discard'){ + refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-10.mp3`); + refAudio.current[keys[k]].addEventListener('ended', onAudioEnd); + }else if(keys[k]==='end'){ + refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-11.mp3`); + refAudio.current[keys[k]].addEventListener('ended', onAudioEnd); + } + } + + return () => { + for(var k in keys){ + if(refAudio.current[keys[k]]){ + refAudio.current[keys[k]].removeEventListener('ended', onAudioEnd); + } } } diff --git a/vite/src/comps/voiceanalysis.jsx b/vite/src/comps/voiceanalysis.jsx index c3a7ebc..d81d677 100644 --- a/vite/src/comps/voiceanalysis.jsx +++ b/vite/src/comps/voiceanalysis.jsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from "react"; +import { OSC_ADDRESS, sendOsc } from "../util/osc"; export default function VoiceAnalysis(){ @@ -55,6 +56,8 @@ export default function VoiceAnalysis(){ const averageVolume = volumeSum / volumes.length; // console.log(`Average Volume: ${averageVolume}`); setVolume(averageVolume); + + sendOsc(OSC_ADDRESS.AMPLITUDE, averageVolume/127.0); }; diff --git a/vite/src/pages/flow_free.jsx b/vite/src/pages/flow_free.jsx index 399e605..763fe05 100644 --- a/vite/src/pages/flow_free.jsx +++ b/vite/src/pages/flow_free.jsx @@ -280,14 +280,7 @@ export function FreeFlow(){ //sendMessage(null, false, false, null); // Send initial message with voice //setChatWelcome(true); resetData(); // Reset data for new conversation - break; - // case 'chat_end': - // const message= refInput.current?.value?.trim(); - // console.log('Ending conversation with message:', message); - // sendMessage(message, false, true, null); - // setChatWelcome(false); - // setChatStatus(ChatStatus.Clear); - // break; + break; case 'summary': console.log('Getting summary...'); @@ -367,6 +360,9 @@ export function FreeFlow(){ }else{ sendOsc(OSC_ADDRESS.COUNTDOWN, '0'); // Reset countdown for non-chat cues } + if(cue.numpad_type=='choice'){ + setChoice(); + } sendOscStatus(OSC_ADDRESS.CLIENT_STATUS,`${data.id}#playcue#${cue.id}`); @@ -400,6 +396,14 @@ export function FreeFlow(){ } sendOsc(OSC_ADDRESS.SPEECH, 'stop'); + if(cue.numpad_type=='password'){ + if(!choice){ + console.log('set default choice to save'); + setChoice('save'); + sendOsc(OSC_ADDRESS.CHOICE, 'save'); // Send OSC save choice message + } + } + refAudio.current?.pause(); // Pause any playing audio console.log('onCueEnd:', cue.id); diff --git a/vite/src/util/osc.js b/vite/src/util/osc.js index d76ec01..919f44c 100644 --- a/vite/src/util/osc.js +++ b/vite/src/util/osc.js @@ -26,6 +26,7 @@ export const OSC_ADDRESS={ PLAY_CUE:'/playcue', STOP_CUE:'/stopcue', RESET_CUE:'/resetcue', + AMPLITUDE:'/amplitude', } @@ -40,7 +41,7 @@ export async function sendOsc(key, message){ // } try{ - console.log(`Sending OSC message: ${key} -> ${message}`); + if(key!=OSC_ADDRESS.AMPLITUDE) console.log(`Sending OSC message: ${key} -> ${message}`); await invoke('send_osc_message', { key: key, message: message.toString(), diff --git a/vite/src/util/useUser.jsx b/vite/src/util/useUser.jsx index 4d00bb9..0c6d48d 100644 --- a/vite/src/util/useUser.jsx +++ b/vite/src/util/useUser.jsx @@ -97,7 +97,7 @@ export function UserProvider({children}) { const data={ userId, // sessionId, - password: password||'', + password: refPassword.current||'', choice: choice||'', summary: summary||'', date: moment().format("YYYY-MM-DD hh:mm:ss"),