python-读写Wave文件及分析

# -*- coding: utf-8 -*-
import wave
import pylab as pl
import numpy as np

# 打开WAV文档
#首先载入Python的标准处理WAV文件的模块,然后调用wave.open打开wav文件,注意需要使用"rb"(二进制模式)打开文件:
f = wave.open(r"1.wav", "rb")
#open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据:

# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)

params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]

#getparams:一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采样频率,
#采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息:
#getnchannels, getsampwidth, getframerate, getnframes等方法可以单独返回WAV文件的特定的信息。

# 读取波形数据
str_data = f.readframes(nframes)
#readframes:读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位),readframes返回的是二进制数据(一大堆
#bytes),在Python中用字符串表示二进制数据:
f.close()

#将波形数据转换为数组
#接下来需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组:
wave_data = np.fromstring(str_data, dtype=np.short)
#通过fromstring函数将字符串转换为数组,通过其参数dtype指定转换后的数据格式,由于我们的声音格式是以两个字节表示一个取
#样值,因此采用short数据类型转换。现在我们得到的wave_data是一个一维的short类型的数组,但是因为我们的声音文件是双声
#道的,因此它由左右两个声道的取样交替构成:LRLRLRLR....LR(L表示左声道的取样值,R表示右声道取样值)。修改wave_data
#的sharp之后:
wave_data.shape = -1, 2
#将其转置得到:
wave_data = wave_data.T
#最后通过取样点数和取样频率计算出每个取样的时间:
time = np.arange(0, nframes) * (1.0 / framerate)

# 绘制波形
pl.subplot(211) 
pl.plot(time, wave_data[0])
pl.subplot(212) 
pl.plot(time, wave_data[1], c="g")
pl.xlabel("time (seconds)")
pl.show()

这里写图片描述

# -*- coding: utf-8 -*-
import wave
import numpy as np
import scipy.signal as signal

framerate = 44100
time = 10

# 产生10秒44.1kHz的100Hz - 1kHz的频率扫描波
t = np.arange(0, time, 1.0/framerate)
wave_data = signal.chirp(t, 100, time, 1000, method='linear') * 10000
wave_data = wave_data.astype(np.short)

# 打开WAV文档
f = wave.open(r"sweep.wav", "wb")

# 配置声道数、量化位数和取样频率
f.setnchannels(1)
f.setsampwidth(2)
f.setframerate(framerate)
# 将wav_data转换为二进制数据写入文件
f.writeframes(wave_data.tostring())
f.close()

参看文章:http://bigsec.net/b52/scipydoc/wave_pyaudio.html

发布了76 篇原创文章 · 获赞 107 · 访问量 13万+
展开阅读全文

pydub无法打开wav文件

10-17

打算使用pydub批量处理录音文件格式,但是光是执行到打开录音文件就会报错。 代码: from pydub import AudioSegment sound = AudioSegment.from_file('D:\\wavdownload\\1b449bd73b866e73c997401c19462353.wav', format='wav') 报错: Traceback (most recent call last): File "D:/PycharmProjects/chaxunyemian/wavtomp.py", line 5, in <module> sound = AudioSegment.from_file('D:\\wavdownload\\1b449bd73b866e73c997401c19462353.wav', format='wav') File "D:\Anaconda3\envs\baidujiami\lib\site-packages\pydub\audio_segment.py", line 704, in from_file p.returncode, p_err)) **pydub.exceptions.CouldntDecodeError: Decoding failed. ffmpeg returned error code: 1** Output from ffmpeg/avlib: ffmpeg version 4.2.1 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 9.1.1 (GCC) 20190807 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100 Guessed Channel Layout for Input Stream #0.0 : mono Input #0, wav, from 'D:\wavdownload\1b449bd73b866e73c997401c19462353.wav': Duration: 00:01:17.70, bitrate: 64 kb/s Stream #0:0: Audio: pcm_alaw ([6][0][0][0] / 0x0006), 8000 Hz, mono, s16, 64 kb/s Stream mapping: Stream #0:0 -> #0:0 (pcm_alaw (native) -> pcm_s8 (native)) Press [q] to stop, [?] for help [wav @ 000000000042b9c0] **pcm_s8 codec not supported in WAVE format Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented Error initializing output stream 0:0 -- Conversion failed!** 是不是wav文件的编码有问题?我该如何解决 在cmd尝试用命令来转换格式是可以的: ffmpeg -i 1b449bd73b866e73c997401c19462353.wav d:\wavdownload\1b449bd73b866e73c997401c19462353.mp3 执行这条语句拿到了MP3文件。 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览