音频解码、编码与变换

更新时间:
复制 MD 格式

本文介绍音频函数中解码、编码与变换类函数的用法,包括 AUDIO_DECODE、AUDIO_ENCODE、AUDIO_CONVERT_FORMAT、AUDIO_STANDARDIZE、AUDIO_RESAMPLE 和 AUDIO_CONCAT。

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

LOAD MODULE python;
USE MODULES python, core;

音频解码与编码函数在编码字节和 float32 PCM 波形之间转换;变换函数直接作用于波形,改变采样率、声道数或拼接多段音频。多数下游音频处理函数(如切分、语音识别)都需要以解码后的波形作为输入。

函数一览

函数

类别

说明

AUDIO_DECODE

解码

BYTES、URI 或片段引用解码为 float32 PCM 音频波形。适合在重采样、声道转换、语音检测、切分或识别前统一输入,例如把 MP3、WAV 或 FLAC 文件转换为下游波形函数可直接处理的样本数据。

AUDIO_ENCODE

编码

将 float32 PCM 音频波形编码为 WAV、FLAC、AIFF、MP3 或 OGG 字节。适合在波形完成变换、拼接或切分后落盘、传输,或交给只接受编码文件的系统,例如把标准化后的 16 kHz 单声道波形保存为 WAV。

AUDIO_CONVERT_FORMAT

格式转换

先解码输入,再按目标格式重新编码为新字节。适合在下游要求特定容器或编码格式时使用,例如将来源不统一的音频归一成 WAV、FLAC 等格式。

AUDIO_STANDARDIZE

变换

先转换声道,再重采样,将音频波形统一为指定采样率和声道数。适合在 ASR、VAD 或模型推理前规范不同来源的输入

AUDIO_RESAMPLE

变换

使用 soxr HQ 改变音频波形的采样率,同时保留原声道数。适合在下游只要求特定采样率、但需要保持原声道布局时使用,例如把 48 kHz 立体声录音转换为 16 kHz 立体声。

AUDIO_CONCAT

变换

按数组顺序拼接多个采样率、声道数和采样格式一致的音频波形。适合重组切分片段或合并分段处理结果,例如把并行降噪后的连续片段恢复为一段音频。

音频解码、编码与变换

AUDIO_DECODE

把编码音频或音频片段引用解码为 float32 PCM 波形。

AUDIO_DECODE(
  audio_input
  [, on_error
  [, max_decoded_bytes]]
)

参数

类型

默认值

说明

audio_input

BYTESSTRING 或音频片段引用 ROW

必填

编码音频字节、URI 或音频片段引用。

on_error

STRING NOT NULL

'null'

错误处理策略:'null' 对可识别的媒体数据错误返回 NULL'raise' 抛出异常。

max_decoded_bytes

INT NOT NULLBIGINT NOT NULL

1073741824

单行解码后 PCM 张量的最大字节数,必须大于 0 且不超过 2147483647

返回类型: 音频波形 ROW

  • SQL 的默认 on_error'null'。这与 Python DataFrame 接口的默认值不同。

  • 解码大小按 frames × channels × 4 计算,默认上限为 1 GiB。

  • 'null' 可处理损坏、截断、空音频和解码大小超限等媒体数据错误;URI 访问错误、非法片段引用、依赖缺失、参数错误和其他内部错误仍会抛出。

  • 对片段引用,输出起止时间会按实际采样帧边界换算;对字节输入,来源 URI 和起止时间为 NULL

SELECT AUDIO_DECODE(audio_bytes) AS waveform
FROM raw_audio;

AUDIO_ENCODE

把音频波形编码为指定格式的字节。

AUDIO_ENCODE(audio_input [, format])

参数

类型

默认值

说明

audio_input

音频波形 ROW

必填

要编码的音频波形。

format

STRING NOT NULL

'wav'

目标格式,大小写不敏感。

返回类型: BYTES。输入为 NULL 时返回 NULL

支持的规范格式和别名如下:

规范格式

别名

默认编码子类型

AIFF

AIF

PCM 16 bit

FLAC

PCM 16 bit

MP3

MPEG

MPEG Layer III

OGG

