「Python|场景案例」如何获取音视频中声音片段的起止时间?

这篇具有很好参考价值的文章主要介绍了「Python|场景案例」如何获取音视频中声音片段的起止时间?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要介绍如何使用python的第三方库moviepy找出音视频中声音开始出现的位置以及声音结束的位置。

场景描述

  • 假设我们有一段音频,音频开始有一段无声片段,音频结束也有一段无声片段,我们需要知道开头无声片段的结束位置和结束无声片段的开始位置,或者换句话说,我们需要知道在第几秒开始第一次出现声音,在第几秒位置是最后一次声音,这样就可以去除首末的无声部分。
  • 更进一步,假设我们有一段单词发音音频,整个音频读了多个单词,我们希望得到各个片段的起始时间和结束时间(之后可以根据时间将音频切分为单个单词的发音音频)

我们使用音视频软件打开一段音频,可以看到音频声音结构如下,分为4个有声部分,开头和结束都有一小段无声部分。
「Python|场景案例」如何获取音视频中声音片段的起止时间?

各个音频片段的开始时间和结束时间如下:

音频片段 目测开始时间 目测结束时间
第一段 0.18s 4.06s
第二段 5.20s 5.27s
第三段 8.21s 9.00s
第四段 10.16s 18.6s

接下来我们就尝试编写一段程序找出上述四个片段的起止时间

准备工作

  • 处理音视频的时候,可以使用强大的ffmpeg工具完成各种各样的操作
  • python中可以使用底层封装了ffmpeg的第三方库moviepy来快速完成一些常见的音视频处理

所以,我们需要安装ffmpeg(moviepy需要使用),moviepy两个库,

  • ffmpeg 具体安装可以参考:如何在Windows系统安装ffmpeg
  • moviepy可以通过pip命令安装:pip install moviepy

解决方案

想要找出一段音频中在第几秒开始出现声音,我们可以从音频开始以很小的时间间隔检查每一个时间点上的音频音量,如果音频音量等于0(或者小于某个音量值),则认为这个时间点是无声的,检查到第一个不是无声的时间点,就是音频开始出现声音的位置。
同理,如果我们要找出单词带读音频中各个单词的起止时间,则找到第一次出现声音的位置和声音出现后第一次消失的位置就是这个单词音频的起止时间。

我们查找moviepy中是否已经有现成的查看音频音量的方法,可以找到.max_volume()方法可以得到一段音频中的最大音量,使用这个方法,如果一段极短的音频的最大音量是0(或者小于某个值)就认为这个时间段的音频是无声的,则可以设计如下操作:

  • (导入我们要用的moviepy):from moviepy.editor import *
  • 读取音频数据:
    • audio = AudioFileClip("D:/45.mp3")
    • 如果是视频文件, 则使用audio = VideoFileClip("D:/视频文件名.mp4").audio获取视频的音频数据
  • 音频都是从0s开始的,结束时间可以通过audio.end得到
  • 假设我们检查的时间间隔是0.1s,则可以分成audio.end / 0.1个需要检查的时间片段
  • 截取某一个片段的音频可以使用audio_clip = audio.subclip(0, 0.1)
  • 检查获取最大音量:audio_clip.max_volume()

源代码

import math
from typing import List
from moviepy.editor import *


def mark_each_duration_sound_or_silent(audio_clip, window_size=0.1, volume_threshold=0.01) -> List[bool]:
    """标记每一个检查区间的音频片段是有声还是无声"""

    window_amount = math.floor(audio_clip.end / window_size)
    window_is_silent = []
    for i in range(window_amount):
        s = audio_clip.subclip(i * window_size, (i + 1) * window_size)
        v = s.max_volume()
        window_is_silent.append(v < volume_threshold)
    return window_is_silent


