VLA-NeoArm——第二章文件录音与播放


前言

Python提供了一些库可以用于录音和播放音频文件。常见的库有pyaudio和wave,这些库允许用户录制麦克风输入并将其保存为WAV文件格式,然后再进行回放。以下是关于如何使用这些库录音和播放的简单介绍。为了录制音频,我们通常使用pyaudio库,它提供了对音频流的处理功能。我们可以设置音频格式、通道数、采样率、缓冲区大小等参数,并启动音频流进行录制。录制的数据可以保存到wave文件中,供后续播放。


一、使用Python进行录音文件

废话少说直接放代码

def record_auto(MIC_INDEX=1):

    logger.info('准备录音..........')
    CHUNK = 1024  # 采样宽度
    RATE = 16000  # 采样率

    QUIET_DB = 2000  # 分贝阈值,大于则开始录音,否则结束
    delay_time = 1  # 声音降至分贝阈值后,经过多长时间,自动终止录音

    FORMAT = pyaudio.paInt16
    CHANNELS = 1

    # 初始化录音
    p = pyaudio.PyAudio()
    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK,
                    input_device_index=MIC_INDEX
                    )

    frames = []  # 所有音频帧

    flag = False  # 是否已经开始录音
    quiet_flag = False  # 当前音量小于阈值

    temp_time = 0  # 当前时间是第几帧
    last_ok_time = 0  # 最后正常是第几帧
    START_TIME = 0  # 开始录音是第几帧
    logger.info('开始录音..........')
    while True:
        # 获取当前chunk的声音
        data = stream.read(CHUNK, exception_on_overflow=False)
        frames.append(data)
        # 获取当前chunk的音量分贝值
        temp_volume = np.max(np.frombuffer(data, dtype=np.short))

        if temp_volume > QUIET_DB and flag == False:
            logger.info("音量高于阈值,开始录音")
            flag = True
            START_TIME = temp_time
            last_ok_time = temp_time

        if flag:  # 录音中的各种情况

            if (temp_volume < QUIET_DB and quiet_flag == False):
                logger.info("录音中,当前音量低于阈值")
                quiet_flag = True
                last_ok_time = temp_time

            if (temp_volume > QUIET_DB):
                # print('录音中,当前音量高于阈值,正常录音')
                quiet_flag = False
                last_ok_time = temp_time

            if (temp_time > last_ok_time + delay_time * 15 and quiet_flag == True):
                logger.info("音量低于阈值{:.2f}秒后,检测当前音量".format(delay_time))
                if (quiet_flag and temp_volume < QUIET_DB):
                    logger.info("当前音量仍然小于阈值,录音结束")
                    END_TIME = temp_time
                    break
                else:
                    logger.info("当前音量重新高于阈值,继续录音中")
                    quiet_flag = False
                    last_ok_time = temp_time

        # print('当前帧 {} 音量 {}'.format(temp_time+1, temp_volume))
        temp_time += 1
        if temp_time > 150:  # 超时直接退出
            END_TIME = temp_time
            logger.info('超时,录音结束')
            break

        # 停止录音
    stream.stop_stream()
    stream.close()
    p.terminate()
    # 导出wav音频文件
    wf = wave.open(output_path, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames[START_TIME - 2:END_TIME]))
    wf.close()
    logger.info('保存录音文件:{}', output_path)

二、Windows播放音频


def play_wav(wav_file=r'E:\\Project\\python\\VLA_NeoArm\\resource\\tts.wav'):
    '''
    播放wav音频文件
    '''

    # 播放 WAV 文件并等待播放完成
    audio = AudioSegment.from_wav(wav_file)

    # 播放音频
    play(audio)

三、Linux播放音频

import os

def play_audio_with_system(file_path):
    # 使用 aplay 播放 WAV 文件
    os.system(f"aplay {file_path}")

    # 如果是 MP3 文件,可以使用 mpg123
    # os.system(f"mpg123 {file_path}")

# 使用示例
play_audio_with_system("output.wav")


总结

  • Python录音代码:通过pyaudio进行录音,设置采样率为16000Hz,单声道。根据分贝阈值自动启动和停止录音,超时则直接结束录音,并保存为WAV文件。
  • Windows播放音频:使用pydub库中的AudioSegment加载WAV文件,并通过play函数进行播放。
  • Linux播放音频:通过系统命令aplay播放WAV文件,或使用mpg123播放MP3文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值