Python “文件”是什么类型的;“声音片段”;audioop的参数?

Python “文件”是什么类型的;“声音片段”;audioop的参数?,python,audio,beat-detection,Python,Audio,Beat Detection,声明大多数可用函数都需要“声音片段” audioop模块包含一些关于声音片段的有用操作。它对声音片段进行操作,声音片段由8、16或32位宽的有符号整数样本组成,存储在Python字符串中 什么是声音片段?如何将现有的.wav文件转换为声音片段 谢谢。您可能需要查看该模块。您可能希望以读取模式打开一个文件,并使用readframes获取audiooop所需的示例。您可以使用 open()方法打开文件,然后readframes(n)以字节字符串的形式返回(最大)n帧音频,这正是audioop想要的

声明大多数可用函数都需要“声音片段”

audioop模块包含一些关于声音片段的有用操作。它对声音片段进行操作,声音片段由8、16或32位宽的有符号整数样本组成,存储在Python字符串中

什么是声音片段?如何将现有的.wav文件转换为声音片段


谢谢。

您可能需要查看该模块。您可能希望以读取模式打开一个文件,并使用
readframes
获取
audiooop所需的示例。

您可以使用

open()
方法打开文件,然后
readframes(n)
以字节字符串的形式返回(最大)n帧音频,这正是audioop想要的

例如,假设您需要使用audioop中的
avg()
方法。这就是你可以做到的:

导入波
导入音频操作
wav=波打开(“piano2.wav”)
打印(audioop.avg(wav.readframes(wav.getnframes()),wav.getsampwidth())
产出:

-2
另外,您可能对wave模块中的
rewind()
方法感兴趣。它将读取位置放回wav文件的开头

如果需要两次读取wav文件,可以编写以下内容:

wav=wave.open(“piano2.wav”)
打印(audioop.avg(wav.readframes(wav.getnframes()),wav.getsampwidth())
#如果不调用rewind,则调用next readframes()
#将不返回任何内容,audioop将失败
倒带
打印(audioop.max(wav.readframes(wav.getnframes()),wav.getsampwidth())
或者,您也可以缓存字符串:

wav=wave.open(“piano2.wav”)
string_wav=wav.readframes(wav.getnframes())
打印(audioop.avg(string_wav,wav.getsampwidth())
#倒带
打印(audioop.max(string_wav,wav.getsampwidth())

要回答片段到底是什么,它是一个,它只是一个字节字符串。我相信对于8位音频文件,8位音频的每帧将有一个字节,16位音频的每帧将有两个字节,32位音频的每帧将有四个字节。

声音片段表示在类似字节的对象中编码的有符号整数声音样本序列
audioop
支持每个样本1、2、3或4字节的表示

import audioop
import wave
read = wave.open("C:/Users/Pratik/sampy/cat.wav")
string_wav = read.readframes(read.getnframes())
a = audioop.lin2alaw(string_wav,read.getsampwidth())
print(a)
----------------------------------------------------------
how to convert wav file  to alaw
可以使用
struct.pack
转换单个示例(我们使用0、1、2、-1、42作为示例):

来自结构导入包
对于[0,1,2,-1,42]中的样本:
打印(f'sample value{sample},1字节/样本:',pack('b',sample))
打印(f'{sample},2字节/样本:',pack('h',sample))
打印(f'{sample},4字节/样本:',pack('i',sample))
这张照片是:

样本值0,1字节/样本:b'\x00'
0,2字节/样本:b'\x00\x00'
0,4字节/样本:b'\x00\x00\x00\x00'
样本值1,1字节/样本:b'\x01'
1,2字节/样本:b'\x01\x00'
1,4字节/样本:b'\x01\x00\x00\x00'
样本值2,1字节/样本:b'\x02'
2,2字节/样本:b'\x02\x00'
2,4字节/样本:b'\x02\x00\x00\x00'
样本值-1,1字节/样本:b'\xff'
-1,2字节/示例:b'\xff\xff'
-1,4字节/示例:b'\xff\xff\xff\xff'
样本值42,1字节/样本:b'*'
42,2字节/样本:b'*\x00'
42,4字节/样本:b'*\x00\x00\x00'
假设我们想要将Python(有符号)整数表示中的一些声音样本转换为声音片段,每个样本使用2字节(允许输入样本值介于-32768到32767之间;即
-2**15
2**15-1
),就像音频CD中使用的那样:

import audioop
导入数组
样本=[0,1000,32767,1,-1,-32768,-1000]#7个“音乐”样本
fragment=array.array('h',samples).tobytes()
打印(长度为{len(Fragment)}'的f'Fragment{Fragment})
#使用audioop功能转换回
打印([audioop.getsample(fragment,2,i)表示范围内的i(len(fragment)//2)])
这张照片是:

长度为14的
片段b'\x00\x00\xe8\x03\xff\x7f\x01\x00\xff\xff\x00\x80\x18\xfc'
[0, 1000, 32767, 1, -1, -32768, -1000]
作为最后一个示例,将3秒钟的立体声正弦波写入
.wav
文件,然后再次读取:

import audioop
输入波
从数组导入数组
从数学输入sin,pi
每个样本的字节数=2
持续时间=3.#秒
抽样率=16000赫兹
频率=440。#赫兹
最大振幅=2**(每个样本的字节数*8-1)-1
amp=最大振幅*0.8
时间=[范围内i的i/采样率(int(采样率*持续时间))]
samples=[int(四舍五入(amp*sin(2*pi*frequency*t)))表示时间t]
fragment_mono=array('h',samples).tobytes()
片段立体声=audioop.tostereo(片段单声道,每个样本的字节数,1,1)
将wave.open('sine_440hz_stereor.wav','wb')作为wav:
波形设置通道(2)#立体声
设置采样宽度(每个采样的字节数)
波形设置帧率(采样率)
wav.writeframes(片段\立体声)
#再次读取波形文件
将wave.open('sine_440hz_stereor.wav','rb')作为wav:
fragment=wav.readframes(wav.getnframes())
#测试写入片段和读取片段是否相同
断言片段==片段

非常感谢,非常彻底!