文章目录
- ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整
- 获取音频长度
- pydub获取音频长度
- 获取时长
- 精确到秒
- 格式设定
- mutagen获取音频长度
- 调整音量
- 视频音量调整
- 注意事项
ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整
老王媳妇说上次那个pip挺好用的,就是长度这个有点迷茫,
那就测下吧
获取音频长度
使用 pydub 和 mutagen 库都可以获取MP3文件的长度。
pydub获取音频长度
获取时长
from pydub.utils import mediainfo
def get_duration(filename):
info = mediainfo(filename)
duration = info['duration']
return duration
filename = 'yourfile.mp3'
print(get_duration(filename))
精确到秒
from pydub.utils import mediainfo
def get_duration(filename):
info = mediainfo(filename)
duration = round(float(info['duration']))
return duration
filename = 'yourfile.mp3'
print(get_duration(filename))
格式设定
如果你需要将获取的时长转换为 “03:03” 这样的格式, 可以首先将时长转换为整数(秒数), 然后通过除法和取余运算获取分钟和秒, 然后将这些值格式化为字符串。这是一个示例:
def get_duration(filename):
info = mediainfo(filename)
duration = int(float(info['duration'])) # change to int
minutes, seconds = divmod(duration, 60) # get minutes and seconds
return "{:02d}:{:02d}".format(minutes, seconds) # format as string
filename = 'yourfile.mp3'
print(get_duration(filename))
这个函数将返回一个字符串,比如 “03:03”。
mutagen获取音频长度
如果你想使用的是mutagen库,可以这样做:
from mutagen.mp3 import MP3
def get_duration(filename):
audio = MP3(filename)
duration = audio.info.length
return duration
filename = 'yourfile.mp3'
print(get_duration(filename))
同样,如果需要精确到秒级+格式化如上pydub的处理操作即可
调整音量
老王媳妇说这小视频挺好的,就是声音有点大,
安排!
使用pydub直接调整mp3音量
以下是一个可以用于调整mp3音量的函数,使用pydub库:
from pydub import AudioSegment
def adjust_audio_db(input_file, output_file, db):
song = AudioSegment.from_mp3(input_file)
adjusted_song = song + db
adjusted_song.export(output_file, format="mp3")
# 使用函数:
adjust_audio_db('input.mp3', 'output.mp3', -10)
在这个函数中,input_file
和output_file
是输入和输出音频文件的路径,db
是想要增加或减少的分贝数。首先,函数加载输入文件,然后调整音量,最后导出修改后的音频到output_file
。注意db
可以是负数,如果你想降低音量。
请确保已经正确安装了pydub和ffmpeg,因为pydub需要ffmpeg进行音频编解码。
设定音量为随机值
如果你想让音量设定为一个随机值,你可以通过引入Python的random
库来实现这一点。这里是如何修改上面的函数,以便音量增减设置为一个随机值:
from pydub import AudioSegment
import random
def adjust_audio_random_db(input_file, output_file, min_db, max_db):
song = AudioSegment.from_mp3(input_file)
# 生成一个介于min_db和max_db之间的随机分贝值
db_change = random.randint(min_db, max_db)
adjusted_song = song + db_change
adjusted_song.export(output_file, format="mp3")
# 使用函数:
adjust_audio_random_db('input.mp3', 'output.mp3', -5, 5)
在这个修改版函数中,min_db
和max_db
定义了可能的分贝变化范围。random.randint(min_db, max_db)
会生成一个在这个范围内的随机整数,这个值可以是正的(增加音量)或负的(减少音量)。然后,这个随机生成的分贝值被用来调整音频的音量。
记住,使用随机分贝变化时要谨慎选择min_db
和max_db
的值,以确保音量的变化在可接受的范围内,不会对听者造成不适。
老王媳妇:你搞错了
我:对对,先试试水么,马上安排
视频音量调整
调整原视频中的音频信号db,随机到-30到-20之间
你可以使用moviepy库中的AudioClip的fx
函数来改变音频信号的db。volumex
函数可以用于改变音频的音量,参数是音量的倍数,比如0.5表示降低一半的音量。
volumex
函数的参数是一个对数尺度,所以如果你想把db调整到-30到-20之间,你需要把这个范围转换成线性尺度。对数尺度和线性尺度的转换公式是 value_in_linear_scale = 10^(value_in_db_scale/20)
。
这个转换是因为人耳对声音的感知是对数的。例如,如果一个声音的音量是另一个的两倍,我们感觉到的并不是两倍的响,而是稍微大一点。因此,在对数尺度上,增加10db大约意味着将音量加倍。
以下是一个如何用moviepy调整音频db的示例:
from moviepy.editor import VideoFileClip
import numpy as np
# 打开视频
clip = VideoFileClip('video.mp4')
# 生成-30到-20之间的随机数
db = np.random.uniform(-30, -20)
# 转换到线性尺度
linear = 10 ** (db / 20)
# 调整音频
clip = clip.fx(vfx.volumex, linear)
# 输出到文件
clip.write_videofile('output.mp4')
这段代码首先打开输入视频,然后生成-30到-20之间的随机db值,并把这个值转换成线性尺度。然后用vfx.volumex
函数调整音频的音量。最后将视频输出到文件。
提取函数
你可以使用moviepy库中的AudioClip的fx
函数来改变音频信号的db。volumex
函数可以用于改变音频的音量,参数是音量的倍数,比如0.5表示降低一半的音量。
volumex
函数的参数是一个对数尺度,所以如果你想把db调整到-30到-20之间,你需要把这个范围转换成线性尺度。对数尺度和线性尺度的转换公式是 value_in_linear_scale = 10^(value_in_db_scale/20)
。
这个转换是因为人耳对声音的感知是对数的。例如,如果一个声音的音量是另一个的两倍,我们感觉到的并不是两倍的响,而是稍微大一点。因此,在对数尺度上,增加10db大约意味着将音量加倍。
以下是一个如何用moviepy调整音频db的示例:
from moviepy.editor import VideoFileClip
import numpy as np
# 打开视频
clip = VideoFileClip('video.mp4')
# 生成-30到-20之间的随机数
db = np.random.uniform(-30, -20)
# 转换到线性尺度
linear = 10 ** (db / 20)
# 调整音频
clip = clip.fx(vfx.volumex, linear)
# 输出到文件
clip.write_videofile('output.mp4')
这段代码首先打开输入视频,然后生成-30到-20之间的随机db值,并把这个值转换成线性尺度。然后用vfx.volumex
函数调整音频的音量。最后将视频输出到文件。
注意事项
长度也测了,声音也小了,老王媳妇终于学会丝滑混剪短视频了。
继续pip
pip install pydub mutagen moviepy