Python 音频模块

发布时间:2022-07-24

Python 音频模块

Python 编程语言因其用户友好的特性而成为当今的主流。Python 还有许多有趣的模块和库,用户可以通过它们做很多事情。Python 语言最有趣的特性之一是它的音频模块。在本文中,我们将讨论各种类型的音频模块及其独特的功能和优势。 本文将涵盖 Python 中 10 种不同类型的音频模块和库:

  • 自己动手(pick-your-own)
  • PyAudio(音频)
  • 德佳佛
  • 明戈斯
  • 极超音速的
  • 皮杜布
  • 简单音频
  • winsound
  • python 声音设备
  • 播放声音 让我们逐一了解以上音频模块。

1. PYO

PYO 是一个 Python 模块,是用 C 语言编写的一个用于创建数字信号处理的脚本。Python 的这个模块包含用于处理各种音频信号类型的类。因此,用户可以直接在 Python 脚本或项目中导入信号处理链,并可以通过使用解释器实时操纵音频信号。 Python 中 PYO 模块的工具具有诸如数学运算、延迟等基本信号处理、合成发生器、滤波器等原语。但它也将算法复杂化,以开发声音粒化和许多其他艺术音频操作。 例如:

# to play a sound file:
from pyo import *
sound = Server().boot()
sound.start()
sound_file = SFPlayer("path/to/users/sound.aif", speed=1, loop=True).out()
# for Granulating an audio buffer:
sound = Server().boot()
sound_nd = SndTable("path/to/users/sound.aif")
ev = HannTable()
ps = Phasor(freq=sound_nd.getRate()*.25, ml=sound_nd.getSize())
dr = Noise(mul=.001, add=.1)
granulate = Granulator(sound_nd, ev, [1, 1.001], ps, dr, 32, ml=.1).out()
# to generate melodies:
sound = Server().boot()
sound.start()
wv = SquareTable()
ev = CosTable([(0, 0), (100, 1), (500, 0.3), (8391, 0)])
mt = Metro(0.135, 12).play()
ap = TrigEnv(mt, table=ev, dr=1, ml=.1)
pt = TrigXnoiseMidi(mt, dist='loopseg', x1=20, scale=1, mrange=(47, 74))
out = Osc(table=wav, freq=pt, ml=ap).out()

2. PyAudio

Pyaudio 是一个 Python 库,是一个开源的跨平台音频输入输出。它具有广泛的功能,与音频相关,主要集中在分割、特征提取、分类和可视化问题上。 通过使用 pyaudio 库,用户可以对未知声音进行分类,执行有监督和无监督的分割,提取音频特征和表示,检测音频事件并从长录音中过滤出静默期,应用降维来可视化音频数据和内容相似性等等。 该库为 PortAudio 提供绑定。用户可以使用这个库在不同的平台上播放和录制音频,比如 Windows、Mac 和 Linux。要使用 pyaudio 库播放音频,用户必须写入 stream。 例如:

import pyaudio
import wave
filename = 'example.wav'
# Set chunk size of 1024 samples per data frame
chunksize = 1024  
# Now open the sound file, name as wavefile
wavefile = wave.open(filename, 'rb')
# Create an interface to PortAudio
portaudio = pyaudio.PyAudio()
# Open a .Stream object to write the WAV file to play the audio using pyaudio
# in this code, 'output = True' means that the audio will be played rather than recorded
streamobject = portaudio.open(format=portaudio.get_format_from_width(wavefile.getsampwidth()),
                channels=wavefile.getnchannels(),
                rate=wavefile.getframerate(),
                output=True)
# Read data in chunksize
Data_audio = wavefile.readframes(chunksize)
# Play the audio by writing the audio data to the streamobject
while data != '':
    streamobject.write(data_audio)
    data_audio = wavefile.readframes(chunksize)
# Close and terminate the streamobject
streamobject.close()
portaudio.terminate()

在这里,用户可以注意到,与其他音频播放库相比,使用 pyaudio 库播放音频可能有点复杂。这就是为什么这个库可能不是用户在他们的项目或应用中播放音频的首选。 虽然,由于 pyaudio 库提供了更多的低级控制,这使得用户可以为他们的输入和输出设备设置参数。这个库还允许用户检查他们的 CPU 负载和输入输出活动。 Pyaudio 库还允许用户在回叫模式下播放和录制音频。当回放需要新数据并可用于记录时,调用规定的回调函数。这些是 pyaudio 库的特性,这使它不同于其他音频库和模块。如果用户想要播放简单回放之外的音频,则专门使用该库。

