文章目錄
- ChatGPT實戰100例 - (17) 用ChatGPT實現音頻長度測量和音量調整
- 獲取音頻長度
- pydub獲取音頻長度
- 獲取時長
- 精確到秒
- 格式設定
- mutagen獲取音頻長度
- 調整音量
- 視頻音量調整
- 注意事項
ChatGPT實戰100例 - (17) 用ChatGPT實現音頻長度測量和音量調整
老王媳婦說上次那個pip挺好用的,就是長度這個有點迷茫,
那就測下吧
獲取音頻長度
使用 pydub 和 mutagen 庫都可以獲取MP3文件的長度。
pydub獲取音頻長度
獲取時長
from pydub.utils import mediainfodef get_duration(filename):info = mediainfo(filename)duration = info['duration']return durationfilename = 'yourfile.mp3'
print(get_duration(filename))
精確到秒
from pydub.utils import mediainfodef get_duration(filename):info = mediainfo(filename)duration = round(float(info['duration']))return durationfilename = 'yourfile.mp3'
print(get_duration(filename))
格式設定
如果你需要將獲取的時長轉換為 “03:03” 這樣的格式, 可以首先將時長轉換為整數(秒數), 然后通過除法和取余運算獲取分鐘和秒, 然后將這些值格式化為字符串。這是一個示例:
def get_duration(filename):info = mediainfo(filename)duration = int(float(info['duration'])) # change to intminutes, seconds = divmod(duration, 60) # get minutes and secondsreturn "{:02d}:{:02d}".format(minutes, seconds) # format as stringfilename = 'yourfile.mp3'
print(get_duration(filename))
這個函數將返回一個字符串,比如 “03:03”。
mutagen獲取音頻長度
如果你想使用的是mutagen庫,可以這樣做:
from mutagen.mp3 import MP3def get_duration(filename):audio = MP3(filename)duration = audio.info.lengthreturn durationfilename = 'yourfile.mp3'
print(get_duration(filename))
同樣,如果需要精確到秒級+格式化如上pydub的處理操作即可
調整音量
老王媳婦說這小視頻挺好的,就是聲音有點大,
安排!
使用pydub直接調整mp3音量
以下是一個可以用于調整mp3音量的函數,使用pydub庫:
from pydub import AudioSegmentdef adjust_audio_db(input_file, output_file, db):song = AudioSegment.from_mp3(input_file)adjusted_song = song + dbadjusted_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 randomdef 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_changeadjusted_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