Python实现wav和pcm的转换方式

 更新时间:2023年05月06日 14:11:41   作者:Jellyfish733  
这篇文章主要介绍了Python实现wav和pcm的转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

wav和pcm的转换(Python版本)

wav和pcm是语音信号处理中最常见的文件格式,时常会遇到需要两种文件格式的相互转换。

wav存储的一般是解码后为[-1, 1]的float数据,文件头有44个字节记录文件的采样率、长度等等信息。

pcm存储的是int型整数,不含任何采样率相关信息。虽然原理比较简单,但是整理后更便于利用。

wav转pcm

原理:将文件头去掉,数据转成int型即可。

import numpy as np
def wav2pcm(wavfile, pcmfile, data_type=np.int16):
    f = open(wavfile, "rb")
    f.seek(0)
    f.read(44)
    data = np.fromfile(f, dtype= data_type)
    data.tofile(pcmfile) 

pcm转wav

原理:利用wave库,添加通道信息、采样位数、采样率等信息作为文件头,pcm数据直接写入即可。

import wave
def pcm2wav(pcm_file, wav_file, channels=1, bits=16, sample_rate=16000):
    pcmf = open(pcm_file, 'rb')
    pcmdata = pcmf.read()
    pcmf.close()
    if bits % 8 != 0:
        raise ValueError("bits % 8 must == 0. now bits:" + str(bits))
    wavfile = wave.open(wav_file, 'wb')
    wavfile.setnchannels(channels)
    wavfile.setsampwidth(bits // 8)
    wavfile.setframerate(sample_rate)
    wavfile.writeframes(pcmdata)
    wavfile.close()

PCM和WAV音频格式的区别及python自动转换

WAV和PCM的简单介绍

  • PCM

pcm:pulse code modulation,脉冲编码调制。将声音等模拟信号变成符号化的脉冲列,予以记录。是由[0]、[1]等符号构成的数字信号,未经过任何编码和压缩处理。pcm是没有压缩的编码方式。

  • WAV

wav:wav是一种无损音频文件格式,wav都有一个文件头,文件头包括音频流的【编码参数】,而对音频流的编码没有硬性规定,符合ACM规范的编码都行,所以wav格式通常只要在其他编码(pcm、MP3)下,加相应的decode(头文件)就可以转换

关于音频的基础知识

声道数channels

声道数即声音通道的数目。比如单声道就是左右声道播放是同一个声音,立体声可以使左右声道分工,使听起来有空间效果。

采样位数bits

也可以称为采样值或取样值,或叫采样精度、位深度,就是将采样样本幅度量化。例如8bits就是把纵坐标分成2的8次方,即256份。可以衡量声音波动变化的一个参数(声卡的分辨率)

采样频率sample_rate

取样频率,每秒取得声音样本的次数。频率越高,声音的质量也就越好,还原也就越真实。

由于人耳的分辨率很有限,太高的频率并不能分辨出来。在16位声卡中有22KHz、44KHz等几级,其中,22KHz相当于普通FM广播的音质,44KHz已相当于CD音质了,目前的常用采样频率都不超过48KHz

pcm文件所占容量:储存量=(采样频率*采样位数*声道*时间)/ 8 | (8为单位,字节数)

互相转换代码

import wave
import numpy as np
# pcm转wav格式,单声道,采样精度,采样率
def pcm2wav(pcm_file, wav_file, channels=1, bits=16, sample_rate=16000):
    with open(pcm_file,'rb') as f:
        pcmdata = f.read()
    if bits % 8 != 0:
        raise ValueError("bits % 8 must == 0. now bits:"+str(bits))
    wavfile = wave.open(wav_file,'wb')
    wavfile.setnchannels(channels)
    wavfile.setsampwidth(bits // 8)
    wavfile.setframerate(sample_rate)
    wavfile.writeframes(pcmdata)
    wavfile.close()
# wav转pcm格式
def wav2pcm(wav_file, pcm_file, data_type=np.int16):
    with open(wav_file,'rb') as f:
        f.seek(0)
        f.read(44)
        data = np.fromfile(f,dtype=data_type)
        data.tofile(pcm_file)
#wav_file,pcm_file分别是两种格式文件的读取(存储)路径

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python使用wmi模块获取windows下硬盘信息的方法

    python使用wmi模块获取windows下硬盘信息的方法

    这篇文章主要介绍了python使用wmi模块获取windows下硬盘信息的方法,涉及Python获取系统硬件信息的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Opencv实现抠图背景图替换功能

    Opencv实现抠图背景图替换功能

    这篇文章主要为大家详细介绍了Opencv实现抠图替换背景图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Python导入oracle数据的方法

    Python导入oracle数据的方法

    这篇文章主要介绍了Python导入oracle数据的方法,涉及Python读取csv文件信息再插入到Oracle数据库的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Python实现批量修改文件名实例

    Python实现批量修改文件名实例

    这篇文章主要介绍了Python实现批量修改文件名的方法,实例分析了两种实现批量修改文件名的技巧,涉及os.rename重命名方法、正则替换及字符串操作的相关技巧,需要的朋友可以参考下
    2015-07-07
  • 详解Python图像处理库Pillow常用使用方法

    详解Python图像处理库Pillow常用使用方法

    PIL(Python Imaging Library)是Python一个强大方便的图像处理库,只支持到Python2.7。这篇文章主要介绍了Python图像处理库Pillow常用使用方法,需要的朋友可以参考下
    2019-09-09
  • 用Python进行一些简单的自然语言处理的教程

    用Python进行一些简单的自然语言处理的教程

    这篇文章主要介绍了用Python进行一些简单的自然语言处理的教程,主要用到了pandas和collections库,需要的朋友可以参考下
    2015-03-03
  • Python tkinter 多选按钮控件 Checkbutton方法

    Python tkinter 多选按钮控件 Checkbutton方法

    这篇文章主要介绍了Python tkinter 多选按钮控件 Checkbutton方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • Python数据分析之pandas比较操作

    Python数据分析之pandas比较操作

    比较操作是很简单的基础知识,不过Pandas中的比较操作有一些特殊的点,本文介绍的非常详细,对正在学习python的小伙伴们很有帮助.需要的朋友可以参考下
    2021-05-05
  • Python中异常重试的解决方案详解

    Python中异常重试的解决方案详解

    这篇文章主要给大家介绍了在Python中异常重试的解决方案,文中介绍的非常详细,相信对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面随着小编一起来看看吧。
    2017-05-05
  • flask之邮件发送的实现示例

    flask之邮件发送的实现示例

    Flask-Mail是一个处理电子邮件发送的扩展,它提供了简单且易于使用的API,可以方便地发送电子邮件,本文就来介绍一下flask之邮件发送的实现示例,感兴趣的可以了解一下
    2023-12-12

最新评论