3. Dejavu

Dejavu 是 Python 中的一个音频指纹模块。这是一个开源模块。这个模块可以通过听一遍来记住录制的音频,并且这个模块将音频存储在数据库中。此后,当播放歌曲、麦克风输入或磁盘文件时,Dejavu 会尝试将音频与数据库中存储的指纹进行匹配,并返回先前播放的歌曲或录音。 Dejavu 模块在识别具有真实噪声量的特定信号方面更胜一筹。用户可以使用 Dejavu 识别音频的形式有两种:

  • 用户可以通过读取和处理磁盘上的音频文件来识别音频。 或者,
  • 用户可以使用电脑的麦克风。 例如:
# User should create a MySQL database where Dejavu can store fingerprints of the audio. 
# on user local setup:
$ mysql -u root -p
Enter password: *************
mysql> HERE, USER SHOULD CREATE A DATABASE dejavu;

现在用户可以开始指纹他们的音频收藏!

from dejavu import Dejavu
config = {
    "database": {
         "host": "125.0.1.1",
         "user": "root",
         "password": <password imported in Local setup>, 
         "database": <name of the database user has created in local setup>,
     }
}
dejv = Dejavu(config)

4. Mingus

Mingus 是 Python 中的一个包。它被许多程序员、音乐研究者和作曲家用来制作和检查音乐和歌曲。这个包是一个跨平台的非常高级的音乐理论表示包,支持 Python 以及乐器数字接口文件和回放。 Mingus 包可以用来玩音乐理论,用于教育工具,用于为歌曲构建编辑器,以及用于用户想要导入处理和播放音乐功能的许多其他应用和软件。这个包是一个音乐理论,它包括像音阶、渐进性、和弦和音程这样的主题。这个包测试这些组件,并用于在方便的速记帮助下生成和识别音乐要点。 例如:

import mingus.core.notes as notes_m
# for valid notes
notes_m.is_valid_note("C") 
notes_m.is_valid_note("D#") 
notes_m.is_valid_note("Eb")
notes_m.is_valid_note("Fbb")
notes_m.is_valid_note("G##")

输出:

True
True
True
True
True
notes_m.is_valid_note("c")
notes_m.is_valid_note("D #")
notes_m.is_valid_note("E-b")

输出:

False
False
False

5. 超音速

超音速是 Python 和 C 语言的框架。这用于开发和操作用于实时控制的声音处理管道。这个框架是一个低级的,其中每个字节计数,这也包括声卡,过滤器内存操作,文件 io 和振荡器的对象。该框架在 Linux 和 OSX 操作系统上运行。

6. Pydub

Pydub 是一个 Python 库,用于操纵音频并为其添加效果。这个库是一个非常简单和容易但是高级的接口,它基于 FFmpeg 并且倾向于 jQuery。该库用于在音频中添加 id3 标签,对其进行切片,并连接音频轨道。Pydub 库支持 Python 的 2.6、2.7、3.2 和 3.3 版本。 但是,用户可以使用 pydub 库打开和保存 WAV 文件,而没有任何依赖关系。但是如果用户想要播放音频,需要安装音频播放包。 以下代码可用于播放带 pydub 的 WAV 文件: 例如:

from pydub import AudioSegment
from pydub.playback import play
sound_audio = AudioSegment.from_wav('example.wav')
play(sound_audio)

如果用户想播放其他音频文件格式,如 MP3 文件,他们应该安装 libav 或 FFmpeg。 安装 FFmpeg 后,用户需要对代码做一个小的改动,才能播放 MP3 文件。 例如:

from pydub import AudioSegment
from pydub.playback import play
sound_audio = AudioSegment.from_mp3('example.mp3') 
play(sound_audio)

通过使用 audio_segment.from_file(filename, file_type) 语句,用户可以播放音频文件的 ffmpeg 支持的任何格式。 例如:

# Users can play a WMA file:
sound = AudioSegment.from_file('example.wma', 'wma')

Pydub 库还允许用户以不同的文件格式保存音频。用户还可以计算音频文件的长度。用户可以通过使用这个库在音频中使用交叉淡入淡出。

7. 简单音频

Simpleaudio 是一个跨平台的 Python 库。该库还用于播放没有任何依赖关系的 WAV 文件。simpleaudio 库在脚本终止前等待文件完成播放 WAV 格式的音频。 例如:

