Как проанализировать объем, высоту и скорость файла .wav в Java? - PullRequest
0 голосов
/ 26 декабря 2011

Итак, я пытаюсь переделать Vib Ribbon: http://www.youtube.com/watch?v=ehdymXc0epY На вход будет файл .wav, и я не имею ни малейшего представления о том, как его проанализировать и создать пороговые значения для объема и высоты тона,создаст разные препятствия - мне указывают на преобразования Фурье, которые я не понимаю.Может кто-нибудь указать мне на класс анализа формы волны, который будет работать в этой ситуации и дать мне представление о том, как начать?Я не смог достать исходный код для таких вещей, как AudioSurf и музыкальные визуализаторы.

Почему вы спросите java?Я беру вводный класс Java, поэтому никакой другой язык не будет работать.

Ответы [ 2 ]

1 голос
/ 27 июля 2012

Вы можете написать скрипт Praat (Praat доступен для загрузки здесь ), чтобы создать выходной файл, содержащий необходимую информацию, и затем прочитать этот текстовый файл с помощью Java-программы.

Вероятно, есть и внешние библиотеки, такие как @Gareth.

0 голосов
/ 23 января 2013

В итоге я использовал Sound Viewer Tool для этого, хотя и на другом языке (Python) и для другого проекта класса. Если в svt.py:

добавлено следующее
def processWav(filename, channel):
    """
    filename: path to a wav file
    Channel: 1 for left, 2 for right
    Returns centroids, frequencies, volumes
    """
    #open file
    audio_file = audiolab.sndfile(filename, 'read')
    #should be length of audiofile in seconds * 60. will fix this later
    import contextlib
    import wave
    with contextlib.closing(wave.open(filename, 'r')) as f:
        frames = f.getnframes()
        rate = f.getframerate()
        duration = frames / float(rate)
    duration *= 30 #30 data points for every second of audio yay
    duration = int(duration) #can only return an integer number of frames so yeah
    #print duration
    #Not really samples per pixel but I'll let that slide
    samples_per_pixel = audio_file.get_nframes() / float(duration)
    #some rule says this frequency has to be half of the sample rate
    nyquist_freq = (audio_file.get_samplerate() / 2) + 0.0
    #fft_size stays 4096
    processor = AudioProcessor(audio_file, 2048, channel, numpy.hanning)

    centroids = []
    frequencies = []
    volumes = []

    for x in range(duration):
        seek_point = int(x * samples_per_pixel)
        next_seek_point = int((x + 1) * samples_per_pixel)
        (spectral_centroid, db_spectrum) = processor.spectral_centroid(seek_point)
        peaks = processor.peaks(seek_point, next_seek_point)      
        centroids.append(spectral_centroid)
        frequencies.append(db_spectrum)
        volumes.append(peaks)

    #print "Centroids:" + str(centroids)
    #print "Frequencies:" + str(frequencies)
    #print "Volumes:" + str(volumes)

    #convert volumes[] from peaks to actual volumes
    for i in range(len(volumes)):
        volumes[i] = abs(volumes[i][0]) + abs(volumes[i][1])
    #round frequencies to save resources
    for i in range(len(frequencies)):
        for j in range(len(frequencies[i])):
            frequencies[i][j] = round(frequencies[i][j], 4)
    return centroids, frequencies, volumes

анализ может быть легко сделан с помощью файлов WAV. Центроиды представляют тембр музыки - средневзвешенное значение частот, они указывают общую яркость в любой момент времени.

Первый ответ здесь мне очень помог в понимании БПФ / обработки сигналов / представления цифрового звука.

...