You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于p5.js-speech的6轨音频程序修改需求及代码咨询

实现带超时自动播放的语音触发音轨序列

我帮你调整代码来实现这个需求——播放完当前音轨后,要么等用户语音响应立刻切下一曲,要么5秒没响应自动播放下一曲。先理清楚核心逻辑,再看修改后的完整代码:

关键逻辑梳理

  • 全局跟踪当前播放的音轨序号、是否处于等待用户响应的状态
  • 音轨播放完毕后,启动5秒倒计时,同时监听语音输入
  • 两种触发下一曲的条件:
    1. 倒计时结束(5秒无响应),自动播放下一曲
    2. 检测到用户语音响应,立即播放下一曲
  • 到达第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);
}

核心改动说明

  1. 全局状态管理:新增waitingForResponse和countdownTimer,用来跟踪等待状态和管理倒计时,避免重复触发
  2. 通用播放函数:playNextSong统一处理音轨切换、边界检查和播放状态标记,让逻辑更清晰
  3. 播放回调与倒计时:利用playMode('untilDone', callback)在音轨播放完毕后自动进入等待状态并启动倒计时
  4. 语音识别触发逻辑:只有在等待状态下识别到有效语音才会触发下一曲,避免误触发
  5. 边界处理:到达第6轨后停止语音识别并标记结束状态,可根据需求调整后续行为

内容的提问来源于stack exchange,提问作者dackdel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:38:57