Python实现wav和pcm的转换方式

目录
  • wav和pcm的转换(Python版本)
    • wav转pcm
    • pcm转wav
  • PCM和WAV音频格式的区别及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分别是两种格式文件的读取(存储)路径

总结

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

(0)

相关推荐

  • python pcm音频添加头转成Wav格式文件的方法

    如下所示: ''''' add Head Infomation for pcm file ''' import sys import struct import os __author__ = 'bob_hu, hewitt924@gmail.com' __date__ = 'Dec 19,2011' __update__ = 'Dec 19,2011' def geneHeadInfo(sampleRate,bits,sampleNum): ''''' 生成头信息,需要采样率,每个采样的位数,

  • Python实现将mp3音频格式转换为wav格式

    最近收到一个朋友委托的需求,要将MP3的音频格式转换成wav的音频格式.于是,使用python写了这个小工具便于批量进行转换操作. 首先,下载需要导入的python模块包.这里选用清华大学的镜像站进行模块的下载. pip install ffmpy -i https://pypi.tuna.tsinghua.edu.cn/simple/ 然后,导入需要依赖的python模块. from ffmpy import FFmpeg as mpy # 音频格式转换对象 import os # 文件系统操

  • Python使用pydub库对mp3与wav格式进行互转的方法

    我们需要用到一个叫pydub的类库, pydub是python的高级一个音频处理库,可以让你以一种不那么蠢的方法处理音频.---开发者原话 https://github.com/jiaaro/pydub 附上开发者的github地址 安装: pip install pydub 如果在pycharm中也可以这样安装: setting----Project Interpreter----右边绿色+号 点一下install package 依赖安装: 作者在github 上说,依赖可以安装libav

  • Python基本类型的连接组合和互相转换方式(13种)

    本篇总结了一下字符串,列表,字典,元组的连接组合使用和类型的互相转换小例子,尤其列表中的extend()方法和字典中的 update方法非常的常用. 1.连接两个字符串 a = "hello " b = "world" a += b print(a) # hello world 2.字典的连接 dict1 = {1: "a", 2: "b"} dict2 = {3: "c", 4: "d"

  • python妙用之编码的转换详解

    前言 记得刚入门那个时候,自己处理编码转换问题往往是"百度:url解码.base64加密.hex--",或者是使用一款叫做"小葵多功能转换工具"的软件,再后来直接上Burpsuite的decoder功能,感觉用的还挺好的.不过,也遇到些问题:在线转换效率低(搜索占去了2/3的时间).两款工具存在一些小问题,比如burp中涉及中文往往显示乱码. 直到使用python来作为我日常编码转换工具-- 开启py转换之旅 url编码 url编码是一种浏览器用来打包表单输入的格式

  • Python中xml和dict格式转换的示例代码

    在做接口自动化的时候,请求数据之前都是JSON格式的,Python有自带的包来解决.最近在做APP的接口,遇到XML格式的请求数据,费了很大劲来解决,解决方式是:接口文档拿到的是XML,在线转化为json格式(目的是拿到xml数据的模板),存放到json文件中,根据接口名去提取. github原文介绍:使用XML的Python模块感觉就像您在使用JSON 链接:https://github.com/martinblech/xmltodict 下载xmltodict(pip install xml

  • python中有关时间日期格式转换问题

    每次遇到pandas的dataframe某列日期格式问题总会哉坑,下面记录一下常用时间日期函数.... 1.字符串转化为日期 str->date import datetime date_str = '2006-01-03' date_ = datetime.datetime.strptime(date_str,'%Y-&m-%d') 这是单个字符串的转化,其中"%Y-%m-%d"表示日期字符串的格式,若date_str='2006/1/3',则可写为"%Y/%

  • Python爬虫解析网页的4种方式实例及原理解析

    这篇文章主要介绍了Python爬虫解析网页的4种方式实例及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情.​ 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中,这个时候它的内容其实是一堆HTML,然后再对这些HTML内容进行解析,按照自己的想法提取出想要的数据,所以今天我们主要来讲四种在Py

  • Python 实现Image和Ndarray互相转换

    如下所示: import numpy as np from PIL import Image img = Image.open(filepath) img_convert_ndarray = np.array(img) ndarray_convert_img= Image.fromarray(img_convert_ndarray ) # np.array(object) 这个函数很强大啊,看源码里面给的注释 # object : array_like # An array, any objec

  • python如何把字符串类型list转换成list

    这篇文章主要介绍了python如何吧字符串类型list转换成list,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python读取了一个list是字符串形式的'[11.23,23.34]',想转换成list类型: 方式一: import ast str_list = "[11.23,23.34]" list_list = ast.literal_eval(str_list) print(type(list_list)) 得到结果为:

  • Python 读取WAV音频文件 画频谱的实例

    Python 读取WAV文件 import wave import struct from scipy import * from pylab import * #读取wav文件,我这儿读了个自己用python写的音阶的wav filename = '1.wav' wavefile = wave.open(filename, 'r') # open for writing #读取wav文件的四种信息的函数.期中numframes表示一共读取了几个frames,在后面要用到滴. nchannels

  • python程序输出无内容的解决方式

    问题缘由 某项目中使用python脚本方式将日志文件中的数据持续的转换格式输出到另一文件中以供其他日志分析应用使用.但是当后台运行采取重定向方式输出到某一文件时,发现并没有内容输出,命令如下: python xxx.py > xxx.log & 测试发现,当前台直接输出到终端时正常,使用后台运行重定向的方式输出到文件中时无法输出. 解决办法 发现是在程序运行时,输出有缓存,只有当程序运行结束或者缓冲区满后才会输出.因为程序是一致在运行的所以不可能等待程序结束在输出.并且要求是有实时性的所以等

  • Python之变量类型和if判断方式

    Python基础 1.数据类型(举几个最常用的) 整数型(int),可以理解为不带小数点的数字,比如13,-456等 浮点型(float) ,带小数点的数字,比如456.13,-798.13等 字符串(string),用'',"",''' '''或者""" """包裹的任意文本,比如'132',"abc"等, 如果输入的文本中包括''或者""需要在前面加\转义,比如'i\'m ok'这样

随机推荐