import simpleaudio as simple_audio
filename = 'example.wav'
wave_object = simple_audio.WaveObject.from_wave_file(filename)
play_object = wave_object.play()
play_object.wait_done()  
# Wait until audio has finished playing

在 WAV 格式文件中,存储了代表原始音频数据的位分类,并且还存储了资源交换文件格式的标题和元数据。 该行业的最终记录是存储每一个音频样本,这是一个与气压相关的特定数据点,每秒 44200 个样本,16 位值,用于光盘录制。 为了减小文件的大小,它足以以较低的采样率(例如每秒 8000 个样本)存储少量像人类语音这样的记录。然而,较高的声音频率不能被非常准确地表示。 本文讨论的一些库和模块播放和记录字节对象,其中一些使用 NumPy 数组记录原始音频数据。两者都类似于数据点的分类,可以以确定的采样速率播放音频。 在 NumPy 数组中,每个元素可以包含一个 16 位值,相当于一个单独的样本,对于 bytes 对象,每个样本都存储为两个 8 位值的集合。这两种数据类型的重要区别在于 NumPy 数组是可变的,字节对象是不可变的,这使得后者更适合生成音频和处理更复杂的信号。 用户可以使用 simpleaudio.play_buffer() 语句在 simpleaudio 库中播放 NumPy 数组和字节对象。但是,在此之前,用户应该确保他们已经安装了 NumPy 和 simpleaudio 库。 例如:以产生对应于 410 赫兹音调的数字阵列。

import numpy as numpy
import simpleaudio as simple_audio
frequency = 410  # user's played note will be 410 Hz
fsample = 44200  # 44200 samples per second will be played
second = 5  # Note duration of 5 seconds
# Generate array with second*sample_rate steps, ranging between 0 and seconds
tp = numpy.linspace(0, second, second * fsample, False)
# to generate a 410 Hz sine wave
note = numpy.sin(frequency * tp * 2 * numpy.pi)
# user should Ensure that highest value is in 16-bit range
audio = note * (2**15 - 1) / numpy.max(numpy.abs(note))
# now, Convert to 16-bit data
ado = audio.astype(numpy.int16)
# to Start the playback
play_object = simple_audio.play_buffer(ado, 1, 2, fsample)
# user now Waits for playback to finish before exiting
play_object.wait_done()

8. winsound

winsound 是 Python 中的一个模块,用于访问 Windows 操作系统的基本声音播放机制。 在 winsound 模块中,只需几行代码就可以播放 WAV 文件。 例如:

import winsound
filename = 'example.wav'
winsound.PlaySound(filename, winsound.SND_FILENAME)

winsound 模块不支持除 WAV 文件以外的任何文件格式。它允许用户使用 winsound 发出他们扬声器的嘟嘟声。Beep(frequency, duration) 声明。 例如:

# User can beep a 1010 Hz tone for 110 milliseconds:
import winsound
winsound.Beep(1010, 110)  # Beep at 1010 Hz for 110 milliseconds 

9. python 声音设备

python-sounddevice 是一个用于跨平台音频回放的 Python 模块。该模块为 PortAudio 库提供绑定,并具有一些合适的功能来播放和录制包含音频信号的 NumPy 数组。 如果用户想要播放一个 WAV 文件,他们应该安装 NumPy 和 soundfile,以 NumPy 数组的形式在 WAV 文件中打开一个音频文件格式。 例如:

import sounddevice as sound_device
import soundfile as sound_file
filename = 'example.wav'
# now, Extract the data and sampling rate from file
data_set, fsample = sound_file.read(filename, dtype='float32')  
sound_device.play(data_set, fsample)
# Wait until file is done playing
status = sound_device.wait()  

语句 sound_file.read() 用于提取原始音频数据以及文件的采样率,这些数据存储在资源交换文件格式头中。sound_device.wait() 语句用于确保脚本仅在音频播放完毕后终止。

10. 播放声音

playsound 是一个 Python 模块,用户可以通过它在一行代码中播放声音。这是一个跨平台模块,是一个单一的功能,没有任何依赖播放声音和音频。 例如:

from playsound import playsound
playsound('example.wav')

playsound 模块用于 WAV 文件和 MP3 文件格式的文件,也可以和其他文件格式一起使用。

结论:

在本文中,我们讨论了用于播放和录制不同类型的音频文件和声音的各种类型的 Python 库和模块。在这里,我们已经解释了在开发和修改应用和软件的项目中,每个播放声音的库和模块的不同特性和重要性。