# Conflicts:
#	vite/src/pages/flow_free.jsx
main
ULTRACOMBOS-DEV 3 months ago
commit 159ff0444c
  1. 3
      vite/public/cuelist_demo3.json
  2. 46
      vite/src/comps/numpad.jsx
  3. 3
      vite/src/comps/voiceanalysis.jsx
  4. 20
      vite/src/pages/flow_free.jsx
  5. 3
      vite/src/util/osc.js
  6. 2
      vite/src/util/useUser.jsx

@ -85,8 +85,7 @@
"description": "記憶提取完成", "description": "記憶提取完成",
"auto": true, "auto": true,
"audioFile": "assets/ai/sfx-06-ai-04-record-03-ai-05-sfx-07.mp3", "audioFile": "assets/ai/sfx-06-ai-04-record-03-ai-05-sfx-07.mp3",
"nextcue": 5.1, "nextcue": 5.1
"hint":"電話已接通"
}, },
{ {
"id": 5.1, "id": 5.1,

@ -27,6 +27,8 @@ export default function NumPad({onSend, disabled, type, clientId}){
const refInput=useRef(); const refInput=useRef();
const refType=useRef(type); const refType=useRef(type);
const refLatestInput=useRef();
const setInput=(valueFunc)=>{ const setInput=(valueFunc)=>{
if(typeof valueFunc==='function'){ 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([]); const refAudio=useRef([]);
function onkeydown(e){ function onkeydown(e){
@ -56,7 +64,8 @@ export default function NumPad({onSend, disabled, type, clientId}){
case NUMPAD_TYPE.USERID: case NUMPAD_TYPE.USERID:
if(num>=1 && num<=24){ if(num>=1 && num<=24){
onSend(num); // onSend(num);
refLatestInput.current=num;
refAudio.current[KEY_ENTER]?.play(); refAudio.current[KEY_ENTER]?.play();
}else{ }else{
refAudio.current['error']?.play(); refAudio.current['error']?.play();
@ -64,16 +73,21 @@ export default function NumPad({onSend, disabled, type, clientId}){
break; break;
case NUMPAD_TYPE.PASSWORD: case NUMPAD_TYPE.PASSWORD:
if(refInput.current.length==4){ if(refInput.current.length==4){
onSend(refInput.current); // onSend(refInput.current);
refAudio.current[KEY_ENTER]?.play(); refLatestInput.current=refInput.current;
// refAudio.current[KEY_ENTER]?.play();
refAudio.current['end']?.play();
}else{ }else{
refAudio.current['error']?.play(); refAudio.current['error']?.play();
} }
break; break;
case NUMPAD_TYPE.CHOICE: case NUMPAD_TYPE.CHOICE:
if(num==1 || num==9){ if(num==1 || num==9){
onSend(num); // onSend(num);
refAudio.current[KEY_ENTER]?.play(); refLatestInput.current=num;
// refAudio.current[KEY_ENTER]?.play();
if(num==1) refAudio.current['save']?.play();
if(num==9) refAudio.current['discard']?.play();
}else{ }else{
refAudio.current['error']?.play(); refAudio.current['error']?.play();
} }
@ -122,7 +136,9 @@ export default function NumPad({onSend, disabled, type, clientId}){
'1','2','3', '1','2','3',
'4','5','6', '4','5','6',
'7','8','9', '7','8','9',
'0',KEY_ENTER,KEY_BACKSPACE,'error' '0',KEY_ENTER,KEY_BACKSPACE,'error',
'save','discard',
'end',
]; ];
refAudio.current = {}; 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`); refAudio.current[keys[k]]=new Audio(`assets/number/${keys[k]}.mp3`);
}else if(keys[k]===KEY_ENTER){ }else if(keys[k]===KEY_ENTER){
refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-02.mp3`); refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-02.mp3`);
refAudio.current[keys[k]].addEventListener('ended', onAudioEnd);
}else if(keys[k]===KEY_BACKSPACE){ }else if(keys[k]===KEY_BACKSPACE){
refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-01.mp3`); refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-01.mp3`);
}else if(keys[k]==='error'){ }else if(keys[k]==='error'){
refAudio.current[keys[k]]=new Audio(`assets/sfx/sfx-01.mp3`); 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);
}
} }
} }

@ -1,4 +1,5 @@
import { useEffect, useRef, useState } from "react"; import { useEffect, useRef, useState } from "react";
import { OSC_ADDRESS, sendOsc } from "../util/osc";
export default function VoiceAnalysis(){ export default function VoiceAnalysis(){
@ -55,6 +56,8 @@ export default function VoiceAnalysis(){
const averageVolume = volumeSum / volumes.length; const averageVolume = volumeSum / volumes.length;
// console.log(`Average Volume: ${averageVolume}`); // console.log(`Average Volume: ${averageVolume}`);
setVolume(averageVolume); setVolume(averageVolume);
sendOsc(OSC_ADDRESS.AMPLITUDE, averageVolume/127.0);
}; };

@ -280,14 +280,7 @@ export function FreeFlow(){
//sendMessage(null, false, false, null); // 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':
// const message= refInput.current?.value?.trim();
// console.log('Ending conversation with message:', message);
// sendMessage(message, false, true, null);
// setChatWelcome(false);
// setChatStatus(ChatStatus.Clear);
// break;
case 'summary': case 'summary':
console.log('Getting summary...'); console.log('Getting summary...');
@ -367,6 +360,9 @@ export function FreeFlow(){
}else{ }else{
sendOsc(OSC_ADDRESS.COUNTDOWN, '0'); // Reset countdown for non-chat cues 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}`); sendOscStatus(OSC_ADDRESS.CLIENT_STATUS,`${data.id}#playcue#${cue.id}`);
@ -400,6 +396,14 @@ export function FreeFlow(){
} }
sendOsc(OSC_ADDRESS.SPEECH, 'stop'); 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 refAudio.current?.pause(); // Pause any playing audio
console.log('onCueEnd:', cue.id); console.log('onCueEnd:', cue.id);

@ -26,6 +26,7 @@ export const OSC_ADDRESS={
PLAY_CUE:'/playcue', PLAY_CUE:'/playcue',
STOP_CUE:'/stopcue', STOP_CUE:'/stopcue',
RESET_CUE:'/resetcue', RESET_CUE:'/resetcue',
AMPLITUDE:'/amplitude',
} }
@ -40,7 +41,7 @@ export async function sendOsc(key, message){
// } // }
try{ 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', { await invoke('send_osc_message', {
key: key, key: key,
message: message.toString(), message: message.toString(),

@ -97,7 +97,7 @@ export function UserProvider({children}) {
const data={ const data={
userId, userId,
// sessionId, // sessionId,
password: password||'', password: refPassword.current||'',
choice: choice||'', choice: choice||'',
summary: summary||'', summary: summary||'',
date: moment().format("YYYY-MM-DD hh:mm:ss"), date: moment().format("YYYY-MM-DD hh:mm:ss"),

Loading…
Cancel
Save