AI_TRANSCRIBE 是 Hologres 提供的語音轉文本 AI 函數,支援將音頻檔案轉換為結構化文本資料。該函數基於阿里雲百鍊(Bailian)語音辨識模型,提供多種時間粒紋切分模式,滿足不同業務情境需求。
適用情境
會議記錄轉錄:將會議錄音轉換為文本,便於存檔和檢索。
字幕產生:以句子為粒度切分,產生帶時間戳記的字幕檔案。
說話人分離:識別多說話人音頻中的不同說話者,適用於會議紀要。
語音搜尋:精確到詞的時間戳記,實現音視頻內容的精準搜尋。
語言學習:逐詞回放、跟讀練習,支援語言學習產品。
使用限制
Hologres V4.2 及以上版本。
已配置 OSS 存取權限(如需訪問 OSS 音頻檔案)。
在 Hologres 控制台已添加語音辨識模型,詳見託管模型。按照託管模型部署流程在控制台部署模型即可。
函數文法
AI_TRANSCRIBE(model, audio_file [, options])參數說明
參數 | 資料類型 | 是否必填 | 說明 |
model | TEXT | 是 | 模型名稱,需要先在Hologres控制台部署模型,詳見託管模型。 |
audio_file | FILE | 是 | 音頻檔案,通過 |
options | JSONB | 否 | 配置選項,必須顯式使用 |
options 參數
參數 | 資料類型 | 預設值 | 說明 |
timestamp_granularity | TEXT | 'none' | 時間粒紋模式:'none'、'sentence'、'speaker'、'word'。 |
時間粒紋模式
timestamp_granularity 參數支援以下取值:
none(預設):將音頻檔案轉換為一段完整的長文本,適用於 RAG 情境。輸出包含
text和duration欄位。sentence:以句子為粒度切分識別結果,適用於字幕產生。輸出包含
segments數組,每項含start、end、text欄位。speaker:說話人分離模式,識別不同說話者,適用於會議紀要。輸出包含
segments數組,每項額外含speaker_id欄位。word:精確到每個詞的時間戳記,適用於音視頻搜尋和語言學習。輸出包含
segments數組,每項含單詞級start、end、text欄位。
options 參數必須顯式使用 ::jsonb 類型轉換,否則會報函數歧義錯誤。
正確樣本:
SELECT AI_TRANSCRIBE('fun_asr', file, '{"timestamp_granularity": "sentence"}'::jsonb);錯誤樣本(缺少 ::jsonb):
SELECT AI_TRANSCRIBE('fun_asr', file, '{"timestamp_granularity": "sentence"}');
-- 錯誤資訊:function ai_transcribe(unknown, file, unknown) is not unique使用樣本
以下樣本中使用的音頻檔案來自 AliMeeting 開源會議語音資料集。您需要將樣本中的 OSS 路徑、Endpoint 和 RAM 角色 ARN 替換為實際值。
樣本中使用 oss-cn-beijing-internal.aliyuncs.com 作為 OSS Endpoint,因為 FunASR 模型服務部署在 cn-beijing 地區。使用內網 Endpoint 時,OSS Bucket 需與模型服務在同一地區。
樣本1:基礎轉錄(none模式)
SELECT AI_TRANSCRIBE(
'fun_asr',
TO_FILE(
'oss://xxxx/audio/alimeeting_audio/R8003_M8001_N_SPK8002.wav',
'oss-cn-beijing-internal.aliyuncs.com',
'acs:ram::xxx:role/xxxx'
)
);返回結果:
{
"text": "那個就是你找我是什麼事啊?小蔣是這樣的,呃今天叫你過來就是關於留學生交流會這個流程,呃就是說看你有什麼想法怎麼規劃的,我們彼此交流一下。",
"duration": 15.2
}樣本2:句子級切分(sentence模式)
SELECT AI_TRANSCRIBE(
'fun_asr',
TO_FILE(
'oss://xxxx/audio/alimeeting_audio/R8003_M8001_N_SPK8002.wav',
'oss-cn-beijing-internal.aliyuncs.com',
'acs:ram::xxx:role/xxxx'
),
'{"timestamp_granularity": "sentence"}'::jsonb
);返回結果:
{
"duration": 15.2,
"segments": [
{"start": 0.16, "end": 3.48, "text": "那個就是你找我是什麼事啊?"},
{"start": 3.72, "end": 15.04, "text": "小蔣是這樣的,呃今天叫你過來就是關於留學生交流會這個流程,呃就是說看你有什麼想法怎麼規劃的,我們彼此交流一下。"}
]
}樣本3:說話人分離(speaker模式)
SELECT AI_TRANSCRIBE(
'fun_asr',
TO_FILE(
'oss://xxxx/audio/alimeeting_audio/R8007_M8010_N_SPK8054.wav',
'oss-cn-beijing-internal.aliyuncs.com',
'acs:ram::xxx:role/xxxx'
),
'{"timestamp_granularity": "speaker"}'::jsonb
);返回結果:
{
"duration": 45.6,
"segments": [
{"start": 0.5, "end": 8.2, "speaker_id": 0, "text": "大家好,今天我們討論一下專案進度。"},
{"start": 8.5, "end": 20.3, "speaker_id": 1, "text": "好的,我這邊前端開發已經完成了80%,預計下周可以聯調。"},
{"start": 20.8, "end": 35.1, "speaker_id": 0, "text": "後端進度怎麼樣?能跟上嗎?"},
{"start": 35.5, "end": 45.2, "speaker_id": 2, "text": "後端介面已經準備好了,等前端聯調。"}
]
}樣本4:詞級時間戳記(word模式)
SELECT AI_TRANSCRIBE(
'fun_asr',
TO_FILE(
'oss://xxxx/audio/alimeeting_audio/R8003_M8001_N_SPK8002.wav',
'oss-cn-beijing-internal.aliyuncs.com',
'acs:ram::xxx:role/xxxx'
),
'{"timestamp_granularity": "word"}'::jsonb
);返回結果(部分):
{
"duration": 15.2,
"segments": [
{"start": 0.16, "end": 0.52, "text": "那個"},
{"start": 0.52, "end": 0.88, "text": "就是"},
{"start": 0.88, "end": 1.24, "text": "你"},
{"start": 1.24, "end": 1.60, "text": "找"},
{"start": 1.60, "end": 1.96, "text": "我"},
{"start": 1.96, "end": 2.32, "text": "是"},
{"start": 2.32, "end": 2.68, "text": "什麼"},
{"start": 2.68, "end": 3.04, "text": "事"},
{"start": 3.04, "end": 3.48, "text": "啊"}
]
}樣本5:結合 Object Table 批量轉錄
-- 建立 Object Table
CREATE OBJECT TABLE audio_files WITH (
path = 'oss://xxxx/audio/alimeeting_audio/',
oss_endpoint = 'oss-cn-beijing-internal.aliyuncs.com',
role_arn = 'acs:ram::xxx:role/xxxx'
);
-- 重新整理 Object Table
REFRESH OBJECT TABLE audio_files;
-- 轉錄所有音頻檔案
SELECT
object_uri,
AI_TRANSCRIBE('fun_asr', file, '{"timestamp_granularity": "sentence"}'::jsonb) AS transcription
FROM audio_files
LIMIT 2;返回結果:
object_uri | transcription
-----------------------------+--------------------------------------------------------------
R8003_M8001_N_SPK8002.wav | {"duration": 15.2, "segments": [{"start": 0.16, "end": 3.48, "text": "那個就是你找我是什麼事啊?"}, {"start": 3.72, "end": 15.04, "text": "小蔣是這樣的,呃今天叫你過來就是關於留學生交流會這個流程,呃就是說看你有什麼想法怎麼規劃的,我們彼此交流一下。"}]}
R8007_M8010_N_SPK8054.wav | {"duration": 45.6, "segments": [{"start": 0.5, "end": 8.2, "text": "大家好,今天我們討論一下專案進度。"}, {"start": 8.5, "end": 20.3, "text": "好的,我這邊前端開發已經完成了80%,預計下周可以聯調。"}]}
(2 rows)樣本6:結合 Dynamic Table 實現音頻自動增量轉錄
使用 Dynamic Table 增量重新整理模式處理音頻檔案,實現音頻檔案的增量處理,有效降低資源消耗,廣泛適用於大規模音頻處理的情境例如客服互動、智能駕駛中人機互動音頻等。
-- 建立 Object Table
CREATE OBJECT TABLE audio_files WITH (
path = 'oss://xxxx/audio/alimeeting_audio/',
oss_endpoint = 'oss-cn-beijing-internal.aliyuncs.com',
role_arn = 'acs:ram::xxx:role/xxxx'
);
-- 重新整理 Object Table
REFRESH OBJECT TABLE audio_files;
-- 建立 Dynamic Table 自動轉錄新檔案
CREATE DYNAMIC TABLE audio_transcriptions
WITH (freshness = '10 minutes')
AS SELECT
object_uri,
AI_TRANSCRIBE('fun_asr', file, '{"timestamp_granularity": "sentence"}'::jsonb) AS transcription
FROM audio_files;
-- 等待自動重新整理或手動觸發
REFRESH DYNAMIC TABLE audio_transcriptions;
-- 查詢轉錄結果
SELECT
object_uri,
transcription->>'duration' AS duration,
(jsonb_array_elements(transcription->'segments'))->>'start' AS start_time,
(jsonb_array_elements(transcription->'segments'))->>'end' AS end_time,
(jsonb_array_elements(transcription->'segments'))->>'text' AS text
FROM audio_transcriptions
WHERE transcription->'segments' IS NOT NULL
LIMIT 10;查詢轉錄結果樣本:
object_uri | duration | start_time | end_time | text
-----------------------------+----------+------------+----------+--------------------------------------------
R8003_M8001_N_SPK8002.wav | 15.2 | 0.16 | 3.48 | 那個就是你找我是什麼事啊?
R8003_M8001_N_SPK8002.wav | 15.2 | 3.72 | 15.04 | 小蔣是這樣的,呃今天叫你過來就是關於留學生交流會這個流程,呃就是說看你有什麼想法怎麼規劃的,我們彼此交流一下。
R8007_M8010_N_SPK8054.wav | 45.6 | 0.5 | 8.2 | 大家好,今天我們討論一下專案進度。
R8007_M8010_N_SPK8054.wav | 45.6 | 8.5 | 20.3 | 好的,我這邊前端開發已經完成了80%,預計下周可以聯調。
(4 rows)