利用librosa提供的支持来计算音高和声强
时间: 2024-05-10 07:17:12 浏览: 21
可以使用librosa库中的pitch和amplitude函数来计算音高和声强。下面是一个示例代码:
```python
import librosa
# 读取音频文件
audio_file = 'example.wav'
y, sr = librosa.load(audio_file, sr=None)
# 计算音高
pitch, _ = librosa.core.piptrack(y=y, sr=sr)
pitch_frequency = librosa.core.pitch_frequencies(pitch, sr=sr)
# 计算声强
amplitude = librosa.amplitude_to_db(librosa.stft(y), ref=np.max)
print('音高:', pitch_frequency)
print('声强:', amplitude)
```
其中,y是音频信号,sr是采样率。使用piptrack函数计算音高,pitch_frequency是音高的频率。使用amplitude函数计算声强,amplitude是声强的值。注意,amplitude_to_db函数将振幅转换为分贝单位。
相关问题
python中librosa库计算音高和音强
在Python中,可以使用librosa库来计算音高和音强。下面是一个简单的示例代码,可以用来计算音频文件中的基频和能量:
```python
import librosa
# 读取音频文件
y, sr = librosa.load('audio_file.wav')
# 计算基频
f0, voiced_flag, voiced_probs = librosa.pyin(y, fmin=librosa.note_to_hz('C2'), fmax=librosa.note_to_hz('C7'))
# 计算能量
energy = librosa.feature.rms(y=y)
# 打印结果
print('基频:', f0)
print('能量:', energy)
```
在这个代码中,我们使用了librosa库中的`load()`函数来读取音频文件,并将其存储在`y`数组中。`pyin()`函数可以用来计算基频,它返回一个包含基频值的数组。我们还可以使用`note_to_hz()`函数将音符转换为频率。
要计算能量,我们可以使用`feature.rms()`函数。它返回一个包含能量值的数组。
注意,这只是一个简单的示例代码,实际上librosa库提供了更多的功能来计算音高和音强。你可以查看librosa官方文档来了解更多信息。
利用librosa库以及Python多进程实现对多个音频的并行特征计算: 1. 主进程读取声音数据目录,得到所有声音文件的列表; 2. 直接使用Process类构建子进程,利用libraso提供的支持来计算音高和声强,并保存计算结果到文件(一个声音一个文件 )。 3. 通过继承Process类来构建子进程,同样利用libraso提供的支持来计算音高和声强,并保存计算结果到文件(一个声音一个文件 )。 4. 在主进程中启动利用2,3中构建的子进程,并分发(如通过队列)参数(声音文件名)。
以下是实现这个任务的代码示例:
```python
import os
import librosa
from multiprocessing import Process, Queue
# 定义子进程函数,计算音高和声强
def process_audio(filename, q):
y, sr = librosa.load(filename)
pitch = librosa.yin(y)
rms = librosa.feature.rms(y)
output_filename = os.path.splitext(filename)[0] + '.txt'
with open(output_filename, 'w') as f:
f.write(f'Pitch: {pitch}\nRMS: {rms}')
q.put(output_filename)
# 主进程读取声音数据目录,得到所有声音文件的列表
audio_dir = 'path/to/audio/dir'
audio_files = [os.path.join(audio_dir, f) for f in os.listdir(audio_dir) if f.endswith('.wav')]
# 直接使用Process类构建子进程,利用librosa提供的支持来计算音高和声强
output_files_1 = []
for audio_file in audio_files:
p = Process(target=process_audio, args=(audio_file,))
p.start()
p.join()
output_file = os.path.splitext(audio_file)[0] + '.txt'
output_files_1.append(output_file)
# 通过继承Process类来构建子进程,同样利用librosa提供的支持来计算音高和声强
class AudioProcessor(Process):
def __init__(self, filename, q):
super(AudioProcessor, self).__init__()
self.filename = filename
self.q = q
def run(self):
y, sr = librosa.load(self.filename)
pitch = librosa.yin(y)
rms = librosa.feature.rms(y)
output_filename = os.path.splitext(self.filename)[0] + '.txt'
with open(output_filename, 'w') as f:
f.write(f'Pitch: {pitch}\nRMS: {rms}')
self.q.put(output_filename)
output_files_2 = []
q = Queue()
processes = [AudioProcessor(audio_file, q) for audio_file in audio_files]
for p in processes:
p.start()
for p in processes:
p.join()
while not q.empty():
output_files_2.append(q.get())
# 在主进程中启动利用2,3中构建的子进程,并分发参数(声音文件名)
output_files_3 = []
q = Queue()
for audio_file in audio_files:
p = Process(target=process_audio, args=(audio_file, q))
p.start()
output_file = q.get()
output_files_3.append(output_file)
p.join()
```
这个代码示例中,我们首先定义了一个`process_audio`函数,它用于计算音高和声强,并将结果保存到文件中。然后,我们使用两种不同的方法来构建子进程,一种是直接使用`Process`类,另一种是通过继承`Process`类来构建子类。对于第一种方法,我们在循环中启动一个子进程来处理一个声音文件,等待该子进程执行完毕后,我们就可以得到对应的计算结果文件。对于第二种方法,我们首先创建`AudioProcessor`类,该类继承自`Process`类,并重写了`run`方法。然后,我们在循环中创建一个`AudioProcessor`对象,然后启动该子进程,并等待所有子进程执行完毕后,我们从队列中获取所有计算结果文件的路径。最后,我们在主进程中启动利用2,3中构建的子进程,并分发参数(声音文件名),并等待所有子进程执行完毕后,我们就可以得到所有计算结果文件的路径。