音频切分

更新时间:
复制 MD 格式

音频切分函数将输入音频按固定时长、指定时间戳或语音活动范围切成多个片段,适用于长音频分片处理与语音识别前置切分。

使用说明

本文函数由Python 多模态函数库提供(VVR 11.8+),使用前需在 SQL 作业开头添加:

LOAD MODULE python;
USE MODULES python, core;
  • 音频切分函数返回一个名为 segment 的列,一行一个片段。音频片段统一使用半开区间 [start_ms, end_ms)

  • 音频切分函数的 segment_type 必须是常量 'audio''ref',并同时决定输入要求和返回列的静态类型:

    • 'audio' 要求输入为解码后的音频波形,返回物化波形。

    • 'ref' 要求输入为 URI 或音频片段引用,返回只包含 URI 和时间边界的引用。

  • 音频切分函数为表值函数(TableFunction),需要通过 LATERAL TABLE 调用。

函数一览

函数

ref 模式是否打开源文件

说明

AUDIO_SPLIT_BY_DURATION

是(探测时长)

按指定固定时长依次切分音频,并根据 segment_type 输出实际音频波形或片段引用。适合处理超过下游单次输入上限的长音频,例如将一小时录音切成 30 秒片段并行送入 ASR;最后一段可以更短。

AUDIO_SPLIT_BY_TIMESTAMP

否(完全惰性)

按调用方提供的开始和结束时间范围切分音频,并按原顺序输出音频波形或片段引用。适合已经有字幕、日志、会议纪要或人工标注时间轴的场景,例如按字幕时间提取对应音频,或按会议纪要定位发言片段。

AUDIO_SPLIT_BY_SPEECH

是(读取元数据)

根据已有语音活动范围,对区间做扩边、合并、短段过滤和长段拆分,再输出音频波形或片段引用。适合处理含大量静音的通话、访谈或 Podcast,例如配合 AUDIO_DETECT_SPEECH 跳过空白,只生成适合 ASR 的人声片段。

AUDIO_SPLIT_BY_DURATION

按固定时长切分音频。

AUDIO_SPLIT_BY_DURATION(
  audio_input,
  segment_duration_ms
  [, segment_type
  [, max_segments]]
)

参数

类型

默认值

说明

audio_input

音频波形 ROW;或在 'ref' 模式下为 STRING、音频片段引用 ROW

必填

要切分的音频。输入为 NULL 时不输出行。

segment_duration_ms

INT NOT NULL

必填

每个片段的目标时长(毫秒),必须大于 0。

segment_type

STRING NOT NULL

'audio'

输出模式:'audio''ref'

max_segments

INT NOT NULL

1024

每个输入允许的最大片段数,必须大于 0。

返回列: segment。当 segment_type'audio' 时,静态类型为音频波形 ROW;为 'ref' 时,静态类型为音频片段引用 ROW

行为说明:

  • 'audio' 模式要求输入为解码后的音频波形,并物化每个片段的样本。

  • 'ref' 模式要求输入为 URI 或音频片段引用;函数会探测时长并按实际时长和已有引用边界裁剪,只生成引用而不复制音频内容。

  • 最后一个片段可以短于 segment_duration_ms

  • 需要的片段数超过 max_segments 时抛出异常,不会静默截断。

  • 省略 segment_type 时默认为 'audio',此时会尝试把输入按波形处理。如果 audio_input 是 URI 或音频片段引用,必须显式传入 'ref';否则运行时会因类型不匹配报错。

SELECT t.id, s.segment
FROM audio_waveforms AS t
CROSS JOIN LATERAL TABLE(
  AUDIO_SPLIT_BY_DURATION(t.waveform, 30000, 'audio', 1024)
) AS s(segment);

SELECT t.id, s.segment
FROM audio_files AS t
CROSS JOIN LATERAL TABLE(
  AUDIO_SPLIT_BY_DURATION(t.uri, 30000, 'ref', 1024)
) AS s(segment);

AUDIO_SPLIT_BY_TIMESTAMP

按调用方提供的时间范围切分音频。

AUDIO_SPLIT_BY_TIMESTAMP(
  audio_input,
  timestamps
  [, segment_type]
)

参数

类型

默认值

说明

audio_input

音频波形 ROW;或在 'ref' 模式下为 STRING、音频片段引用 ROW

必填

要切分的音频。

timestamps

时间范围 ROW 的数组

必填

ARRAY<ROW<start_ms BIGINT, end_ms BIGINT>> 或带 duration_ms 字段的三字段形式。该参数可以来自表字段。

segment_type

STRING NOT NULL

'audio'

输出模式:'audio''ref'

返回列: segment。返回类型由 segment_type 决定。

