How to change audio frequency?
Solution 1
With ffmpeg:
ffmpeg -i <input> -af 'asetrate=44100*1/2,atempo=2/1' <output>
Here, 1/2 is the pitch factor. See the other answer for more details.
If you need a GUI, use Audacity, it's a free, open source, cross platform audio editing tool.
Features: Change the pitch without altering the tempo, or vice-versa.
As an alternative, try sox. Something like that:
sox <infile> <outfile> pitch <shift>
where gives the pitch shift as positive or negative ‘cents’ (i.e. 100ths of a semitone). There are 12 semitones to an octave, so that would mean ±1200
as a parameter.
Solution 2
Find input audio rate beforehand thus:
ffmpeg -i input.mp4
Assuming input audio rate 44,100 Hz, this command will do the job:
ffmpeg -i input.mp4 -af asetrate=44100*3/4,atempo=4/3 output.mp4
The factor of 3/4 will change most female and “skinny” (chipmunk) voices into male and “fat” voices. Use 4/3 for the opposite:
ffmpeg -i input.mp4 -af atempo=3/4,asetrate=44100*4/3 output.mp4
Notice reversed filter order to prevent signal degradation. Whenever possible, lossless operation should come before lossy operation. I’m not 100% sure whether I’m not making some mistake here from misunderstanding FFmpeg filters.
FFmpeg filter asetrate
should have a variable named ir
for input audio rate, in analogy to iw
×ih
in some video filters, but I couldn’t find any mention of it in the documentation.
For factors greater than 2 (such as 4/1 or 1/4), you must use multiple atempo
filters (1/4 = 1/2 * 1/2 or 4/1 = 2/1 * 2/1):
ffmpeg -i input.mp4 -af asetrate=44100*4,atempo=1/2,atempo=1/2 output.mp4
I don’t know how to obtain “skinny” male voice and “fat” female voice.
Instead of -af
, you can write -filter:audio
or -filter:a
.
References
- https://www.ffmpeg.org/ffmpeg-filters.html#atempo
- https://www.ffmpeg.org/ffmpeg-filters.html#asetrate
Related videos on Youtube
Lord Tesla
Updated on September 18, 2022Comments
-
Lord Tesla over 1 year
I want to change the frequency of an audio file. Meaning: the whole file should sound (say) one octave higher or lower. How to do it? Using
ffmpeg
or other command line open source tool would be preferable. -
Lord Tesla almost 13 yearsawesome... sox is just what i need!
-
mrgloom almost 5 yearsDoes method using ffmpeg change the duration of the audio?
-
slhck almost 5 years@mrgloom No, it should not.
-
mrgloom almost 5 yearsAfter using
ffmpeg -i man.wav -af asetrate=48000*0.75,aresample=48000 man_pitch_down.wav
I see byffmpeg -i
original wavDuration: 00:00:01.95, bitrate: 3080 kb/s
and modified wavDuration: 00:00:02.60, bitrate: 1536 kb/s
. As I understandDuration
is length in seconds. -
mrgloom almost 5 yearsI have tried this solution (superuser.com/a/1076762/213959) and it produce audios with same length (looking at
Duration
fromffmpeg -i
output) -
F. Vosnim almost 4 years@slhck you are wrong. As mrgloom said your ffmpeg line also changes duration af the audio.
-
F. Vosnim almost 4 years@slhck It's 100% your example:
ffmpeg -i <input> -af asetrate=44100*0.5,aresample=44100 <output>
whereasetrate
changes sample rate to 22050 AND increases the duration by 2. Thenaresample
upsamples it to 44100 keeping increased duration the same. The asetrate documentation clearly saysThis will result in a change of speed and pitch.
-
slhck almost 4 years@F.Vosnim You're right. This must have changed (note that my answer was posted in 2011) in the meantime. Fixed the post.
-
Xel Naga almost 3 yearsDoesn't work...
-
JRichardsz almost 3 yearsthank you so much!! worked at first attempt!!
-
parsecer about 2 yearsIs speed changed as well? The speed of speech? Is there a way to increase voice pitch without increasing speech speed?