基于p5.js-speech的6轨音频程序修改需求及代码咨询
实现带超时自动播放的语音触发音轨序列
我帮你调整代码来实现这个需求——播放完当前音轨后,要么等用户语音响应立刻切下一曲,要么5秒没响应自动播放下一曲。先理清楚核心逻辑,再看修改后的完整代码:
关键逻辑梳理
- 全局跟踪当前播放的音轨序号、是否处于等待用户响应的状态
- 音轨播放完毕后,启动5秒倒计时,同时监听语音输入
- 两种触发下一曲的条件:
- 倒计时结束(5秒无响应),自动播放下一曲
- 检测到用户语音响应,立即播放下一曲
- 到达第6轨后停止流程(可根据需求调整)
修改后的完整代码
// 全局变量定义 let currentSong = 0; // 初始从第0轨开始(对应需求的第1轨,可根据实际数组索引调整) const fiveSeconds = 5000; // 5秒超时时间 let waitingForResponse = false; // 标记是否处于等待用户响应的状态 let countdownTimer = null; // 存储倒计时定时器 function parseResult() { const mostrecentword = myRec.resultString.split(' ').pop(); // 只有在等待响应状态,且识别到有效语音(非空)时触发下一曲 if (waitingForResponse && mostrecentword.trim() !== "") { clearCountdown(); // 清除当前倒计时 playNextSong(); } } // 播放下一曲的通用函数 function playNextSong() { // 检查是否已经到最后一轨(第6轨,索引对应5,可根据实际数组长度调整) if (currentSong >= 5) { background(255, 0, 0); // 用红色标记结束状态 myRec.stop(); // 停止语音识别 console.log("所有音轨播放完毕"); return; } currentSong++; // 播放当前音轨,播放完毕后进入等待响应状态 songs[currentSong].playMode('untilDone', () => { waitingForResponse = true; startCountdown(); // 启动5秒倒计时 background(0, 255, 0); // 绿色标记等待响应状态 }); songs[currentSong].play(); background(255, 255, 0); // 黄色标记正在播放状态 } // 启动倒计时函数 function startCountdown() { countdownTimer = setTimeout(() => { waitingForResponse = false; playNextSong(); // 超时自动播放下一曲 }, fiveSeconds); } // 清除倒计时函数 function clearCountdown() { if (countdownTimer) { clearTimeout(countdownTimer); countdownTimer = null; waitingForResponse = false; } } function draw() {} // 保持空函数 function setup() { frameRate(1); createCanvas(600, 600); background(255, 255, 255); fill(0, 0, 0, 255); // 初始化语音识别 myRec.start(); // 播放第一轨,启动流程 songs[currentSong].playMode('untilDone', () => { waitingForResponse = true; startCountdown(); background(0, 255, 0); }); songs[currentSong].play(); background(255, 255, 0); }
核心改动说明
- 全局状态管理:新增
waitingForResponse和countdownTimer,用来跟踪等待状态和管理倒计时,避免重复触发 - 通用播放函数:
playNextSong统一处理音轨切换、边界检查和播放状态标记,让逻辑更清晰 - 播放回调与倒计时:利用
playMode('untilDone', callback)在音轨播放完毕后自动进入等待状态并启动倒计时 - 语音识别触发逻辑:只有在等待状态下识别到有效语音才会触发下一曲,避免误触发
- 边界处理:到达第6轨后停止语音识别并标记结束状态,可根据需求调整后续行为
内容的提问来源于stack exchange,提问作者dackdel
相关产品推荐
相关产品推荐

