使用 whisper, 音频分割, 初步尝试,切割为小块,效果还不错 1

发布于:2025-08-02 ⋅ 阅读:(20) ⋅ 点赞:(0)
对于一首歌而言,如何断句?

即,一个 mp4 或是 mp3 文件,或是一段录音, 如何使用程序,或是 ai 来断句。

分割为一句一句的片段??

如果人工来分割,一般是使用  capcut 之类的剪辑软件。但是效率太慢了。

所以我想能否设计一个简洁的,自动的程序来处理。

这种事情,专业的名称叫什么?

请添加图片描述

好的,这是一个非常棒且有实际应用价值的问题。将一首歌自动分割成一句一句的片段,在技术上是完全可以实现的。我们来系统地拆解一下这个问题。

1. 这个问题的专业名称是什么?

这个任务涉及多个领域,根据侧重点不同,有不同的专业术语:

  • 歌词转录与对齐 (Lyric Transcription and Alignment):这是最核心的描述。它不仅包括把歌声转录成文字(Transcription),还包括将文字的每个词或每句话与音频中的精确时间点对应起来(Alignment)。
  • 音频强制对齐 (Audio Forced Alignment):如果你已经有了准确的歌词文本,这个技术可以帮你将文本中的每个词自动对齐到音频的时间轴上。这是效率最高、最精确的方法之一。
  • 语音活动检测 (Voice Activity Detection, VAD):这个技术用来识别音频中哪些部分是人声,哪些部分是纯音乐或静音。它可以作为断句的初步依据(在人声的停顿处分割)。
  • 自动语音识别 (Automatic Speech Recognition, ASR):这是更广义的术语,指将语音(包括歌声)转换成文字。现代的ASR模型通常能提供每个词的时间戳(Timestamp),这是实现你需求的关键。

简单来说,你的目标可以概括为 “基于AI的歌词时间戳获取与音频分割”

2. 如何用程序或AI来自动断句?

核心思路是:语音转文字 → 获取每句话的时间戳 → 根据时间戳分割音频

目前,最强大且易于上手的工具是 OpenAI 的 Whisper 模型。它不仅识别准确率高,支持多种语言,而且能直接输出带有时间戳的句子(或单词)级别的结果。

下面我将为你设计一个简洁的、自动化的处理流程和程序思路。

方案设计:基于 Whisper 的自动断句程序

这个程序的目标是输入一个音频文件(mp3, mp4等),输出一堆按句子分割好的小音频片段。

技术栈:

  1. AI模型: OpenAI Whisper (或其更快的变种,如 faster-whisper)。
  2. 编程语言: Python (生态最丰富,最适合做这类任务)。
  3. 核心库:
    • openai-whisper: 运行Whisper模型的官方库。
    • ffmpeg-pythonpydub: 用于音频文件的读取和分割。pydub 更简单易用。
    • moviepy: 如果输入是mp4,需要用它来提取音轨。

步骤一:环境准备

首先,你需要在你的电脑上安装 Python 和必要的库。

# 安装 Whisper
pip install git+https://github.com/openai/whisper.git

# 安装 pydub 用于音频分割
pip install pydub

# 安装 moviepy 用于从视频提取音频 (如果需要处理mp4)
pip install moviepy

# Whisper 依赖 ffmpeg,需要确保它已安装在你的系统中
# Windows: 下载 ffmpeg.exe 并将其路径添加到系统环境变量
# macOS: brew install ffmpeg
# Linux: sudo apt-get install ffmpeg

步骤二:程序设计与代码实现 (Python示例)

这是一个简洁的 Python 脚本,演示了完整的流程。

import whisper
import os
from pydub import AudioSegment
from moviepy import AudioFileClip

