React Native语音转文字项目中计算音量平均值的问题
解决React Native语音转文字项目中音量平均值NaN问题
问题根源
你遇到NaN的核心原因有两个:
voiceData状态类型错误:初始定义为数组useState([]),但onSpeechVolumeChanged里用对象语法更新状态,把数组变成了带volume键的对象,导致后续遍历voiceData.length时,对象的length属性为0,最终计算0/0得到NaN。- 未处理空数组边界情况:即使数组正常,若没有收集到音量数据,直接除以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
相关产品推荐
相关产品推荐

