2016-12-30 11 views
3

Мне нужно применить звук к видео в определенное время с определенной продолжительностью, но иногда требуется большая продолжительность звука (или меньше). Как изменить скорость звука без изменения высоты тона? Я попытался изменить fps (путем умножения на деление требуемой продолжительности на длительность звука), но он не работает, как я хочу.Как изменить скорость звука без изменения высоты тона?

original = VideoFileClip("orig.mp4") 
clips = [orig.audio.volumex(0.3)] 
subs = [] #some array 
i = 0 
for sub in subs: 
    clip = AudioFileClip("\\temp{}.mp3") 
    mult = clip.duration/(sub.end - sub.start) + 0.00001 
    clip = AudioArrayClip(clip.to_soundarray(buffersize=500, fps=24000/mult), fps=24000).set_start(sub.start).set_end(sub.end) 
    clips.append(clip) 
    i += 1 

final = CompositeAudioClip(clips) 
final.write_audiofile("final.mp3") 
+0

Вам необходимо изменить высоту звука, так что это звучит нормально, когда воспроизводится на разной скорости. Это будет сделано путем повторной дискретизации звука с более высокой или меньшей скоростью. Простой пример: для игры с двойной скоростью требуется, чтобы шаг был уменьшен вдвое. – martineau

+0

вам нужно использовать алгоритм фазового вокодера, чтобы время растягивало ваш звук, это может быть сложно, математически сложно разработать такой алгоритм – ederwander

ответ

1

Использование волны: Изменение частоты дискретизации

import wave 

CHANNELS = 1 
swidth = 2 
Change_RATE = 2 

spf = wave.open('VOZ.wav', 'rb') 
RATE=spf.getframerate() 
signal = spf.readframes(-1) 

wf = wave.open('changed.wav', 'wb') 
wf.setnchannels(CHANNELS) 
wf.setsampwidth(swidth) 
wf.setframerate(RATE*Change_RATE) 
wf.writeframes(signal) 
wf.close() 
+2

Просто изменить частоту дискретизации не так, это изменит скорость вместе с шагом ... – ederwander