Python实现WAV文件重采样与通道转换

Dylan
Dylan
发布时间:2026-10-11| 6人浏览过
原创

本文介绍在Python中对WAV文件进行重采样(改变采样率)及通道转换的方法。通过Librosa库的load函数可快速实现音频重采样;同时提供基于标准库wave和audioop的手动实现方案,支持指定输入输出采样率及通道数(如双通道转单通道),并包含完整的代码示例与注意事项。

使用Librosa进行快速重采样

Librosa是Python中常用的音频处理库,其load()函数提供了便捷的重采样功能。该方法适合快速处理音频文件,无需手动编写底层转换逻辑。

前置依赖

在使用Librosa之前,系统需安装ffmpeg以支持音频解码。可通过以下命令安装:

conda install -c conda-forge ffmpeg

随后安装Librosa:

pip install librosa

代码示例

以下代码将音频文件test.wav重采样至8kHz:

import librosa
y, s = librosa.load('test.wav', sr=8000)

执行后,y为下采样后的音频数据,类型为np.ndarray。若输入与输出均为单通道,可直接使用此方案。

基于标准库的手动重采样实现

若需更精细控制或避免第三方依赖,可使用Python标准库中的wave和audioop模块。以下提供两个版本的实现,分别针对双通道转单通道和单通道直接重采样。

方案一:双通道转单通道(44.1kHz转16kHz)

该函数支持指定输入输出采样率及通道数,并将双声道音频合并为单声道。

def downsampleWav(src, dst, inrate=44100, outrate=16000, inchannels=2, outchannels=1):
 import os,wave,audioop
 if not os.path.exists(src):
  print ('Source not found!')
  return False
 
 if not os.path.exists(os.path.dirname(dst)):
  os.makedirs(os.path.dirname(dst))
 
 try:
  s_read = wave.open(src, 'r')
  s_write = wave.open(dst, 'w')
 except:
  print ('Failed to open files!')
  return False
 
 n_frames = s_read.getnframes()
 data = s_read.readframes(n_frames)
 
 try:
  converted = audioop.ratecv(data, 2, inchannels, inrate, outrate, None)
  if outchannels == 1:
   converted = audioop.tomono(converted[0], 2, 1, 0)
 except:
  print ('Failed to downsample wav')
  return False
 
 try:
  s_write.setparams((outchannels, 2, outrate, 0, 'NONE', 'Uncompressed'))
  s_write.writeframes(converted)
 except:
  print ('Failed to write wav')
  return False
 
 try:
  s_read.close()
  s_write.close()
 except:
  print ('Failed to close wav files')
  return False
 
 return True

方案二:单通道直接重采样(48kHz转16kHz)

当输入输出均为单通道时,可使用此简化版本。该函数自动读取源文件参数,并写入目标文件。

def downsampleWav(src, dst, inrate=48000, outrate=16000, inchannels=1, outchannels=1):
 import os,wave,audioop
 if not os.path.exists(src):
  print ('Source not found!')
  return False
 
 if not os.path.exists(os.path.dirname(dst)):
  os.makedirs(os.path.dirname(dst))
 
 try:
  s_read = wave.open(src, 'rb')
  params = s_read.getparams()
  nchannels, sampwidth, framerate, nframes = params[:4]
  print(nchannels,sampwidth, framerate,nframes)
  s_write = wave.open(dst, 'wb')
 except:
  print ('Failed to open files!')
  return False
 
 n_frames = s_read.getnframes()
 data = s_read.readframes(n_frames)
 
 try:
  converted = audioop.ratecv(data, 2, inchannels, inrate, outrate, None)
  if outchannels == 1 and inchannels != 1:
   converted = audioop.tomono(converted[0], 2, 1, 0)
 except:
  print ('Failed to downsample wav')
  return False
 
 try:
  s_write.setparams((outchannels, 2, outrate, 0, 'NONE', 'Uncompressed'))
  s_write.writeframes(converted[0])
 except Exception as e:
  print(e)
  print ('Failed to write wav')
  return False
 
 try:
  s_read.close()
  s_write.close()
 except:
  print ('Failed to close wav files')
  return False
 
 return True

注意事项

  • 操作前请确保源文件存在,且目标路径具有写入权限。
  • 修改音频参数可能影响音质,建议备份原始文件。
  • 使用audioop模块时,注意数据格式(如16位整型)需与源文件一致。

以上就是Python对wav文件重采样的详细内容,更多关于Python音频处理、Librosa使用及audioop模块的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。