首页 > 编程问答 >Python:如何使用pyaudio或sounddevice等库进行自动录音?

Python:如何使用pyaudio或sounddevice等库进行自动录音?

时间:2024-07-28 06:45:08浏览次数:7  
标签:python algorithm function record

我想做一个项目,需要满足以下录音要求:

程序启动后,会在后台不断检测麦克风的声音,当声音分贝大于一定值时打开录音流级别,当分贝低于一定级别时关闭录音流并保存为wav文件。

我知道原理,但我无法使用这些库来实现。

我想实现以上结果


使用 Python 实现自动录音

以下代码演示了如何使用 pyaudio 库实现基于音量阈值的自动录音功能:

import pyaudio
import struct
import wave
import numpy as np

# 设置录音参数
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024
THRESHOLD = 50  # 录音阈值
RECORD_SECONDS = 5  # 录音时长
WAVE_OUTPUT_FILENAME = "recording.wav"

# 初始化 PyAudio
p = pyaudio.PyAudio()

# 打开音频流
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("正在监听...")

frames = []
recording = False
silent_chunks = 0
max_silent_chunks = int(RATE / CHUNK * 0.5)  # 0.5秒静音后停止

while True:
    # 读取音频数据
    data = stream.read(CHUNK)

    # 将数据转换为 NumPy 数组
    rms_val = np.sqrt(np.mean(np.square(np.frombuffer(data, dtype=np.int16))))

    # 检查音量是否超过阈值
    if rms_val > THRESHOLD:
        recording = True
        silent_chunks = 0
        print("开始录音")
    else:
        silent_chunks += 1

    # 如果正在录音,则将数据添加到帧列表中
    if recording:
        frames.append(data)

    # 如果静音时间超过阈值,则停止录音
    if silent_chunks > max_silent_chunks:
        if recording:
            print("录音结束")
            recording = False

            # 保存录音文件
            wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
            wf.setnchannels(CHANNELS)
            wf.setsampwidth(p.get_sample_size(FORMAT))
            wf.setframerate(RATE)
            wf.writeframes(b''.join(frames))
            wf.close()
            frames = []

# 清理资源
stream.stop_stream()
stream.close()
p.terminate()

代码解释:

  1. 导入库: 导入必要的库,包括 pyaudio struct wave numpy
  2. 设置参数: 定义录音参数,例如采样率、声道数、块大小和阈值。
  3. 初始化 PyAudio: 创建 PyAudio 对象。
  4. 打开音频流: 使用 pyaudio.PyAudio.open() 函数打开音频流,指定输入设备、格式、声道数、采样率和块大小。
  5. 循环监听: 进入无限循环,持续监听麦克风输入。
  6. 读取音频数据: 使用 stream.read() 函数读取音频数据。
  7. 计算音量: 使用 numpy 库计算音频数据的均方根值 (RMS),作为音量指标。
  8. 判断是否录音: 根据音量是否超过阈值,决定是否开始或停止录音。
  9. 保存录音文件: 当音量低于阈值一段时间后,停止录音并将记录的音频数据保存为 WAV 文件。

注意:

  • 可以根据需要调整 THRESHOLD RECORD_SECONDS WAVE_OUTPUT_FILENAME 变量。
  • 这段代码只是一个简单的示例,可以根据自己的需求进行修改和扩展。
  • 例如,可以添加功能,例如在开始录音之前预先录制几秒钟的音频,或者在检测到特定频率的声音时开始录音。

希望这段代码可以帮助实现自动录音的功能!

标签:python,algorithm,function,record
From: 78802594

相关文章

  • 当我们创建一个在 https 服务器上获取和发送数据的 python 应用程序时,我们应该如何处
    python脚本使用Urllib3,我的服务器是在Node.js上编写的脚本。我担心(并且不清楚)证书:我是否需要将我的python应用程序上的证书另存为变量?例如我这样做了,http=urllib3.PoolManager(cert_reqs="CERT_REQUIRED",ca_certs='client-cert.pem')并且我不知道......
  • 使用 Python 进行 Web 抓取以获取数据 NoneType ERROR
    我正在努力为我的学校项目获取美元和价格。所以我决定为此使用网络抓取,但我有一个问题。当我尝试在服务器上使用我的代码时,它给我NoneType错误。它可以在googlecolab上使用,但我无法在我的电脑或服务器上使用。我该如何解决这个问题?网页抓取代码;defdolar():he......
  • Python 请求 - response.json() 未按预期工作
    我正在尝试从Python的requests模块调用API。在邮递员上,返回的响应标头中的Content-Type是application/json;charset=utf-8,响应json数据是我期望的样子。但是,在python上的API的get方法之后运行response.json()会抛出错误simplejson.errors......
  • pytube.exceptions.RegexMatchError:get_throtdling_function_name:找不到多个匹配
    我曾经通过以下方式下载歌曲:frompytubeimportYouTubevideo=YouTube('https://www.youtube.com/watch?v=AWXvSBHB210')video.streams.get_by_itag(251).download()从今天开始出现此错误:Traceback(mostrecentcalllast):File"C:\Users\Me\AppData\Local\P......
  • Python 中的“样板”代码?
    Google有一个Python教程,他们将样板代码描述为“不幸的”,并提供了以下示例:#!/usr/bin/python#importmodulesusedhere--sysisaverystandardoneimportsys#Gatherourcodeinamain()functiondefmain():print'Hellothere',sys.argv[1]#Command......
  • Python 3.9.1 中的 collections.abc.Callable 是否有 bug?
    Python3.9包含PEP585并弃用typing模块中的许多类型,转而支持collections.abc中的类型,现在它们支持__class_getitem__例如Callable就是这种情况。对我来说,typing.Callable和collections.abc.Ca......
  • 列表子类的 Python 类型
    我希望能够定义列表子类的内容必须是什么。该类如下所示。classA(list):def__init__(self):list.__init__(self)我想包含键入内容,以便发生以下情况。importtypingclassA(list:typing.List[str]):#Maybesomethinglikethisdef__init__(self):......
  • Python 中类型友好的委托
    考虑以下代码示例defsum(a:int,b:int):returna+bdefwrap(*args,**kwargs):#delegatetosumreturnsum(*args,**kwargs)该代码运行良好,只是类型提示丢失了。在Python中使用*args,**kwargs来实现​​委托模式是很常见的。如果有一种方法可......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......