python分析pcm音频文件

本文介绍使用Python3.3和matplotlib库分析PCM音频文件的方法。通过两种方式读取和解析双声道16位采样的音频数据,展示了如何绘制左、右声道的波形图。
部署运行你感兴趣的模型镜像

最近研究的,我用的是python3.3, 用matplotlib画图,

下面代码演示分析pcm文件,如果是wave文件,把wave的文件头去掉就是pcm文件了。

代码如下

# -*- coding:utf-8 -*-

import array
import os
from matplotlib import pyplot

fileName = 'e:/music/qianqian.pcm' # 2 channel, 16 bit per sample
file = open(fileName, 'rb')
base = 1 / (1<<15)

shortArray = array.array('h') # int16
size = int(os.path.getsize(fileName) / shortArray.itemsize)
count = int(size / 2)
shortArray.fromfile(file, size) # faster than struct.unpack
file.close()
leftChannel = shortArray[::2]
rightChannel = shortArray[1::2]

def showPCM(leftChannel, rightChannel, start = 0, end = 5000):
    fig = pyplot.figure(1)

    pyplot.subplot(211)
    pyplot.title('pcm left channel [{0}-{1}] max[{2}]'.format(start, end, count))
    pyplot.plot(range(start, end), leftChannel[start:end])

    pyplot.subplot(212)
    pyplot.title('pcm right channel [{0}-{1}] max[{2}]'.format(start, end, count))
    pyplot.plot(range(start, end), rightChannel[start:end])

    pyplot.show()
    # fig.savefig('pcm.pdf') # save figure to pdf file

showPCM(leftChannel, rightChannel, 0, count)

 

 

另一种分析方法,用struct.unpack,但读取要比上一种慢很多

 

# -*- coding:utf-8 -*-

import struct
from matplotlib import pyplot

file = open('e:/music/qianqian.pcm', 'rb') # if file is too large, pyplot may overflow
count = 0
total = 0
base = 1 / (1<<15)
maxl = 0
minl = 0
maxr = 0
minr = 0
larray = []
rarray = []
# file has two channels, 16 bit per sample
while True:
    lr = file.read(4)
    if len(lr) < 4:
        break
    count += 1
    lvalue = struct.unpack('h', lr[:2])[0] * base
    larray.append(lvalue)
    if lvalue > maxl:
        maxl = lvalue
    if lvalue < minl:
        minl = lvalue
    total += lvalue
    rvalue = struct.unpack('h', lr[2:])[0] * base
    rarray.append(rvalue)
    if rvalue > maxr:
        maxr = rvalue
    if rvalue < minr:
        minr = rvalue

file.close()
avarage = total / count
print(count, total, avarage)
print('max = {0} min = {1}'.format(maxl, minl))

