【问题标题】:Transition between Audiosegment object and a wave file/dataAudiosegment 对象和波形文件/数据之间的转换
【发布时间】:2019-01-20 09:40:32
【问题描述】:

我正在从 mp3 语音文件中提取 MFCC 功能,但我确实希望保持源文件不可更改且不添加任何新文件。我的处理包括以下步骤:

  • 使用pydub加载.mp3文件,消除静音,生成.wav数据
  • 使用scipy.io.wavfile.read()读取音频数据和速率
  • 使用python_speech_features提取特征

但是,eliminate_silence() 返回一个AudioSegment对象,而scipy.io.wavfile.read() 接受一个.wav 文件名,因此我不得不将数据临时保存/导出为波形以确保两者之间的转换。这一步是内存和耗时的,所以我的问题是:如何避免导出波形文件步骤?还是有解决方法?

这是我的代码。

import os
from pydub import AudioSegment
from scipy.io.wavfile import read
from sklearn import preprocessing
from python_speech_features import mfcc
from pydub.silence import split_on_silence

def eliminate_silence(input_path):
    """ Eliminate silent chunks from original call recording """
    # Import input wave file
    sound  = AudioSegment.from_mp3(input_path)
    chunks = split_on_silence(sound,
                              # split on silences longer than 1000ms (1 sec)
                              min_silence_len=500,
                              # anything under -16 dBFS is considered silence
                              silence_thresh=-30,
                              # keep 200 ms of leading/trailing silence
                              keep_silence=100)

    output_chunks = AudioSegment.empty()
    for chunk in chunks: output_chunks += chunk
    return output_chunks


silence_clear_data = eliminate_silence("file.mp3")
silence_clear_data.export("temp.wav", format="wav")
rate, audio = read("temp.wav")
os.remove("temp.wav")

# Extract MFCCs
mfcc_feature = mfcc(audio, rate, winlen = 0.025, winstep = 0.01, numcep = 15,
                    nfilt = 35, nfft = 512, appendEnergy = True)
mfcc_feature = preprocessing.scale(mfcc_feature)

【问题讨论】:

    标签: python scipy scikit-learn mfcc pydub


    【解决方案1】:

    我目前正在做一个项目,我使用静音和 mfcc 系数使用音频剪辑,我离开了我的解决方案:

    import pydub
    import python_speech_features as p
    import numpy as np
    
    def generate_mfcc_without_silences(path):
        #get audio and change frame rate to 16KHz
        audio_file = pydub.AudioSegment.from_wav(path)
        audio_file = audio_file.set_frame_rate(16000)
        #cut audio using silences
        chunks = pydub.silence.split_on_silence(audio_file, silence_thresh=audio_file.dBFS, min_silence_len=200)
        mfccs = []
        for chunk in chunks:
            #compute mfcc from chunk array
            np_chunk = np.frombuffer(chunk.get_array_of_samples(), dtype=np.int16)
            mfccs.append(p.mfcc(np_chunk, samplerate=audio_file.frame_rate, numcep=26))
        return mfccs
    

    注意事项:

    ·我把音频改成 16KHz 但这是可选的

    ·我将 min_silence_len 的值设为 200,因为我想尝试获取单个单词

    使用我的功能内容和您的要求,您需要的功能可能是:

    import pydub
    import python_speech_features as p
    import numpy as np
    from sklearn import preprocessing
    
    def mfcc_from_audio_without_silences(path):
        audio_file  = pydub.AudioSegment.from_mp3(input_path)
        chunks = pydub.silence.split_on_silence(audio_file, silence_thresh=-30, min_silence_len=500, keep_silence=100)
    
        output_chunks = pydub.AudioSegment.empty()
        for chunk in chunks:
            output_chunks += chunk
    
        output_chunks = np.frombuffer(output_chunks.get_array_of_samples(), dtype=np.int16)
        mfcc_feature = p.mfcc(output_chunks, samplerate=audio_file.frame_rate, numcep=15, nfilt = 35)
        return preprocessing.scale(mfcc_feature)
    

    【讨论】:

    • np.frombuffer(output_chunks.get_array_of_samples(), dtype=np.int16) 这部分特别解决了我的转换问题。谢谢!
    【解决方案2】:

    看起来AudioSegment.get_array_of_samples() 是您所需要的。 (在将它传递给 mfcc 之前,您可能需要从该数组构造一个 numpy 数组。)

    【讨论】:

    • 感谢您的回答,很有帮助。因此,我更改了eliminate_silence() 并使其返回以下return np.array(output_chunks.get_array_of_samples()),并将输出直接传递给mfcc()。这可以正常工作,但令人惊讶的是代码速度较慢。你有什么想法,为什么会这样?是否可以加速?
    • 我不知道为什么它会变慢。据推测,从一种数组类型转换为另一种数组类型时效率低下。也许在构造 np.array 时指定数据类型会加快速度。您是否尝试将原始 array.array 传递给 mfcc()?也许它可以直接处理那种格式。
    • 我认为您是对的,但我不知道是什么低效率导致了延迟。指定数据类型并没有显着差异,将数组直接传递给mfcc() 导致TypeError: can't multiply sequence by non-int of type 'float'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2012-11-17
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多