1. 环境搭建与音频采集

任务目标

搭建Python语音开发环境,调用麦克风采集一段音频,将其保存为标准WAV文件,并验证文件可正常读取。

环境依赖

需要Python 3.8+,并安装以下库:

pip install pyaudio numpy

Windows系统若安装PyAudio失败,可先安装对应Python版本的PyAudio‑0.2.11‑cpXX‑cpXX‑win_amd64.whl(从https://github.com/intxcc/pyaudio_portaudio获取),再执行pip install 下载的.whl文件。

实现代码

以下代码完成麦克风录音并保存为WAV文件:

import pyaudio
import wave
import numpy as np

SAMPLE_RATE = 16000    # 采样率 16kHz
CHANNELS = 1           # 单声道
CHUNK = 1024           # 每次读取的帧数
RECORD_SECONDS = 3     # 录音时长
OUTPUT_FILE = "record.wav"

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

# 打开麦克风输入流
stream = p.open(format=pyaudio.paInt16,
                channels=CHANNELS,
                rate=SAMPLE_RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("开始录音...")
frames = []

for _ in range(0, int(SAMPLE_RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("录音结束")

# 停止并关闭流
stream.stop_stream()
stream.close()
p.terminate()

# 将音频数据写入 WAV 文件
with wave.open(OUTPUT_FILE, 'wb') as wf:
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
    wf.setframerate(SAMPLE_RATE)
    wf.writeframes(b''.join(frames))

print(f"已保存为 {OUTPUT_FILE}")

# 验证:读取文件并检查时长与数据量
with wave.open(OUTPUT_FILE, 'rb') as wf:
    n_channels = wf.getnchannels()
    samp_width = wf.getsampwidth()
    frame_rate = wf.getframerate()
    n_frames = wf.getnframes()
    duration = n_frames / frame_rate
    audio_data = wf.readframes(n_frames)
    samples = np.frombuffer(audio_data, dtype=np.int16)

print(f"通道数: {n_channels}")
print(f"采样宽度: {samp_width} 字节")
print(f"采样率: {frame_rate} Hz")
print(f"总帧数: {n_frames}")
print(f"时长: {duration:.2f} 秒")
print(f"有效采样点数: {len(samples)}")
print(f"音频幅值范围: [{samples.min()}, {samples.max()}]")

运行方式

  1. 将上述代码保存为 record_audio.py。
  2. 确保麦克风已连接且系统已授权终端/IDE访问麦克风。
  3. 在终端执行:python record_audio.py
  4. 程序会提示“开始录音”,请对着麦克风说话或发出声音,3秒后自动结束。

验证方法

运行结束后,检查当前目录下是否生成 record.wav 文件。程序输出的验证信息应满足以下条件即判定通过:

  • 通道数为1,采样宽度为2字节,采样率为16000 Hz。
  • 时长约为3.00秒(允许±0.1秒误差)。
  • 有效采样点数约为48000(16000 × 3)。
  • 音频幅值范围不为[0, 0]——若录音时确有声音输入,最小值应小于0或最大值大于0;若完全静音则可能为[0,0],此时需重新录音并确保发声。

也可用任意音频播放器打开 record.wav,应能听到刚才录制的声音。

常见问题

  • 麦克风无声音:检查系统麦克风权限是否开启,以及默认录音设备是否正确。
  • PyAudio安装失败:Windows用户优先使用预编译whl文件安装;Linux用户可先执行 sudo apt install portaudio19-dev 再安装。
  • 录音文件时长不对:确认 RECORD_SECONDS 值,并检查是否有其他程序占用麦克风导致读取延迟。