def find_sound_appear_and_disappear_position(window_is_silent, window_size=0.1, ease_in=0.25):
    """找出每一个「无声到有声」和「有声到无声」的时间点作为声音片段的起止时间"""
    
    speaking_start = 0
    speaking_end = 0
    sound_intervals = []
    for window_num in range(1, len(window_is_silent)):
        last_point = window_is_silent[window_num - 1]
        current_point = window_is_silent[window_num]

        # 出现上一个时间点无声, 当前时间点有声, 当前时间点就是声音开始位置
        if last_point and not current_point:
            speaking_start = window_num * window_size

        # 出现上一个时间点有声, 当前时间点无声, 当前时间点就是声音结束位置
        # 有了声音的开始位置和结束位置,就有了一个声音片段的起止区间
        if not last_point and current_point:
            speaking_end = window_num * window_size
            new_speaking_interval = [speaking_start - ease_in, speaking_end + ease_in]
            if new_speaking_interval[0] < 0:
                new_speaking_interval[0] = 0

            # 当时间间隔(window_size)过小而声音渐入区间(ease in)过大时, 会出现时间片段重叠的问题,这种情况需要合并两个区间
            need_to_merge = len(sound_intervals) > 0 and sound_intervals[-1][1] > new_speaking_interval[0]
            if need_to_merge:
                merged_interval = [sound_intervals[-1][0], new_speaking_interval[1]]
                sound_intervals[-1] = merged_interval
            else:
                sound_intervals.append(new_speaking_interval)

    return sound_intervals


def find_sound_intervals(audio_clip, window_size=0.1, volume_threshold=0.01, ease_in=0.25):
    # First, iterate over audio to find all silent windows.
    window_is_silent = mark_each_duration_sound_or_silent(audio_clip, window_size, volume_threshold)
    return find_sound_appear_and_disappear_position(window_is_silent, window_size, ease_in)


audio = AudioFileClip("D:/45.mp3")
print(f"Check With Default Options: {find_sound_intervals(audio)}")
"""输出结果:
Check With Default Options: [[0.25, 4.3500000000000005], [5.3500000000000005, 6.15], [8.450000000000001, 9.25], [10.25, 18.55]]
"""

找到了各个声音片段的起止时间,我们就可以使用截取音视频的方法将各个片段分别保存到本地磁盘了,快去试试吧~

好书推荐:

  • 流畅的python
  • Python编程 从入门到实践 第2版
  • Python数据结构与算法分析 第2版

好课推荐:

  • 零基础学python
  • python核心技术与实战
  • python自动化办公实战

写文不易,如果对你有帮助的话,来一波点赞、收藏、关注吧~👇文章来源地址https://www.toymoban.com/news/detail-412957.html

