как конвертировать WAV-файл для плавающей амплитуды - PullRequest
7 голосов
/ 14 октября 2011

поэтому я спросил все в заголовке:

У меня есть файл WAV (записанный PyAudio из входного аудио), и я хочу преобразовать его в данные с плавающей запятой, соответствующие уровню звука (амплитуде)некоторые преобразования Фурье и т. д. *

У кого-нибудь есть идея преобразовать данные WAV в плавающее число?

Ответы [ 4 ]

10 голосов
/ 01 мая 2015

Я определил два достойных способа сделать это.

Метод 1: использование модуля волнового файла

Используйте этот метод, если вы не возражаете установить некоторые дополнительные библиотеки, в которых было немного возни на моем Mac, но это было легко на моем сервере Ubuntu.

https://github.com/vokimon/python-wavefile

import wavefile

# returns the contents of the wav file as a double precision float array
def wav_to_floats(filename = 'file1.wav'):
    w = wavefile.load(filename)
    return w[1][0]

signal = wav_to_floats(sys.argv[1])
print "read "+str(len(signal))+" frames"
print  "in the range "+str(min(signal))+" to "+str(min(signal))

Способ 2: использование волнового модуля

Используйте этот метод, если вы хотите меньше проблем с установкой модуля.

Считывает файл wav из файловой системы и преобразует его в числа с плавающей запятой в диапазоне от -1 до 1. Он работает с 16-битными файлами и, если они> 1 канал, будет чередовать сэмплы так же, как они находятся в файл. Для других битовых глубин измените 'h' в аргументе на struct.unpack в соответствии с таблицей внизу этой страницы:

https://docs.python.org/2/library/struct.html

Он не будет работать для 24-битных файлов, так как нет типа данных, который является 24-битным, поэтому нет способа сообщить struct.unpack, что делать.

import wave
import struct
import sys

def wav_to_floats(wave_file):
    w = wave.open(wave_file)
    astr = w.readframes(w.getnframes())
    # convert binary chunks to short 
    a = struct.unpack("%ih" % (w.getnframes()* w.getnchannels()), astr)
    a = [float(val) / pow(2, 15) for val in a]
    return a

# read the wav file specified as first command line arg
signal = wav_to_floats(sys.argv[1])
print "read "+str(len(signal))+" frames"
print  "in the range "+str(min(signal))+" to "+str(min(signal))
5 голосов
/ 14 октября 2011

Большинство волновых файлов представлены в 16-битном целочисленном формате PCM.

Что вы захотите:

  • Разобрать заголовок, чтобы узнать, какой это формат (проверьте ссылку из Xophmeister)
  • Считать данные, взять целочисленные значения и преобразовать их в число с плавающей точкой

Целочисленные значения находятся в диапазоне от -32768 до 32767, и вам необходимо преобразовать их в значения от -1,0 до 1,0 с плавающей запятой.

У меня нет кода на python, однако в C ++ приведен фрагмент кода, если данные PCM имеют 16-разрядное целое число, и преобразуют его в число с плавающей точкой (32-разрядное):

short* pBuffer = (short*)pReadBuffer;

const float ONEOVERSHORTMAX = 3.0517578125e-5f; // 1/32768 
unsigned int uFrameRead = dwRead / m_fmt.Format.nBlockAlign;

for ( unsigned int i = 0; i < uFrameCount * m_fmt.Format.nChannels; ++i )
{
    short i16In = pBuffer[i];
    out_pBuffer[i] = (float)i16In * ONEOVERSHORTMAX;
}

Будьте осторожны со стереофайлами, так как данные стерео PCM в волновых файлах чередуются, то есть данные выглядят как LRLRLRLRLRLRLRLR (вместо LLLLLLLLRRRRRRRR). Вам может потребоваться или не потребоваться удаление чередования в зависимости от того, что вы делаете с данными.

5 голосов
/ 15 марта 2012

Я часами пытался найти ответ на этот вопрос.Решение оказывается очень простым: struct.unpack - это то, что вы ищете.Окончательный код будет выглядеть примерно так:

rawdata=stream.read()                  # The raw PCM data in need of conversion
from struct import unpack              # Import unpack -- this is what does the conversion
npts=len(rawdata)                      # Number of data points to be converted
formatstr='%ih' % npts                 # The format to convert the data; use '%iB' for unsigned PCM
int_data=unpack(formatstr,rawdata)     # Convert from raw PCM to integer tuple

Большая часть кредита идет на Интерпретация данных WAV .Единственная хитрость - получить правильный формат для распаковки: это должно быть правильное количество байтов и правильный формат (со знаком или без знака).

0 голосов
/ 14 октября 2011

Формат Microsoft WAVE довольно хорошо документирован.См. Например, https://ccrma.stanford.edu/courses/422/projects/WaveFormat/.Написание парсера файлов для открытия и интерпретации данных для получения необходимой информации не займет много времени. Тем не менее, это почти наверняка было сделано раньше, так что я уверен, что кто-то даст «более легкий» ответ;)

...