Telegram 語音訊息 → Whisper API 在 n8n 中因二進位/表單資料問題失敗(無 OpenAI 替代方案)

描述問題/錯誤/問題

大家好,
我正在 n8n 中為一個課程專案構建工作流程,但卡在音頻轉錄的最後一步。
目標是:

  • 從 Telegram 接收語音訊息
  • 使用 Telegram → Get a File(透過 file_id)下載音頻
  • 將音頻轉換為文字(語音轉文字)
  • 將轉錄內容發送給 AI Agent

問題
在 n8n 中推薦且可靠的方式是什麼:
:backhand_index_pointing_right: 取得 Telegram 語音訊息(.oga / opus)
:backhand_index_pointing_right: 將其發送給非 OpenAI 的語音轉文字 API(例如 Groq Whisper 或類似服務)
:backhand_index_pointing_right: 獲得穩定的轉錄輸出

特別關注:
處理 Telegram 二進制音頻文件的最佳實踐
HTTP Request 節點中 multipart/form-data 是否存在已知限制
如果直接二進制上傳不可靠,推薦的解決方案
任何可行的模式或示例工作流程將非常感謝 :folded_hands:

錯誤訊息是什麼(如果有)?

我卡住的地方

在此階段:

  • Telegram → Get a File 正常運作
  • 我收到了二進制音頻文件(.ogaaudio/ogg
  • 當嘗試將此文件發送到 Whisper/STT API 時,工作流程中斷

我測試了多種方法:

  • 帶有 Form-Data + 二進制文件的 HTTP Request 節點
  • 使用 fetch + FormData 的 Code 節點
  • n8n 中的不同二進制映射

但我總是得到以下錯誤:

  • file must be one of [flac mp3 mp4 mpeg mpga m4a ogg opus wav webm]
  • file not received
  • multipart/form-data 問題
  • 無效的請求 / 錯誤的請求

此時,我能成功下載文件,但無法可靠地將其發送到轉錄 API。

請分享您的工作流程

預期工作流程(來自教程)
我遵循的教程建議:
Telegram → Get a File
OpenAI → Whisper → Transcribe a Recording
將 Whisper 輸出連接到 AI Agent

在 AI Agent 中使用此表達式:
{{$json.message.text ?? $node["OpenAI"].json.text}}

因此 Agent 可以處理:
文字訊息
音頻轉錄

但我不使用 OpenAI!!
我想避免使用 OpenAI(出於成本考量),所以我嘗試使用替代的語音轉文字解決方案(例如 Groq Whisper API 或類似服務)。

分享最後一個節點返回的輸出

關於您的 n8n 設置的信息

  • n8n 版本: 2.23.4
  • 資料庫(預設值:SQLite): 預設
  • n8n EXECUTIONS_PROCESS 設置(預設值:own、main): 預設
  • 透過以下方式執行 n8n(Docker、npm、n8n cloud、desktop app): web
  • 作業系統: 雲端(非自託管)

@SilvyElba,歡迎!

這裡有兩個可以修復的問題。

首先,刪除帶有 fetch/FormData 的 Code 節點,它對二進制數據很容易出問題。改用 HTTP Request 節點:將 Body 設定為 Form-Data,添加一個名為 file 的參數,類型設為 n8n Binary File,並將 Input Data Field Name 設定為你的二進制屬性,通常是 data。添加一個 model 欄位,設定為 whisper-large-v3,並將其指向 Groq 的端點 https://api.groq.com/openai/v1/audio/transcriptions,使用 Bearer 令牌標頭。

其次,「file must be one of」錯誤是關於檔案名稱,而不是音頻。Whisper 從副檔名讀取格式,而 Telegram 發送的是 .oga,這不在列表中。將二進制檔案的檔案名稱改為以 .ogg 結尾,這個錯誤就會消除。

若要具體處理重新命名,請在「Telegram Get a File」步驟之後新增一個 Code 節點:

const binary = $input.first().binary;
binary.data.fileName = binary.data.fileName.replace('.oga', '.ogg');
return $input.first();

然後在「HTTP Request」節點中,將 Body 設定為「Form-Data」,新增一個 file 參數,型態設為「n8n Binary File」,Input Data Field Name = data,並新增 model 作為字串欄位,設定為 whisper-large-v3。這個組合與 Groq 的端點搭配使用時,效果相當穩定。

好消息:你的檔案沒問題 - .oga 就是 ogg/opus,已經在允許清單裡了。「檔案必須是其中之一 […ogg opus…]」的錯誤信息會造成誤導:Groq/OpenAI Whisper 是從多部分上傳中的檔名副檔名偵測格式,而 Telegram 的「取得檔案」給出的二進制檔案名稱沒有可用的副檔名。所以你傳送位元組是正確的,但 API 拒絕了,因為該部分的檔名不是 *.ogg。修正檔名就能運作 - 不需要轉換。

步驟 1 - 修正二進制檔名。就在 Telegram → 取得檔案之後,加上一個代碼節點(為每個項目執行一次):

item.binary.data.fileName = 'audio.ogg';
item.binary.data.mimeType = 'audio/ogg';
return item;
```

(使用你的二進制屬性名稱 - 通常是 `data`)。

步驟 2 - 用 HTTP Request 節點傳送到 Groq(使用原生節點,不要用代碼節點 + fetch - 原生節點能正確構建多部分格式):
- 方法:POST
- URL:https://api.groq.com/openai/v1/audio/transcriptions
- 驗證 → 通用 → 標題驗證:名稱 `Authorization`,值 `Bearer YOUR_GROQ_KEY`
- 傳送主體:開啟,主體內容類型:表單資料 (multipart/form-data)
- 參數:
  - `file` → 參數類型:n8n 二進制檔案(舊版本稱為「表單二進制資料」)→ 輸入資料欄位名稱:`data`
  - `model` → (表單欄位)→ whisper-large-v3(或 whisper-large-v3-turbo)
  - 可選 `response_format` → json

就這樣。Groq 相容 OpenAI、速度快,還有寬鬆的免費額度 - 完美避免 OpenAI 的成本。

步驟 3 - AI Agent 表達式,只要替換節點名稱:
`{{ $json.message.text ?? $node["HTTP Request"].json.text }}`
(Groq 在 `.text` 中傳回轉錄,形狀與 OpenAI 相同。)

導致你確切錯誤的陷阱:
- 「未收到檔案」→ 表單資料參數必須是二進制檔案類型,不是文字欄位,且輸入欄位名稱必須符合二進制屬性(`data`)。
- 「檔案必須是其中之一 [...]」→ 缺少/空白的檔名副檔名 → 代碼節點重新命名可修正。
- 不要手動設定 `Content-Type: multipart/...` 標題 - 讓 n8n 自動設定邊界;手動設定會破壞請求。

在 n8n cloud 2.23.x 上穩定運作。````

為確認 @work6 所說的內容,那就是完整的工作流程。如果即使在重新命名後仍然收到「檔案未收到」的錯誤,有一點要補充:

Telegram 的 Get a File 節點有時會將 MIME 類型返回為 application/octet-stream,而不是 audio/ogg。Groq 的 API 可能會拒絕這個。在您的 Code 節點中強制設定這兩個欄位:

item.binary.data.fileName = 'audio.ogg';

@Work6 已經包含了這一點,只是確保不會被跳過,因為這很容易被忽略。

另外對於 AI Agent 運算式,如果您的 HTTP Request 節點有自訂名稱,請相應地更新它。

@SilvyElba — 那個 .oga + 手動 multipart/form-data 的舞蹈確實是走原始 HTTP Request 路線最痛苦的部分。上面的 .oga → .ogg 重新命名 + Form-Data 修正如果你想留在 Groq 上是很可靠的。

如果你願意試試一個託管的多供應商選項,能完全避開二進位管道的複雜性,這裡有另一個角度。

披露:我在 Eden AI 工作,所以把這當作眾多選項中的一個 — 但它解決了你確切的痛點,所以我覺得值得分享。

Eden AI 是一個聚合器(在 Deepgram、AssemblyAI、Gladia、Amazon、Google、Whisper… 前面用一個 API/金鑰),而且有一個社群節點:n8n-nodes-edenai。對你來說相關的部分:它的 Expert Models 節點直接接受二進位屬性並為你上傳檔案 — 沒有手動 Form-Data、沒有 .oga 重新命名、沒有「檔案未收到」。

快速步驟:

  1. Settings → Community Nodes → Install n8n-nodes-edenai(並將你的 Eden AI API 金鑰新增為認證)。
  2. Telegram TriggerTelegram (Get File) 這樣你就有二進位格式的語音檔案。
  3. Eden AI – Expert Models 節點:
    • Feature: audio
    • Subfeature: speech to text (async) — 這是一個非同步任務,節點會自動輪詢直到完成。
    • Input Type: FileFile Source: Binary Property → 指向你的 Telegram 二進位欄位(例如 data)。那就是整個「二進位處理」部分。
    • Provider: 選你喜歡的 — Deepgram 和 Gladia 速度快、成本效益高,AssemblyAI 在準確性 + 說話者分離上表現強勁。你可以從下拉選單切換供應商,不需要重新配置。
  4. (選擇性)在 Options 中設定幾個 Fallback Models,這樣如果你的主要供應商出錯就會用下一個重試 — 對於你遇到的那種 4xx 間歇性故障很有幫助。

轉錄結果會在節點輸出中回傳(不需要自己處理 multipart 回應)。

關於成本,既然那是你離開 OpenAI 的主要原因:Eden AI 收取供應商直通定價 — 在每個請求的價格上沒有加價。唯一的利潤是在你儲值時收取 ~5.5%。所以你不會在原始價格上打敗 Groq 直接購買,但你確實可以為每個任務選擇最便宜的供應商(Deepgram/Gladia 很有競爭力)並從一個節點自由切換。真正的好處在這裡是消除了二進位/form-data 的複雜性 + 多供應商的靈活性和回退。如果有用的話很樂意分享一個工作流 JSON 範例。