Как получить rms из аудиофайла wav с помощью python?

Как я могу использовать ширину 2, чтобы получить результат без ошибок?

Ширина равна 2, но я получу ошибку.

Если я изменю его на 1, я могу получить результат из кода, но он неверен.

import wave
import contextlib
import audioop

fname = "some.wav"

with contextlib.closing(wave.open(fname,'r')) as f:

    frames = f.getnframes()
    rate = f.getframerate()
    duration = frames / float(rate)
    width = f.getsampwidth()
    channel = f.getnchannels()
    size = width*channel
    # f.rewind()
    wav = f.readframes(f.getnframes())
    # print(duration)

print(audioop.rms(str(wav).encode("ascii"),2))

"audiop.error: не целое число кадров"


person Jennifer    schedule 19.07.2019    source источник


Ответы (2)


Я не использую Python, поэтому дайте мне знать, если один из этих возможных вариантов исправит это...

Опция 1:

Согласно документам Audiooop:

"Он работает со звуковыми фрагментами, состоящими из выборок целых чисел со знаком шириной 8, 16 или 32 бита."

Рассмотрим следующее:

  • f.getsampwidth() указывает ширину в байтах, поэтому у вас есть 2 байта.

  • 1 байт содержит 8 бит, поэтому 2 байта будут иметь ширину 16 бит.

Попробуйте как:

print(audioop.rms(str(wav).encode("ascii"),16))

Вариант 2:

"Если я изменю его на 1, я смогу получить результат из кода, но он неверен."

Возможно, исходная строка: print(audioop.rms(str(wav).encode("ascii"),2)) верна, и реальная проблема заключается в том, чтобы not enough bytes разделить на 2 (ширины).

Убедитесь, что аудиоформат WAV'а действительно 16-битный и/или стерео.

person VC.One    schedule 23.07.2019

Может быть, немного поздно, но я нашел ответ на другой вопрос: audiop.rms() - чем он отличается от обычного RMS?

Возможно, попробуйте использовать:

audioop.rms(wav, 2)

Где 2 представляет количество байтов (в данном случае int16)

person khi48    schedule 17.04.2020