python检测音频静音段并添加静音段

Posted 不能说的秘密

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python检测音频静音段并添加静音段相关的知识,希望对你有一定的参考价值。

#! /usr/bin/env python
# -*- coding: utf-8 -*-#
# -------------------------------------------------------------------------------
# Name:         检测添加静音段时长
# Author:       yunhgu
# Date:         2021/11/2 8:53
# Description: 
# -------------------------------------------------------------------------------
import logging
import shutil
from pathlib import Path
from time import strftime, localtime, time
from traceback import format_exc
from pydub import Audiosegment
from pydub.silence import detect_silence
from alive_progress import alive_bar


# 日志函数
def log(log_name: str, p_type=""):
    journal = logging.getLogger(log_name)
    journal.setLevel(level=logging.INFO)
    log_file = f"{log_name}{strftime(\'%Y%m%d%H\', localtime(time()))}.log"
    format_content = \'%(message)s\'
    if p_type == "time":
        format_content = \'%(asctime)s - %(levelname)s: %(message)s\'
    handler = logging.FileHandler(log_file, mode="w", encoding=\'utf-8\')
    handler.setLevel(logging.INFO)
    formatter = logging.Formatter(format_content)
    handler.setFormatter(formatter)

    console = logging.StreamHandler()
    console.setLevel(logging.ERROR)
    console.setFormatter(formatter)

    journal.addHandler(handler)
    journal.addHandler(console)
    return journal


logger = log("检测添加静音段时长")


# 检查路径是否存在以及是否为空
def check_exist(path):
    return Path(path).exists() and path != ""


def add_silence(sound, silence_length, output_file):
    one_sec_segment = AudioSegment.silent(duration=2100 - silence_length)
    final_song = one_sec_segment + sound
    final_song.export(output_file, format="wav")


# 检测和添加静音段
def check_and_add(file, qualified_path, unqualified_path):
    sound = AudioSegment.from_file(file)
    start_end_list = detect_silence(sound, 100, -50, 1)
    if len(start_end_list) > 0:
        silence_length = start_end_list[0][1] - start_end_list[0][0]
        if silence_length < 2000:
            output_file = unqualified_path.joinpath(file.name)
            add_silence(sound, silence_length, output_file)
            logger.info(f"{file}开头静音段时长:{silence_length}ms")
        else:
            shutil.copy(file, qualified_path)


# 主程序
def main(input_path, output_path):
    count = len([file for file in input_path.rglob("*.wav")])
    with alive_bar(total=count) as bar:
        for file in input_path.rglob("*.wav"):
            try:
                qualified_path = output_path.joinpath("合格音频")
                qualified_path.mkdir(parents=True, exist_ok=True)
                unqualified_path = output_path.joinpath("添加静音音频")
                unqualified_path.mkdir(parents=True, exist_ok=True)
                check_and_add(file, qualified_path, unqualified_path)
            except Exception as e:
                logger.error(f"{file}运行失败,跳过这个文件。{e}\\n{format_exc()}")
            finally:
                bar()


if __name__ == \'__main__\':
    while True:
        print("**** start    ****")
        input_folder = input("请输入音频文件夹:")
        output_folder = input("请输入结果保存文件夹:")
        # input_folder = r"F:\\任务\\2021\\许倩\\检测添加静音段时长\\data"
        # output_folder = r"F:\\任务\\2021\\许倩\\检测添加静音段时长\\result"
        if check_exist(input_folder) and check_exist(output_folder):
            try:
                main(Path(input_folder), Path(output_folder))
            except Exception as ee:
                logger.error(f"{format_exc()}:{ee}")
            print("**** finished ****")
            c = input("请输入q(不区分大小写)退出,按其他任意键继续!!!")
            if c.lower() == "q":
                break
        else:
            logger.error("输入的路径不存在,请检查后重新输入!!!")
            continue
不论你在什么时候开始,重要的是开始之后就不要停止。 不论你在什么时候结束,重要的是结束之后就不要悔恨。

[Python][Moviepy] 如何在音频末尾添加短暂的静音?

【中文标题】[Python][Moviepy] 如何在音频末尾添加短暂的静音?【英文标题】:[Python][Moviepy] How to add a short silence in the end of an audio? 【发布时间】:2021-05-10 09:31:25 【问题描述】:

我想在音频剪辑的末尾添加一段短暂的静音持续时间。我在 Moviepy 文档中没有找到任何特定的功能,所以我求助于创建一个 500 毫秒的静音音频文件并将其与原始音频文件连接。

在某些情况下,这种串联会在交叉路口引入明显的故障,我还没有弄清楚原因。通过将连接的音频文件导入 Audacity,我还意识到,Moviepy 在连接时实际上会创建两个音轨。

您是否知道在剪辑末尾添加静音的更好方法,或者有时会出现此故障的原因(根据我的经验,大约每 4 次出现 1 次)?

这是我的代码:

from moviepy.editor import *

temp_audio = "original audio dir"
silence = "silence audio dir"

audio1 = AudioFileClip(temp_audio)                      #original audio file
audio2 = AudioFileClip(silence)                         #silence audio file
final_audio = concatenate_audioclips([audio1,audio2])
final_audio.write_audiofile(output)

我目前正在使用 Python 3.9.5 和 Moviepy 1.0.3

【问题讨论】:

你可以创建一个AudioClip,传入一个只返回0的函数 谢谢,我不知道我能做到这一点!我试过了,但不幸的是我仍然遇到同样的音频故障。这是我使用的代码:silence = AudioClip(make_frame = lambda t: 0, duration = 0.5, fps = 24)。然后我像以前的代码一样连接起来。也许问题在于连接函数 看来使用ffmpeg直接修复了音频故障,所以我暂时使用它: os.system('ffmpeg -i "concat:'+temp_audio+'|'+silence+'" '+输出) 是的,ffmpeg 更适合简单的连接:) 【参考方案1】:

可能是 fps=44100 将工作 。 mp3文件的频率

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于python检测音频静音段并添加静音段的主要内容,如果未能解决你的问题,请参考以下文章

使用静音检测分割音频文件

音频自动增益 与 静音检测 算法 附完整C代码

Python 简单的扩音,音频去噪,静音剪切

在 Python 中检测和录制音频

音频自动增益 与 静音检测 算法 附完整C代码

静音检测是啥