python numpy error "Ошибка типа: объект 'numpy.float64' не может быть интерпретирован как целое число" - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу преобразовать файл .wav в спектрограмму.

Поэтому я использовал этот файл Python.

import glob
import numpy as np
from matplotlib import pyplot as plt
import scipy.io.wavfile as wav
from numpy.lib import stride_tricks

""" short time fourier transform of audio signal """
def stft(sig, frameSize, overlapFac=0.5, window=np.hanning):
    win = window(frameSize)
    hopSize = int(frameSize - np.floor(overlapFac * frameSize))

    # zeros at beginning (thus center of 1st window should be for sample nr. 0)
    samples = np.append(np.zeros(np.floor(frameSize/2.0)), sig)
    # cols for windowing
    cols = np.ceil( (len(samples) - frameSize) / float(hopSize)) + 1
    # zeros at end (thus samples can be fully covered by frames)
    samples = np.append(samples, np.zeros(frameSize))

    frames = stride_tricks.as_strided(samples, shape=(cols, frameSize), strides=(samples.strides[0]*hopSize, samples.strides[0])).copy()
    frames *= win

    return np.fft.rfft(frames)    

""" scale frequency axis logarithmically """    
def logscale_spec(spec, sr=44100, factor=20.):
    timebins, freqbins = np.shape(spec)

    scale = np.linspace(0, 1, freqbins) ** factor
    scale *= (freqbins-1)/max(scale)
    scale = np.unique(np.round(scale))

    # create spectrogram with new freq bins
    newspec = np.complex128(np.zeros([timebins, len(scale)]))
    for i in range(0, len(scale)):
        if i == len(scale)-1:
            newspec[:,i] = np.sum(spec[:,scale[i]:], axis=1)
        else:        
            newspec[:,i] = np.sum(spec[:,scale[i]:scale[i+1]], axis=1)

    # list center freq of bins
    allfreqs = np.abs(np.fft.fftfreq(freqbins*2, 1./sr)[:freqbins+1])
    freqs = []
    for i in range(0, len(scale)):
        if i == len(scale)-1:
            freqs += [np.mean(allfreqs[scale[i]:])]
        else:
            freqs += [np.mean(allfreqs[scale[i]:scale[i+1]])]

    return newspec, freqs

""" plot spectrogram"""
def plotstft(audiopath, binsize=2**10, plotpath=None, colormap="jet"):
    samplerate, samples = wav.read(audiopath)
    s = stft(samples, binsize)

    sshow, freq = logscale_spec(s, factor=1.0, sr=samplerate)
    ims = 20.*np.log10(np.abs(sshow)/10e-6) # amplitude to decibel

    timebins, freqbins = np.shape(ims)

    plt.figure(figsize=(15, 7.5))
    plt.imshow(np.transpose(ims), origin="lower", aspect="auto", cmap=colormap, interpolation="none")
    plt.colorbar()

    plt.xlabel("time (s)")
    plt.ylabel("frequency (hz)")
    plt.xlim([0, timebins-1])
    plt.ylim([0, freqbins])

    xlocs = np.float32(np.linspace(0, timebins-1, 5))
    plt.xticks(xlocs, ["%.02f" % l for l in ((xlocs*len(samples)/timebins)+(0.5*binsize))/samplerate])
    ylocs = np.int16(np.round(np.linspace(0, freqbins-1, 10)))
    plt.yticks(ylocs, ["%.02f" % freq[i] for i in ylocs])

    if plotpath:
        plt.savefig(plotpath, bbox_inches="tight")
    else:
        plt.show()

    plt.clf()


if __name__ == '__main__':
    path='../tf_files/data_audio/'

    folders=glob.glob(path+'*')
    for folder in folders:
        waves = glob.glob(folder+'/' + '*.wav')
        print (waves)
        if len(waves) == 0:
            continue
        for f in waves:
            #try:
            print ("Generating spectrograms..")
            plotstft(f)
            #except Exception as e:
                #print ("Something went wrong while generating spectrogram:")

Однако результат отличался от того, что я ожидал.