到了这里,关于「Python|场景案例」如何获取音视频中声音片段的起止时间?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 音视频解决方案(二):直播电商场景最佳实践

    音视频解决方案(二):直播电商场景最佳实践

    本文介绍使用ZEGO SDK 开发电商场景的小程序,具备音视频直播、IM互动、商品列表推送、美颜等功能,可满足商家多种直播卖货需求,可参考该组件实现自己的需求。 若小程序具备符合live-pusher、live-player的类目,则可以使用live-pusher和live-player,live-room 的isNative属性传入true。

    2024年02月20日
    浏览(6)
  • 音视频解决方案(一):在线KTV场景方案

    音视频解决方案(一):在线KTV场景方案

    在线 KTV 是社交娱乐场景下的新型互动玩法,通过歌曲把人与人连接起来,让沟通破冰变得更简单,有效提升平台用户停留时长。 在线 KTV 玩法有很多种,按照形式主要由以下几种: 排麦独唱:观众上麦后可以进行点歌排麦等待,歌曲开始播放后即可进行独唱。 实时合唱:两

    2024年01月24日
    浏览(9)
  • FFmpeg基础:获取音视频的各种编码参数

    FFmpeg基础:获取音视频的各种编码参数

    获取视频编码参数 视频编码参数主要包括:帧率、分辨率、编码格式、码率等,对应的概念如下。 帧率(Frame Rate) 每秒显示帧数(Frames Per Second)。电影的帧率一般是25fps和29.97fps,3D游戏要保持流畅则需要30fps以上的效果。 分辨率 指视频宽高的像素数值。标准1080P的分辨率为1920×

    2024年02月03日
    浏览(5)
  • MediaBox助力企业一站式获取音视频能力

    MediaBox助力企业一站式获取音视频能力

    以一只音视频百宝箱,应对「千行千面」。 洪炳峰、楚佩斯| 作者 大家好,今天我分享的主题是MediaBox——行业音视频数字化再加速。 根据权威数据表明,65%的行业数字化信息来自视频,基于此,音视频技术对于行业数字化来说是至关重要的。今天我想借此机会向大家介绍

    2024年02月09日
    浏览(11)
  • JRTP实时音视频传输(2)-使用TCP通信的案例

    JRTP实时音视频传输(2)-使用TCP通信的案例

    环境搭建等参考:JRTP实时音视频传输(1)-必做的环境搭建与demo测试 先将example1拷贝为myclienttcp.cpp和myservertcp.cpp cp example1.cpp myclienttcp.cpp cp example1.cpp myservertcp.cpp 改写jrtplib/JRTPLIB/examples/CMakeLists.txt,添加myclienttcp和myservertcp编译 重新生成Makefile并编译 可以看到成功编译了myclient

    2024年01月18日
    浏览(13)
  • Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标

    通过在通道画面上拾取鼠标按下的坐标,然后鼠标移动,直到松开,根据松开的坐标和按下的坐标,绘制一个矩形区域,作为热点或者需要电子放大的区域,拿到这个坐标区域,用途非常多,可以直接将区域中的画面放大,也可以将该圈起来的区域位置发给设备,由设备设定

    2024年02月03日
    浏览(7)
  • 5G时代下,Android音视频强势崛起,我们该如何快速入门音视频技术?

    5G时代下,Android音视频强势崛起,我们该如何快速入门音视频技术?

    作为Android开发者的我们到底应不应该上音视频这条船? 接下来一起分析下。 大趋势 从未来的大趋势来看,随着5G时代的到来,音视频慢慢变成人们日常生活中的必需品。除了在线教育、音视频会议、即时通讯这些必须使用音视频技术的产品外,其它的产品也需要加入音频、

    2024年04月15日
    浏览(8)
  • 【音视频】如何播放rtsp视频流

    【音视频】如何播放rtsp视频流

    现阶段直播越来越流行,直播技术发展也越来越快。Webrtc和rtsp是比较火热的技术,而且应用也比较广泛。本文通过实践来展开介绍关于rtsp、webrtc的使用过程。 本文重点介绍如何播放rtsp视频流,通过ffplay方式以及VLC media player的方式来播放 可以参考上一篇博文:【音视频】基于

    2024年01月19日
    浏览(35)
  • 【音视频】基于NGINX如何播放rtmp视频流

    【音视频】基于NGINX如何播放rtmp视频流

    现阶段直播越来越流行,直播技术发展也越来越快。Webrtc、rtmp、rtsp是比较火热的技术,而且应用也比较广泛。本文通过实践来展开介绍关于rtmp如何播放。 本文重点介绍基于NGINX如何播放rtmp视频流 可以参考上一篇博文:【音视频】基于webrtc协议浏览器播放rtsp https://blog.csdn.n

    2024年01月19日
    浏览(15)
  • 抖音视频如何下载保存(方法分享)

    有时刷抖音视频,看的喜欢的视频想要下载到本地,但是有很多视频无法下载或者下载下来是有水印的,那怎么办呢? 抖音视频下载有两种情况: 一种是可以直接点击分享下载,然后可以直接点击保存到相册。 视频就自动下载下来了,但是这直接下载下来的视有水印。 还有

    2024年04月14日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包