时间范围必须非负,且 end_ms 必须大于或等于 start_ms。三字段形式中的 duration_ms 不参与计算,只使用 start_msend_ms。输入或 timestampsNULL 时不输出行。

  • 'audio' 模式把范围裁剪到波形的实际时间线,完全越界或裁剪后为空的范围不输出。

  • 'ref' 模式对普通 URI 完全惰性:不打开文件、不验证 URI 是否存在,也不按真实音频时长裁剪。

  • 'ref' 模式对已有音频片段引用只按其声明边界裁剪,不校验边界是否超过真实文件时长。

  • 输出顺序与 timestamps 中的输入顺序一致,不会自动排序。

SELECT t.id, s.segment
FROM audio_files AS t
CROSS JOIN LATERAL TABLE(
  AUDIO_SPLIT_BY_TIMESTAMP(
    t.uri,
    ARRAY[
      ROW(CAST(1000 AS BIGINT), CAST(3500 AS BIGINT)),
      ROW(CAST(5000 AS BIGINT), CAST(7000 AS BIGINT))
    ],
    'ref'
  )
) AS s(segment);

AUDIO_SPLIT_BY_SPEECH

根据上游已经生成的语音活动范围切分音频。该函数本身不检测语音,可将 AUDIO_DETECT_SPEECH 的结果作为 speech_activity 输入。

SQL 只支持以下 2、3、9 参数形式:

AUDIO_SPLIT_BY_SPEECH(audio_input, speech_activity)

AUDIO_SPLIT_BY_SPEECH(
  audio_input,
  speech_activity,
  segment_type
)

AUDIO_SPLIT_BY_SPEECH(
  audio_input,
  speech_activity,
  segment_type,
  pre_padding_ms,
  post_padding_ms,
  merge_gap_ms,
  min_segment_ms,
  max_segment_ms,
  max_segments
)

参数

类型

默认值

说明

audio_input

音频波形 ROW;或在 'ref' 模式下为 STRING、音频片段引用 ROW

必填

要切分的音频。

speech_activity

时间范围 ROW 的数组

必填

二字段或三字段时间范围数组;三字段形式中的 duration_ms 不参与计算。该参数可以来自表字段。

segment_type

STRING NOT NULL

'audio'

输出模式:'audio''ref'

pre_padding_ms

INT NOT NULL

0

每段开始前增加的时长,必须大于或等于 0。

post_padding_ms

INT NOT NULL

0

每段结束后增加的时长,必须大于或等于 0。

merge_gap_ms

INT NOT NULL

0

合并间隔不超过该值的区间,必须大于或等于 0。

min_segment_ms

INT NOT NULL

0

丢弃短于该值的区间,必须大于或等于 0。

max_segment_ms

INT

NULL

把长于该值的区间继续切成连续、不重叠的子块,每块不超过 max_segment_ms;同一区间的最后一块可短于该值。切块基于 padding 与合并后的区间,因此 pre_padding_mspost_padding_ms 会计入。非 NULL 时必须大于 0。

max_segments

INT NOT NULL

1024

最大结果片段数,必须大于 0。

返回列: segment。返回类型由 segment_type 决定。

如果需要设置任意调优参数,必须一次写全 9 个位置,不能使用 4 至 8 参数的调用形式;不启用 max_segment_ms 时直接使用 NULL

函数按以下顺序处理语音范围:

  1. 在区间前后增加 padding,起点最低为 0。

  2. 按开始时间排序。

  3. 合并重叠区间,以及间隔小于或等于 merge_gap_ms 的区间。

  4. 丢弃非正时长以及短于 min_segment_ms 的区间。

  5. 如果设置 max_segment_ms,把过长区间继续切成连续子块,每块不超过该值,最后一块可较短。

  6. 结果超过 max_segments 时抛出异常。

  7. 按波形或音频对象边界裁剪,丢弃完全越界的区间。

AUDIO_SPLIT_BY_TIMESTAMP(..., 'ref') 不同,语音切分的 'ref' 模式会读取元数据以确定并裁剪到实际音频时长。输入或 speech_activityNULL 时不输出行。

WITH detected AS (
  SELECT
    id,
    waveform,
    AUDIO_DETECT_SPEECH(waveform, 2, 30, 100, 50, 1024) AS speech_ranges
  FROM audio_waveforms
)
SELECT t.id, s.segment
FROM detected AS t
CROSS JOIN LATERAL TABLE(
  AUDIO_SPLIT_BY_SPEECH(
    t.waveform,
    t.speech_ranges,
    'audio',
    200,
    200,
    50,
    100,
    NULL,
    1024
  )
) AS s(segment);