Создать миниатюру для произвольного аудиофайла - PullRequest
6 голосов
/ 08 февраля 2012

Я хочу представить аудиофайл в изображении с максимальным размером 180 × 180 пикселей.

Я хочу сгенерировать это изображение, чтобы оно каким-то образом представляло аудиофайл, представьте его как форму волны (график амплитуды) SoundCloud ?

Screenshot of Soundcloud's player

Интересно, есть ли у кого-нибудь из вас что-нибудь для этого. Я немного искал, в основном «аудио визуализация» и «миниатюра аудио», но я не нашел ничего полезного.

Я впервые опубликовал это на ux.stackexchange.com , это моя попытка связаться с любыми программистами, работающими над этим.

Ответы [ 3 ]

3 голосов
/ 09 декабря 2012

Вы также можете разбить звук на куски и измерить среднеквадратичное значение (показатель громкости).допустим, вам нужно изображение шириной 180 пикселей.

Я буду использовать pydub , облегченную оболочку, которую я написал в режиме std lib wave:

from pydub import AudioSegment

# first I'll open the audio file
sound = AudioSegment.from_mp3("some_song.mp3")

# break the sound 180 even chunks (or however
# many pixels wide the image should be)
chunk_length = len(sound) / 180

loudness_of_chunks = []
for i in range(180):
    start = i * chunk_length
    end = chunk_start + chunk_length

    chunk = sound[start:end]
    loudness_of_chunks.append(chunk.rms)

цикл for можно представить как следующее понимание списка, я просто хотел, чтобы это было понятно:

loudness_of_chunks = [
    sound[ i*chunk_length : (i+1)*chunk_length ].rms
    for i in range(180)]

Теперь единственное, что остается сделать, - это уменьшить среднеквадратичное значение до 0 -Масштаб 180 (поскольку вы хотите, чтобы изображение было высотой 180 пикселей)

max_rms = max(loudness_of_chunks)

scaled_loudness = [ (loudness / max_rms) * 180 for loudness in loudness_of_chunks]

Я оставлю вам рисунок фактических пикселей, я не очень разбираюсь в PIL или ImageMagik: /

2 голосов
/ 09 февраля 2012

Посмотрите на этот пост в блоге о wav2png.py .

1 голос
/ 08 октября 2015

Основано на ответе Джиаро (спасибо за написание pydub!) И построено для web2py вот мои два цента:

def generate_waveform():
    img_width = 1170
    img_height = 140
    line_color = 180
    filename = os.path.join(request.folder,'static','sounds','adg3.mp3')


    # first I'll open the audio file
    sound = pydub.AudioSegment.from_mp3(filename)

    # break the sound 180 even chunks (or however
    # many pixels wide the image should be)
    chunk_length = len(sound) / img_width

    loudness_of_chunks = [
        sound[ i*chunk_length : (i+1)*chunk_length ].rms
        for i in range(img_width)
    ]
    max_rms = float(max(loudness_of_chunks))
    scaled_loudness = [ round(loudness * img_height/ max_rms)  for loudness in loudness_of_chunks]

    # now convert the scaled_loudness to an image
    im = Image.new('L',(img_width, img_height),color=255)
    draw = ImageDraw.Draw(im)
    for x,rms in enumerate(scaled_loudness):
        y0 = img_height - rms
        y1 = img_height
        draw.line((x,y0,x,y1), fill=line_color, width=1)
    buffer = cStringIO.StringIO()
    del draw
    im = im.filter(ImageFilter.SMOOTH).filter(ImageFilter.DETAIL)
    im.save(buffer,'PNG')
    buffer.seek(0)
    return response.stream(buffer, filename=filename+'.png')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...