世博音频:可以自动停止录音吗?

问题描述 投票:0回答:1

我一直在寻找 Expo-audio 的解决方案,但找不到我想要的解决方案,所以我制作了这个帖子。

我想要什么

我有一个带有 Expo-av 的录音机功能,它可以录制和播放音频文件,这很好。但是,我想在用户停止说话时自动停止录音。

详细说明情况

在Expo Audio页面,他们有一个函数

Audio.stop()
,我必须手动调用该方法。但解决方案并不是该项目正在寻找的。

我尝试设置

setTimeout
来触发停止方法,但该项目需要以毫秒为单位的实际记录长度,而不是以编程方式停止的时间。所以我不能使用
setTimeout
。这是用户语音的中继。

我知道Web API支持语音结束事件,这满足了我的要求。然而,我无法让它在 React Native 上工作,这是有道理的,因为它不在浏览器上。

我尝试了react-native-voicepicovoice;但是,它在 Expo v50+ 环境下效果不佳。

我的询问

如果您成功地将自动停止录制功能与 expo v50+ 集成,请分享您是如何做到的:) 另外,如果您有解决方案,也请分享。

谢谢!

react-native expo speech-recognition
1个回答
0
投票

我正在寻找同样的东西并找到了这篇文章。我在网上也找不到任何东西,所以我向 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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.