我一直在寻找 Expo-audio 的解决方案,但找不到我想要的解决方案,所以我制作了这个帖子。
我有一个带有 Expo-av 的录音机功能,它可以录制和播放音频文件,这很好。但是,我想在用户停止说话时自动停止录音。
在Expo Audio页面,他们有一个函数
Audio.stop()
,我必须手动调用该方法。但解决方案并不是该项目正在寻找的。
我尝试设置
setTimeout
来触发停止方法,但该项目需要以毫秒为单位的实际记录长度,而不是以编程方式停止的时间。所以我不能使用setTimeout
。这是用户语音的中继。
我知道Web API支持语音结束事件,这满足了我的要求。然而,我无法让它在 React Native 上工作,这是有道理的,因为它不在浏览器上。
我尝试了react-native-voice和picovoice;但是,它在 Expo v50+ 环境下效果不佳。
如果您成功地将自动停止录制功能与 expo v50+ 集成,请分享您是如何做到的:) 另外,如果您有解决方案,也请分享。
谢谢!
我正在寻找同样的东西并找到了这篇文章。我在网上也找不到任何东西,所以我向 ChatGPT 寻求解决方案,它实际上适用于我的应用程序。希望这会对您有所帮助。基本上,录音状态中有一个称为“计量”的属性,它允许您随时检查录音音频信号的电平。您可以将其与 setTimeout 一起使用来获取您正在寻找的功能。我将复制/粘贴下面 ChatGPT 的输出(ChatGPT 的代码稍有不正确,因为它包含一个名为metering.averagePower 的不存在的属性;我从下面的代码片段中删除了该属性)。测试后我还必须修改常量值。
let silenceTimeout;
let monitoringInterval;
const silenceThreshold = -50; // dB, adjust based on your needs
const silenceDelay = 2000; // 2 seconds
async function monitorRecording() {
const recordingStatus = await recording.getStatusAsync();
if (recordingStatus.isRecording) {
const audioData = await recording.getStatusAsync();
if (audioData.metering && audioData.metering <= silenceThreshold) {
if (!silenceTimeout) {
silenceTimeout = setTimeout(stopRecording, silenceDelay);
}
} else {
clearTimeout(silenceTimeout);
silenceTimeout = null;
}
}
}
function startMonitoring() {
monitoringInterval = setInterval(monitorRecording, 100); // Check every 100ms
}
function stopMonitoring() {
clearInterval(monitoringInterval);
}
async function startRecording() {
try {
await Audio.requestPermissionsAsync();
await Audio.setAudioModeAsync({
allowsRecordingIOS: true,
playsInSilentModeIOS: true,
});
await recording.prepareToRecordAsync(Audio.RECORDING_OPTIONS_PRESET_HIGH_QUALITY);
await recording.startAsync();
startMonitoring();
console.log('Recording started');
} catch (error) {
console.error('Failed to start recording', error);
}
}
async function stopRecording() {
try {
stopMonitoring();
await recording.stopAndUnloadAsync();
const uri = recording.getURI();
console.log('Recording stopped and stored at', uri);
// Call your existing stopRecording function or implement further processing
// stopRecording(); // Your existing function
} catch (error) {
console.error('Failed to stop recording', error);
}
}