def split_audio_by_lyrics(audio_path, output_dir):
    print("正在加载 Whisper 模型...")
    # 可以选择 'tiny', 'base', 'small', 'medium', 'large'
    # 模型越大,效果越好,速度越慢
    model = whisper.load_model("medium")

    print(f"正在处理文件: {audio_path}")

    # 1. 使用 Whisper 进行转录并获取带时间戳的片段
    # verbose=True 会打印识别过程
    result = model.transcribe(audio_path, verbose=True)

    # 2. 加载原始音频文件
    # 如果是视频文件,先提取音轨
    file_extension = os.path.splitext(audio_path)[1].lower()
    if file_extension in ['.mp4', '.mov', '.mkv']:
        print("检测到视频文件,正在提取音轨...")

        audio_clip = AudioFileClip(audio_path)
        # 将提取的音轨保存为临时文件,或直接操作
        # 这里为了简化,我们先保存再用 pydub 加载
        temp_audio_path = "temp_audio.mp3"
        audio_clip.write_audiofile(temp_audio_path)
        audio = AudioSegment.from_mp3(temp_audio_path)
        audio_clip.close()
        os.remove(temp_audio_path) # 清理临时文件
    else:
        audio = AudioSegment.from_file(audio_path)

    # 3. 创建输出目录
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    print("\n--- 开始分割音频 ---")

    # 4. 遍历 Whisper 返回的每一句 (segment)
    # Whisper 的 'segments' 键包含了带时间戳的句子列表
    for i, segment in enumerate(result['segments']):
        start_time = int(segment['start'] * 1000)  # pydub 使用毫秒
        end_time = int(segment['end'] * 1000)
        text = segment['text'].strip()

        print(f"片段 { i +1}: 时间 [{segment['start']:.2f}s -> {segment['end']:.2f}s] - 文本: {text}")

        # 使用 pydub 切割音频
        sentence_audio = audio[start_time:end_time]

        # 定义输出文件名
        # 为了避免文件名包含非法字符,可以只用序号
        output_filename = os.path.join(output_dir, f"segment_{ i +1:03d}.mp3")

        # 导出分割后的音频片段
        sentence_audio.export(output_filename, format="mp3")

    print(f"\n处理完成!分割后的文件已保存在 '{output_dir}' 目录下。")


if __name__ == "__main__":
    input_file = "a.mp4"
    output_folder = "small_parts"

    split_audio_by_lyrics(input_file, output_folder)


3. 这个方案的优缺点和注意事项

优点:
  • 高度自动化:完全无需人工干预,从头到尾自动完成。
  • 效率极高:相比手动使用 CapCut,处理一首歌可能只需要几分钟(取决于你的电脑性能和歌曲长度)。
  • 准确性好:Whisper 对歌声的识别效果在业界处于领先地位,即使有背景音乐也能较好地工作。
  • 通用性强:支持多种音频和视频格式,支持几乎所有主流语言。
缺点与挑战:
  • 断句的粒度:Whisper 的 “segment” 是它自己算法判断的句子,可能是一个较长的乐句,也可能是一个短语。这个粒度不一定完全符合你对“一句”的定义。但通常效果已经很好了。如果需要更细的粒度,可以设置为按词分割(word_timestamps=True),然后自己编程根据停顿或语义来组合成句子。
  • 纯音乐部分:Whisper 会自动跳过没有歌词的纯音乐部分,这通常是你想要的结果。
  • 演唱风格影响:对于说唱、美声或者发音非常模糊的歌曲,识别准确率会下降。
  • 硬件要求:运行 mediumlarge 级别的 Whisper 模型需要较好的电脑配置,特别是显卡(GPU),否则速度会很慢。如果你没有好的GPU,可以使用较小的模型(如basesmall),或者使用云服务。

4. 如果想更进一步

  • 使用更快的 Whisper: 对于没有强大GPU的用户,可以使用 faster-whisper 库,它对 Whisper 进行了优化,在CPU上运行速度快很多,效果几乎无损。
  • 使用云服务 API: 如果你不想在本地配置环境,可以直接调用云服务商的 API,如 Google Cloud Speech-to-TextAWS Transcribe 或专门的语音AI公司 AssemblyAI。它们都提供带时间戳的转录服务,你只需上传文件,然后解析返回的 JSON 结果即可。
  • 结合强制对齐: 如果你能找到歌曲的LRC歌词文件,那么可以使用强制对齐 (Forced Alignment) 工具(如 aeneas)来获得最精确的时间戳,因为它是用已知的文本去匹配音频,而不是从零开始识别。

总结一下,对于你的需求,使用 OpenAI Whisper 模型编写一个 Python 脚本是目前最理想、最高效的自动化解决方案。上面提供的代码已经是一个可以运行的完整框架,你只需要修改一下文件路径就可以开始使用了。


网站公告

今日签到

点亮在社区的每一天
去签到