fig = pyplot.figure(1)
pyplot.subplot(211)
pyplot.title('pcm left channel')
pyplot.plot(range(count), larray)
pyplot.subplot(212)
pyplot.title('pcm right channel')
pyplot.plot(range(count), rarray)
pyplot.show()
# fig.savefig('pcm.pdf')

 

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们被要求回答关于Python进行音频文件分析的方法和工具。根据提供的引用,我们可以总结出几种方法: 1. 使用`wave`模块进行录音和音频文件写入(引用[1])。 2. 使用AssemblyAI这样的在线服务进行高级音频分析,包括转录、情感分析、主题分类等(引用[2])。 3. 使用`matplotlib`和`array`模块读取PCM音频文件并绘制波形图(引用[3])。 此外,我们还可以补充一些常见的音频处理库,比如`pydub`、`librosa`、`scipy`等。 因此,我们可以组织回答如下: 1. 介绍基本的音频文件读写(使用内置模块`wave`)。 2. 介绍使用AssemblyAI等在线API进行高级分析。 3. 介绍使用`matplotlib`进行简单的波形可视化。 4. 补充其他常用工具和库。 注意:在回答中,我们应当自然地引用提供的引用内容,并在末尾添加引用标识。同时,按照要求,行内数学公式用$...$,独立公式用$$...$$(但本问题可能涉及数学公式较少,如果有则按规则处理)。 最后,生成相关问题。 由于用户的问题是关于方法和工具,我们将重点放在介绍工具和方法上。 回答结构: - 首先简要介绍Python在音频分析中的应用。 - 然后分点介绍不同的方法和工具,结合引用内容。 - 最后总结。 同时,我们注意到用户引用了三个代码片段,我们可以在回答中适当提及这些代码片段所展示的方法。 但是注意,引用[3]中的代码存在一个错误:在读取PCM文件时,它假设是双声道,并且每个样本16位(即2字节)。我们在介绍时可以指出这是处理PCM文件的一种方式。 另外,我们还可以提到一些其他常用的库,比如: - `pydub`: 用于音频文件格式转换和简单处理。 - `librosa`: 用于音乐和音频分析,提供特征提取(如MFCC)等功能。 - `scipy.io.wavfile`: 读取和写入wav文件。 - `soundfile`: 读取和写入多种音频格式。 我们按照以下步骤组织: 1. 基本音频文件读写:使用`wave`(如引用[1])和`scipy.io.wavfile`。 2. 音频可视化:使用`matplotlib`(如引用[3])。 3. 高级音频分析:使用在线API(如AssemblyAI,如引用[2])和本地库(如`librosa`)。 注意:由于引用[3]中的代码有HTML实体(`<`)等,我们在回答中不需要展示代码,但可以描述其方法。 开始回答: </think> ### Python音频文件分析方法与工具 Python提供了多种音频分析工具库,可根据需求选择不同层级的解决方案: #### 1. **基础音频处理** - **`wave`模块**:Python标准库,用于WAV文件的读写操作 ```python import wave wf = wave.open("audio.wav", "rb") channels = wf.getnchannels() # 获取声道数 framerate = wf.getframerate() # 采样率 frames = wf.readframes(1024) # 读取音频帧 ``` 适用于基础录音和音频文件操作[^1]。 - **PCM原始数据处理**:可直接解析原始音频数据 ```python import array short_array = array.array('h') # 16位有符号整型 with open('audio.pcm', 'rb') as f: short_array.fromfile(f, 1024) # 加载PCM数据 ``` #### 2. **波形可视化分析** 使用`matplotlib`实现音频波形可视化: ```python from matplotlib import pyplot as plt plt.plot(left_channel[1000:2000]) # 绘制左声道片段 plt.title("音频波形分析") plt.show() ``` 可直观展示声道分离、振幅变化等特征[^3]。 #### 3. **高级音频分析库** - **Librosa**:专业音频特征提取 ```python import librosa y, sr = librosa.load('audio.wav') mfcc = librosa.feature.mfcc(y=y, sr=sr) # MFCC特征提取 tempo = librosa.beat.tempo(y=y) # 节拍分析 ``` - **PyAudioAnalysis**:封装常用分析功能 ```python from pyAudioAnalysis import audioBasicIO from pyAudioAnalysis import audioFeatureExtraction fs, samples = audioBasicIO.read_audio_file("audio.wav") features = audioFeatureExtraction.stFeatureExtraction(samples, fs, 0.05*fs, 0.025*fs) ``` #### 4. **云端智能分析服务** 如AssemblyAI提供一体化API服务: ```python import requests transcription_endpoint = "https://api.assemblyai.com/v2/transcript" json = { "audio_url": "https://example.com/audio.wav", "sentiment_analysis": True, # 情感分析 "speaker_labels": True # 说话人分离 } response = requests.post(transcription_endpoint, json=json, headers=headers) ``` 支持语音转写、情感分析、内容分类等高级功能[^2]。 #### 5. **实时音频处理** - **PyAudio**:实时音频流处理 ```python import pyaudio p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=1024) data = stream.read(1024) # 实时捕获音频 ``` ### 工具选择建议 | 需求场景 | 推荐工具 | 典型应用 | |----------------|-------------------------|-----------------------| | 基础文件操作 | `wave`, `scipy.io.wavfile` | 格式转换, 元数据读取 | | 科研级分析 | Librosa, Essentia | 特征提取, 音乐信息检索| | 商业级应用 | AssemblyAI, SpeechRecognition | 语音转写, 内容分析 | | 实时处理 | PyAudio, SoundDevice | 实时录音, 流处理 |
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值