Добавление молчаливого кадра в файл wav с помощью python

Первый раз пишу сюда, посмотрим как пойдет.

Я пытаюсь написать скрипт на питоне, который добавлял бы секунду тишины в начало файла wav, но пока безуспешно.

То, что я пытался сделать, это прочитать заголовок wav, а затем добавить \0 в начало с помощью модуля волны, но это не сработало. Вот код, который основан отсюда http://andrewslotnick.com/posts/audio-delay-with-python.html

import wave
from audioop import add

def input_wave(filename,frames=10000000): #10000000 is an arbitrary large number of frames
    wave_file = wave.open(filename,'rb')
    params=wave_file.getparams()
    audio=wave_file.readframes(frames)
    wave_file.close()

    return params, audio

#output to file so we can use ipython notebook's Audio widget
def output_wave(audio, params, stem, suffix):
    #dynamically format the filename by passing in data
    filename=stem.replace('.wav','_{}.wav'.format(suffix))
    wave_file = wave.open(filename,'wb')
    wave_file.setparams(params)
    wave_file.writeframes(audio)

# delay the audio
def delay(audio_bytes,params,offset_ms):
    """version 1: delay after 'offset_ms' milliseconds"""
    #calculate the number of bytes which corresponds to the offset in milliseconds
    offset= params[0]*offset_ms*int(params[2]/1000)
    #create some silence
    beginning= b'\0'
    #remove space from the end
    end= audio_bytes        
    return add(audio_bytes, beginning+end, params[0])

audio_params, aduio_bytes = input_wave(<audio_file>)
output_wave(delay(aduio_bytes,audio_params,10000), audio_params, <audio_file>, <audio_file_suffics> )

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

Я также новичок в обработке звука, поэтому сейчас я просто пробую что-нибудь и смотрю, что получается.

Любые советы или идеи, как подойти, были бы замечательными :).

Также я использую Python 2.7.5.

Огромное спасибо.


person Madmax    schedule 15.10.2017    source источник


Ответы (1)


Существуют библиотеки, которые могут легко выполнять подобные манипуляции со звуком с наименьшим количеством кода. Одним из таких является pydub.

Вы можете установить pydub, как показано ниже, а подробности о зависимостях находятся здесь
pip install pydub

С помощью pydub можно читать разные аудиоформаты (в данном случае wav), преобразовывать их в аудио-сегмент и затем производить манипуляции или просто воспроизводить его.

Вы также можете создать беззвучный аудио-сегмент заданного периода и добавить два сегмента с помощью оператора «+».

Исходный код

from pydub import AudioSegment
from pydub.playback import play

audio_in_file = "in_sine.wav"
audio_out_file = "out_sine.wav"

# create 1 sec of silence audio segment
one_sec_segment = AudioSegment.silent(duration=1000)  #duration in milliseconds

#read wav file to an audio segment
song = AudioSegment.from_wav(audio_in_file)

#Add above two audio segments    
final_song = one_sec_segment + song

#Either save modified audio
final_song.export(audio_out_file, format="wav")

#Or Play modified audio
play(final_song)
person Anil_M    schedule 17.10.2017
comment
Круто, спасибо, это выглядит намного лучше, чем объединение множества шестнадцатеричных значений вместе и запись только определенного звукового значения. Попробовал и работает как шарм. - person Madmax; 19.10.2017
comment
@Anil_M Удивительно. Что касается последней строки, которая должна воспроизводить аудиофайл, я получил ошибку AttributeError: 'str' object has no attribute 'export' - person YasserKhalil; 24.10.2020