├── 开始.bat ├── output.aac ├── .gitignore └── app.py /开始.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | py310\python.exe app.py 4 | pause -------------------------------------------------------------------------------- /output.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v3ucn/Fix-Loudness/HEAD/output.aac -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.wav 2 | *.mp3 3 | .chroma 4 | .DS_Store 5 | .eslintrc.js 6 | .idea 7 | .venv 8 | venv 9 | .envrc 10 | .direnv 11 | .vs 12 | .vscode 13 | *.bak 14 | *.ipynb 15 | *.log 16 | *pycache* 17 | cert.pem 18 | key.pem 19 | package.json 20 | package-lock.json 21 | Thumbs.db 22 | wandb 23 | *.pt 24 | *.pth 25 | /py310 26 | 27 | # ignore user docker config and top level links to docker files 28 | /docker-compose.yaml 29 | /docker-compose.yml 30 | /Dockerfile 31 | .env 32 | 33 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | 2 | import gradio as gr 3 | import os,io 4 | 5 | import soundfile as sf 6 | import pyloudnorm as pyln 7 | 8 | 9 | import subprocess 10 | import json 11 | 12 | 13 | 14 | 15 | def normalize_video_volume(video_file,loud): 16 | # 分析视频的平均音量 17 | # avg_volume = analyze_video_volume(video_file) 18 | 19 | # print(avg_volume) 20 | 21 | avg_volume = float(loud) 22 | 23 | # 使用EBU R128标准校正音频 24 | cmd = ['ffmpeg','-y','-i', video_file, '-af', f'loudnorm=I={avg_volume}:TP=-2:LRA=11','-c:v', 'copy', '-c:a', 'aac', "./output.aac"] 25 | 26 | subprocess.call(cmd) 27 | 28 | return "./output.aac" 29 | 30 | 31 | def reference(input,top,loud): 32 | 33 | # 加载音频文件 34 | data, rate = sf.read(input) 35 | 36 | # 峰值归一化至 -1 dB 37 | peak_normalized_audio = pyln.normalize.peak(data, float(top)) 38 | 39 | # 测量响度 40 | meter = pyln.Meter(rate) 41 | loudness = meter.integrated_loudness(data) 42 | 43 | # 响度归一化至 -12 dB LUFS 44 | loudness_normalized_audio = pyln.normalize.loudness(data, loudness, float(loud)) 45 | 46 | sf.write("./normalized_audio.wav", loudness_normalized_audio, rate) 47 | 48 | return "./normalized_audio.wav" 49 | 50 | 51 | 52 | 53 | def main(): 54 | with gr.Blocks() as demo: 55 | gr.Markdown('# 音频响度统一 WebUI\n\n') 56 | with gr.Group(): 57 | 58 | a_aud = gr.Audio(label="待处理音频", type="filepath") 59 | 60 | # top = gr.Textbox(label="峰值归一化",value="-1.0") 61 | 62 | loud = gr.Textbox(label="响度归一控制,LUFS的读数是负数,例如-5 LUFS,-10 LUFS,-13 LUFS等,数值越接近0,平均响度水平越高。",value="-5.0") 63 | 64 | 65 | btn = gr.Button('开始处理', variant='primary') 66 | 67 | aud = gr.Audio(label="处理结果",show_download_button=True) 68 | 69 | btn.click(normalize_video_volume, inputs=[a_aud,loud], outputs=[aud]) 70 | 71 | 72 | gr.Markdown('WebUI by [刘悦的技术博客](https://space.bilibili.com/3031494).') 73 | 74 | 75 | demo.queue().launch(inbrowser=True,server_name="0.0.0.0",) 76 | 77 | if __name__ == "__main__": 78 | main() 79 | --------------------------------------------------------------------------------