音频切分函数将输入音频按固定时长、指定时间戳或语音活动范围切成多个片段,适用于长音频分片处理与语音识别前置切分。
使用说明
本文函数由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 模式是否打开源文件 | 说明 |
是(探测时长) | 按指定固定时长依次切分音频,并根据 | |
否(完全惰性) | 按调用方提供的开始和结束时间范围切分音频,并按原顺序输出音频波形或片段引用。适合已经有字幕、日志、会议纪要或人工标注时间轴的场景,例如按字幕时间提取对应音频,或按会议纪要定位发言片段。 | |
是(读取元数据) | 根据已有语音活动范围,对区间做扩边、合并、短段过滤和长段拆分,再输出音频波形或片段引用。适合处理含大量静音的通话、访谈或 Podcast,例如配合 |
AUDIO_SPLIT_BY_DURATION
按固定时长切分音频。
AUDIO_SPLIT_BY_DURATION(
audio_input,
segment_duration_ms
[, segment_type
[, max_segments]]
)参数 | 类型 | 默认值 | 说明 |
audio_input | 音频波形 | 必填 | 要切分的音频。输入为 |
segment_duration_ms |
| 必填 | 每个片段的目标时长(毫秒),必须大于 0。 |
segment_type |
|
| 输出模式: |
max_segments |
|
| 每个输入允许的最大片段数,必须大于 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 | 音频波形 | 必填 | 要切分的音频。 |
timestamps | 时间范围 | 必填 |
|
segment_type |
|
| 输出模式: |
返回列: segment。返回类型由 segment_type 决定。
时间范围必须非负,且 end_ms 必须大于或等于 start_ms。三字段形式中的 duration_ms 不参与计算,只使用 start_ms 和 end_ms。输入或 timestamps 为 NULL 时不输出行。
'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 | 音频波形 | 必填 | 要切分的音频。 |
speech_activity | 时间范围 | 必填 | 二字段或三字段时间范围数组;三字段形式中的 |
segment_type |
|
| 输出模式: |
pre_padding_ms |
|
| 每段开始前增加的时长,必须大于或等于 0。 |
post_padding_ms |
|
| 每段结束后增加的时长,必须大于或等于 0。 |
merge_gap_ms |
|
| 合并间隔不超过该值的区间,必须大于或等于 0。 |
min_segment_ms |
|
| 丢弃短于该值的区间,必须大于或等于 0。 |
max_segment_ms |
|
| 把长于该值的区间继续切成连续、不重叠的子块,每块不超过 |
max_segments |
|
| 最大结果片段数,必须大于 0。 |
返回列: segment。返回类型由 segment_type 决定。
如果需要设置任意调优参数,必须一次写全 9 个位置,不能使用 4 至 8 参数的调用形式;不启用 max_segment_ms 时直接使用 NULL。
函数按以下顺序处理语音范围:
在区间前后增加 padding,起点最低为 0。
按开始时间排序。
合并重叠区间,以及间隔小于或等于
merge_gap_ms的区间。丢弃非正时长以及短于
min_segment_ms的区间。如果设置
max_segment_ms,把过长区间继续切成连续子块,每块不超过该值,最后一块可较短。结果超过
max_segments时抛出异常。按波形或音频对象边界裁剪,丢弃完全越界的区间。
与 AUDIO_SPLIT_BY_TIMESTAMP(..., 'ref') 不同,语音切分的 'ref' 模式会读取元数据以确定并裁剪到实际音频时长。输入或 speech_activity 为 NULL 时不输出行。
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);