我希望 FFmpeg 在检测到低于阈值的静音时停止麦克风录音

我希望 FFmpeg 在检测到低于阈值的静音时停止麦克风录音

我正在尝试制作一个实时语音转文本转录脚本。以下脚本适用于录制的 wav 文件。

 from asrecognition import ASREngine
 asr = ASREngine("tr", model_path="mpoyraz/wav2vec2-xls-r-300m-cv6-turkish")
 audio_paths = ["prerecorded.wav"]
 transcriptions = asr.transcribe(audio_paths)
 print(transcriptions)

但我想从麦克风捕捉声音,当检测到一段时间的静音时,
必须停止录音,并将其传送到语音识别引擎进行转录。然后必须再次从麦克风录制声音。

我以为FFmpeg可以实现,但是如何实现呢?

答案1

您可以通过结合使用 pulseaudio 和 ffmpeg 来实现这一点:

**代码基于 python pulsectl lib **

脉冲 = pulsectl.Pulse(“测试 1”)

  1. 检索 pulse.sink_input_list - 仅当存在接收器(例如麦克风)时才存在 ->pulseSinkInputInfoList。

    pulseSinkInputInfoList = pulse.sink_input_list()
    monName =pulse.sink_info(pulseSinkInputInfoList[0].sink).monitor_source_name
    sources = pulse.source_list()
    for pulseSourceInfo in sources:
     if pulseSourceInfo.name==monName:
         while True:
             mos=pulseSourceInfo.index
             peak= pulse.get_peak_sample(mos, 0.2)
             if peak > 0:
                 execute ffmpeg like:
                   fmpeg -f pulse -i alsa_input.pci-0000_00_1b.0.analog-stereo -ac 1 recording.m4a
    

这更像是一个堆栈溢出主题,因此我将其保持简短 - 只是为了让您了解它的要点。基本想法是,您使用脉冲音频来检测“峰值”线中的一些静音(或相反)。然后您可以执行 ffmpeg 命令来录制片段。据我所知,您最终会得到一堆短剪辑,然后您可以使用 ffmepg 的 concat 协议将它们连接/连接起来。

有关 ffmpegs 的信息脉冲协议concat 协议

可以在 Python 中找到该协议的实现这里

相关内容