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

React Native语音转文字项目中计算音量平均值的问题

解决React Native语音转文字项目中音量平均值NaN问题

问题根源

你遇到NaN的核心原因有两个:

  1. voiceData状态类型错误:初始定义为数组useState([]),但onSpeechVolumeChanged里用对象语法更新状态,把数组变成了带volume键的对象,导致后续遍历voiceData.length时,对象的length属性为0,最终计算0/0得到NaN。
  2. 未处理空数组边界情况:即使数组正常,若没有收集到音量数据,直接除以count也会触发NaN。

修复步骤

1. 修正音量数据的状态更新逻辑

把每次获取到的音量值追加到数组,而不是覆盖为对象,同时用函数式更新确保拿到最新状态:

const onSpeechVolumeChanged = (e) => {
    setVoiceData(prevVoiceData => [...prevVoiceData, e.value]);
};

2. 修正平均值计算逻辑

添加空数组判断避免除以0,用reduce简化累加逻辑,同时确保数值有效性:

const onSpeechResults = (result) => {
    var allValue = result.value
    var theBestOption = allValue[Object.keys(allValue).pop()]
    setResults(theBestOption)
    console.log(theBestOption)

    if (voiceData.length === 0) {
        console.log("未收集到音量数据");
        return;
    }

    let sum = voiceData.reduce((acc, current) => acc + Number(current), 0);
    let average = sum / voiceData.length;
    console.log(average)
};

3. 可选:重置音量数据(避免多次录音数据累积)

在开始录音时清空voiceData,确保每次录音的音量数据独立:

const startSpeechToText = async () => {
    await Voice.start("ru");
    setStarted(true);
    setVoiceData([]); // 清空历史数据
};

验证逻辑

修复后,voiceData会正确存储每次的音量数值数组,比如:

[-2, -0.44, 0.76, 1.36, ...]

计算平均值时,数组长度正常,累加有效数字,不会出现除以0的情况,就能得到正确的数值结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:50:20