مرحباً بالجميع،
أنا أبني workflow في n8n لمشروع دراسي وأنا عالق في الخطوة الأخيرة من نسخ الصوت إلى نص.
الهدف هو:
استقبال رسالة صوتية من Telegram
تحميل الصوت باستخدام Telegram → Get a File (عبر file_id)
تحويل الصوت إلى نص (تحويل الكلام إلى نص)
إرسال النسخ إلى وكيل ذكاء اصطناعي
السؤال
ما هي الطريقة الموصى بها والموثوقة في n8n
أخذ رسالة صوتية من Telegram (.oga / opus)
إرسالها إلى API لتحويل الكلام إلى نص غير OpenAI (مثل Groq Whisper أو ما شابه)
والحصول على مخرجات نسخ مستقرة
أنا مهتم بشكل خاص بـ:
أفضل الممارسات للتعامل مع ملفات الصوت الثنائية من Telegram
ما إذا كان هناك قيود معروفة مع multipart/form-data في عقدة HTTP Request
حل بديل موصى به إذا كان التحميل الثنائي المباشر غير موثوق
أي نمط عمل أو workflow مثال سيكون موضع تقدير كبير
ما هي رسالة الخطأ (إن وجدت)؟
حيث أنا عالق
في هذه المرحلة:
Telegram → Get a File يعمل بشكل صحيح
أتلقى ملف الصوت الثنائي (.oga، audio/ogg)
يتعطل workflow عند محاولة إرسال هذا الملف إلى API Whisper/STT
لقد اختبرت عدة طرق:
عقدة HTTP Request مع Form-Data + ملف ثنائي
عقدة Code مع fetch + FormData
تعيينات ثنائية مختلفة في n8n
لكنني دائماً أحصل على أخطاء مثل:
file must be one of [flac mp3 mp4 mpeg mpga m4a ogg opus wav webm]
file not received
مشاكل multipart/form-data
طلب غير صحيح / bad request
في هذه النقطة، يمكنني تحميل الملف بنجاح، لكن لا يمكنني إرساله بشكل موثوق إلى API النسخ.
يرجى مشاركة workflow الخاص بك
workflow المتوقع (من الدرس التعليمي)
يقترح الدرس التعليمي الذي أتابعه:
Telegram → Get a File
OpenAI → Whisper → Transcribe a Recording
ربط مخرجات Whisper بوكيل AI
استخدم هذا التعبير في وكيل AI:
{{$json.message.text ?? $node["OpenAI"].json.text}}
حتى يتمكن الوكيل من التعامل مع:
رسائل نصية
نسخ الصوت
لكنني لا أستخدم OpenAI!!
أريد تجنب استخدام OpenAI (لأسباب التكلفة)، لذا أحاول استخدام حل بديل لتحويل الكلام إلى نص (مثل Groq Whisper API أو ما شابه).
أولاً، احذف عقدة Code التي تحتوي على fetch/FormData، فهي غير موثوقة للملفات الثنائية. استخدم عقدة 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 token.
ثانياً، خطأ “file must be one of” يتعلق باسم الملف وليس الصوت. يقرأ Whisper الصيغة من الامتداد، وTelegram يرسل .oga، وهو غير موجود في القائمة. غيّر اسم الملف للملف الثنائي ليكون امتداده .ogg وسيختفي هذا الخطأ.
ثم في عقدة 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 يكتشفان الصيغة من خلال امتداد FILENAME في التحميل multipart، وأداة Telegram “Get a File” تعطي البيانات الثنائية اسماً بدون امتداد قابل للاستخدام. إذاً أنت تُرسل البيانات بشكل صحيح، لكن API يرفضها لأن اسم الملف في الجزء ليس *.ogg. صحح اسم الملف وستعمل بدون الحاجة إلى تحويل.
الخطوة 1 - صحح اسم الملف الثنائي. مباشرة بعد Telegram → Get a File، أضف عقدة Code (Run Once for Each Item):
item.binary.data.fileName = 'audio.ogg';
item.binary.data.mimeType = 'audio/ogg';
return item;
```
(استخدم اسم الخاصية الثنائية الخاصة بك - عادةً ما تكون `data`).
الخطوة 2 - أرسل إلى Groq باستخدام عقدة HTTP Request (استخدم العقدة الأصلية، وليس عقدة Code + fetch - الأصلية تبني multipart بشكل صحيح):
- Method: POST
- URL: https://api.groq.com/openai/v1/audio/transcriptions
- Authentication → Generic → Header Auth: name `Authorization`, value `Bearer YOUR_GROQ_KEY`
- Send Body: ON, Body Content Type: Form-Data (multipart/form-data)
- Parameters:
- `file` → Parameter Type: n8n Binary File (الإصدارات الأقدم تسميها "Form Binary Data") → Input Data Field Name: `data`
- `model` → (form field) → 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.)
العوائق التي تسبب أخطاؤك بالضبط:
- "لم يتم استلام الملف" → معامل Form-Data يجب أن يكون من نوع Binary File وليس حقل نصي، واسم Input Field يجب أن يتطابق مع الخاصية الثنائية (`data`).
- "يجب أن يكون الملف من بين [...]" → امتداد اسم ملف فارغ/مفقود → إعادة تسمية عقدة Code تصلحه.
- لا تُعيّن رأس `Content-Type: multipart/...` يدوياً - دع n8n يعيّن الحدود تلقائياً؛ رأس يدوي يكسر الطلب.
مستقر على n8n cloud 2.23.x.
للتأكيد على ما شرحه @work6، هذا هو نمط العمل الكامل. شيء واحد يجب إضافته إذا كنت لا تزال تتلقى رسالة “لم يتم استقبال الملف” حتى بعد إعادة التسمية:
عقدة Get a File في Telegram أحياناً تُرجع application/octet-stream بدلاً من audio/ogg كنوع MIME. قد ترفض واجهة برمجة تطبيقات Groq هذا. أجبِر كلا الحقلين في عقدة 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…)، وهناك عقدة مجتمع: n8n-nodes-edenai. الجزء ذي الصلة بك: عقدة Expert Models الخاصة به تأخذ خاصية ثنائية مباشرة وتحمّل الملف لك — بدون Form-Data يدوي، بدون إعادة تسمية .oga، بدون “ملف لم يتم استقباله”.
وصفة سريعة:
Settings → Community Nodes → Installn8n-nodes-edenai (وأضف مفتاح Eden AI API كبيانات اعتماد).
Subfeature:speech to text (async) — إنها مهمة غير متزامنة، العقدة تصرف حتى تكتمل تلقائياً.
Input Type:File → File Source:Binary Property → وجهها إلى حقل Telegram الثنائي لديك (مثل data). هذا هو كل جزء “معالجة البيانات الثنائية”.
Provider: اختر أياً تفضل — Deepgram و Gladia سريعة/فعالة من حيث التكلفة، AssemblyAI قوية في الدقة + diarization. يمكنك تبديل المزودين من قائمة منسدلة بدون إعادة توصيل أي شيء.
(اختياري) عيّن بضعة Fallback Models في الخيارات، لذا إذا أخطأ مزودك الأساسي فإنه يحاول مرة أخرى مع المزود التالي — مفيد لنوع عدم الاستقرار 4xx الذي تواجهه.
يعود النص من عقدة الإخراج (لا حاجة للتعامل مع الاستجابة متعددة الأجزاء بنفسك).
في التكلفة، لأن هذا هو سببك الرئيسي للمغادرة عن OpenAI: يفرض Eden AI تسعير المزود المباشر — بدون علامة أسعار على سعر كل طلب. الهامش الوحيد هو ~5.5%، يُطبق عند إضافة الأرصدة. لذلك لن تتمكن من التغلب على Groq-direct في السعر الخام، لكنك تحصل على اختيار أرخص مزود لكل مهمة (Deepgram/Gladia تنافسية جداً) والتبديل بحرية من عقدة واحدة. الفائدة الحقيقية هنا هي القضاء على معالجة البيانات الثنائية/form-data + المرونة متعددة المزودين والتراجع. أنا سعيد بمشاركة JSON سير عمل مثال إذا كان مفيداً.