OGA

Vorbis

WAV

WAVE

PCM 16 bit

实际可用格式还取决于运行环境中的 soundfile/libsndfile。格式或编码子类型不受运行时支持、波形结构非法,或者样本包含 NaN 或无穷值时,函数抛出异常。

SELECT AUDIO_ENCODE(waveform, 'flac') AS flac_bytes
FROM audio_waveforms;

AUDIO_CONVERT_FORMAT

把编码音频转换为另一种编码格式。该函数先解码,再按目标格式重新编码。

AUDIO_CONVERT_FORMAT(
  audio_input
  [, format
  [, on_error
  [, max_decoded_bytes]]]
)

参数

类型

默认值

说明

audio_input

BYTESSTRING

必填

编码音频字节或 URI;不支持音频片段引用和音频波形。

format

STRING NOT NULL

'wav'

目标格式,取值与 AUDIO_ENCODE 相同。

on_error

STRING NOT NULL

'null'

解码错误处理策略:'null''raise'

max_decoded_bytes

INT NOT NULLBIGINT NOT NULL

1073741824

中间 PCM 张量的最大字节数,约束与 AUDIO_DECODE 相同。

返回类型: BYTES

SQL 的默认 on_error'null''null' 只处理解码阶段可识别的媒体数据错误;目标格式无效、编码阶段失败、URI 错误、依赖错误和参数错误仍会抛出。输入为 NULL 时返回 NULL

SELECT AUDIO_CONVERT_FORMAT(audio_bytes, 'flac') AS flac_bytes
FROM raw_audio;

AUDIO_STANDARDIZE

把音频波形统一为指定采样率和声道数。

AUDIO_STANDARDIZE(audio_input [, sample_rate [, channels]])

参数

类型

默认值

说明

audio_input

音频波形 ROW

必填

要标准化的音频波形。

sample_rate

INT NOT NULL

16000

目标采样率,必须大于 0。

channels

INT NOT NULL

1

目标声道数,必须大于 0。

返回类型: 音频波形 ROW。输入为 NULL 时返回 NULL

函数先转换声道,再使用 soxr HQ 重采样。多声道转单声道时取声道平均值;单声道转多声道时复制单声道;多声道转为其他多声道数量时,先混为单声道再复制。输出保留输入的 source_uristart_time_msend_time_ms

SELECT AUDIO_STANDARDIZE(AUDIO_DECODE(audio_bytes), 16000, 1)
FROM raw_audio;

AUDIO_RESAMPLE

只改变音频波形的采样率,保留声道数。

AUDIO_RESAMPLE(audio_input, sample_rate)

参数

类型

默认值

说明

audio_input

音频波形 ROW

必填

要重采样的音频波形。

sample_rate

INT NOT NULL

必填

目标采样率,必须大于 0。

返回类型: 音频波形 ROW。输入为 NULL 时返回 NULL

函数使用 soxr HQ 重采样,并把输出帧数调整为 ceil(输入帧数 × 目标采样率 / 输入采样率);必要时裁剪或补零。目标采样率等于输入采样率时,函数验证波形后原样返回。输出保留声道数和来源字段。

SELECT AUDIO_RESAMPLE(waveform, 8000)
FROM audio_waveforms;

AUDIO_CONCAT

按数组顺序拼接多个音频波形。

AUDIO_CONCAT(audio_inputs)

参数

类型

默认值

说明

audio_inputs

ARRAY<音频波形 ROW>

必填

非空的音频波形数组。

返回类型: 音频波形 ROW

  • 输入数组为 NULL 时返回 NULL,空数组抛出异常。

  • 所有波形必须具有相同的采样率、声道数和采样格式,并满足 float32、交错排列的波形约束。

  • 只有一个输入时,原样保留其来源 URI 和起止时间,包括只设置部分来源字段的情况。

  • 多个输入只有在 source_uri 全部相同、每段都有完整起止时间,并且后一段起点等于前一段终点时,才保留合并后的来源和起止时间;否则三个来源字段都置为 NULL

SELECT AUDIO_CONCAT(ARRAY[segment_1, segment_2]) AS combined
FROM audio_segments;