['../ tf_files / data_audio / test_wav_files / 22601-8-0-0_2 (том) .wav', '../ tf_files / data_audio / test_wav_files / 22601-8-0-6_2 (том) .wav ',' ../tf_files/data_audio/test_wav_files/518-4-0-0(volume).wav ',' ../tf_files/data_audio/test_wav_files/drill1.wav ',' ../tf_files/data_audio/test_wav_files/chunk0.wav ',' ../tf_files/data_audio/test_wav_files/siren2.wav ',' ../tf_files/data_audio/test_wav_files/bark2.wav ',' ../tf_files/dw_bark3.wav ',' ../tf_files/data_audio/test_wav_files/14111-4-0-0_2(volume).wav ',' ../tf_files/data_audio/test_wav_files/drill2.wav ',' ../tf_files/data_audio / test_wav_files / 22601-8-0-3_2 (том) .wav ',' ../tf_files/data_audio/test_wav_files/siren1.wav ',' ../tf_files/data_audio/test_wav_files/siren3.wav ','../tf_files/data_audio/test_wav_files/518-4-0-3(volume).wav»,'../tf_files/data_audio/test_wav_files/drill3.wav', '../tf_files/data_audio/test_wav_files/4910-3-0-0_2(volume).wav', '../tf_files/data_audio/test_wav_files/344-3-5-0 (том) .wav ',' ../tf_files/data_audio/test_wav_files/bark1.wav ',' ../tf_files/data_audio/test_wav_files/344-3-1-0(volume).wav']

Генерация спектрограмм ..

Трассировка (последний последний вызов):

Файл "z_make_spectrogram.py", строка 95, в файле plotstft (f) "z_make_spectrogram".py ", строка 54, в файле plotstft s = stft (samples, binsize), файл" z_make_spectrogram.py ", строка 13, в файле stft samples = np.append (np.zeros (np.floor (frameSize / 2.0)), sig)

TypeError: объект 'numpy.float64' не может быть интерпретирован как целочисленная ошибка в sys.excepthook:

Traceback (последний вызов был последним): File "/ usr / lib / python3 /dist-packages / apport_python_hook.py ", строка 63, в apport_excepthook из файла apport.fileutils. Вероятный_упакет, файл get_recent_crashes" / usr / lib / python3 / dist-packages / apport / init .py ", строка 5, из файла отчета об импорте apport.report" /usr/lib/python3/dist-packages/apport/report.py ", строка 30, в файле импорта apport.fileutils" / usr / lib/python3/dist-packages/apport/fileutils.py ", строка 23, из файла apport.packaging_impl import impl как упаковка Файл" /usr/lib/python3/dist-packages/apport/packaging_impl.py ", строка 23, вФайл импорта apt "/usr/lib/python3/dist-packages/apt/init.py", строка 23, в импорте apt_pkg

ModuleNotFoundError: Нет модуля с именем 'apt_pkg'

Исходное исключение было: Трассировка (последний последний вызов):

Файл "z_make_spectrogram.py", строка 95, в plotstft (f) Файл "z_make_spectrogram.py", строка 54, в plotstft s= stft (samples, binsize) Файл "z_make_spectrogram.py", строка 13, в stft samples = np.append (np.zeros (np.floor (frameSize / 2.0)), sig)

TypeError: 'numpy.float64 'объект не может быть интерпретирован как целое число

Когда 13-я строка была исправлена ​​с этим синтаксисом, та же ошибка произошла сo.:

samples = np.append(np.zeros(np.floor(int(frameSize/2.0))), sig)

Для справки, в настоящее время я использую tenorflow 1.4.

Поэтому я не уверен, что можно сменить версию numpy на 1.11.

Есть ли способ исправить эту ошибку?

.

.

  • отредактировано

Я исправил 13-ю строку.:

samples = np.append(np.zeros(frameSize//2), sig)

И я получил результат .

По-прежнему возникает та же ошибка, и я не знаю почему.

1 Ответ

0 голосов
/ 03 мая 2019

Обе ваши ошибки происходят от использования numpy.floor или numpy.ceil.Хотя они не документированы должным образом, эти функции возвращают числа с плавающей запятой (даже если входные данные являются целочисленным массивом).
Поскольку вы используете результирующие значения в аргументах, которые требуют целочисленного ввода, сначала вам придется преобразовать их в целое число (простопутем их приведения).

Для первой ошибки вы можете использовать вместо этого целочисленное деление (как предлагается в комментарии):

samples = np.append(np.zeros(frameSize//2), sig)

Для параметра cols, где выположитесь на numpy.ceil, простого ярлыка не существует, и вместо него следует просто использовать

cols = int(np.ceil( (len(samples) - frameSize) / float(hopSize)) + 1)

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...