{"id":"wtRwIBJPAbnyUbe9","meta":{"instanceId":"c6db2bbd15df605c52b03ec6457f801cfcd738d259ddbb148b61be2fb93e4e29","templateCredsSetupCompleted":true},"name":"Only Onform submission_Two-Source Audio Transcription--> AI summary & Sentiment Analysis--> Gmail delivery","tags":[],"nodes":[{"id":"45c9716a-3d65-4fdc-bdc1-8feb130ecf38","name":"Wait","type":"n8n-nodes-base.wait","position":[-304,-240],"webhookId":"8796adc6-5f2b-4859-a62e-925c59adf474","parameters":{"amount":10},"typeVersion":1.1},{"id":"b1163157-dc8c-4573-a967-93a9dea55dcf","name":"If","type":"n8n-nodes-base.if","position":[64,-240],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"d49d90fa-7138-48b8-a149-7dfcc86a1dd9","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.status }}","rightValue":"completed"}]}},"typeVersion":2.2},{"id":"62aec10f-d637-4cbb-b457-f9bd7a086932","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-1264,-144],"parameters":{"color":4,"width":736,"height":432,"content":"### Execution flow Form submission + Local file\n#### Upload an audio file \n"},"typeVersion":1},{"id":"8b93808e-44cb-4f86-aac7-c8ead6cca669","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-384,-368],"parameters":{"color":2,"width":608,"height":352,"content":"### Generate Transcript from Voice to text"},"typeVersion":1},{"id":"bb2672af-35a4-4e59-8654-baba7b97d624","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[256,-368],"parameters":{"color":6,"width":608,"height":352,"content":"### Generate summary, Sentiment Analysis and send E-mail"},"typeVersion":1},{"id":"ea81f226-67de-4a39-92d8-bf315845cd28","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-992,-96],"parameters":{"color":5,"width":432,"height":272,"content":" ### Assembly AI\n"},"typeVersion":1},{"id":"d9e4b12c-80e2-480d-980d-379c751c9531","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[-160,-304],"parameters":{"color":5,"width":192,"height":224,"content":" ### Assembly AI\n"},"typeVersion":1},{"id":"f0d81a15-4490-47bf-8414-56c6348ec1bd","name":"Get Transcript","type":"n8n-nodes-base.httpRequest","position":[-96,-240],"parameters":{"url":"=https://api.assemblyai.com/v2/transcript/{{ $json.id }}","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"authorization","value":"<< PROVIDE YOUR ASSEMBLY API KEY >>"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2},{"id":"1957c1fe-7bc3-4db9-ab6e-f25daf24b5e7","name":"Transcript Analysis (AI)","type":"@n8n/n8n-nodes-langchain.openAi","position":[320,-256],"parameters":{"modelId":{"__rl":true,"mode":"id","value":"={{ \"gpt-4.1-mini\" }}"},"options":{},"messages":{"values":[{"content":"You are a precise meeting analyst. Output must be valid JSON only."},{"role":"system","content":"=Analyze the following transcript and return strict JSON:\n\nTranscript:\n{{ $node[\"Get Transcript\"].json[\"text\"] }}\n\nRequirements:\n- summary: 120–180 words, crisp and neutral\n- sentiment_label: one of [\"Positive\",\"Neutral\",\"Negative\"]\n- sentiment_score: number from -1 to 1\n- key_points: 5–8 bullet points (short phrases)\n- action_items: array of {owner, task, due?} if present, else []\n- notable_quotes: array of short verbatim quotes (<=120 chars)\n- topics: 3–6 tags\n\nReturn JSON with keys in snake_case:\n{\n  \"summary\": \"...\",\n  \"sentiment_label\": \"Positive\",\n  \"sentiment_score\": 0.64,\n  \"key_points\": [\"...\"],\n  \"action_items\": [{\"owner\":\"Alice\",\"task\":\"...\",\"due\":\"2025-09-30\"}],\n  \"notable_quotes\": [\"...\"],\n  \"topics\": [\"...\",\"...\"]\n}\nNo preamble or Markdown—JSON only."}]},"jsonOutput":true},"credentials":{"openAiApi":{"id":"abJxg6bdFN3Tv87x","name":"OpenAi account"}},"typeVersion":1.8},{"id":"6c2e15bf-ee10-43b0-befc-49001a41a9e6","name":"Send Analysis Email","type":"n8n-nodes-base.gmail","position":[512,-256],"webhookId":"176798ab-298e-4ea9-b5c7-cf72c212fbfa","parameters":{"sendTo":"=<< PROVIDE YOUR GMAIL ID >>","message":"={{\n(() => {\n  const d = $node[\"Transcript Analysis (AI)\"].json.message.content;\n\n  const row = (label, value, i) =>\n    `<tr style=\"background-color:${i % 2 === 0 ? '#f9f9f9' : '#ffffff'};\">\n       <td style=\"padding:12px 16px;border:1px solid #ccc;font-weight:bold;width:220px;background:#f2f2f2;\">${label}</td>\n       <td style=\"padding:12px 16px;border:1px solid #ccc;\">${value || ''}</td>\n     </tr>`;\n\n  const ul = arr => `<ul style=\"margin:0;padding-left:22px;\">${(arr || []).map(x => `<li>${x}</li>`).join('')}</ul>`;\n\n  const actions = (d.action_items || []).length\n    ? `<ol style=\"margin:0;padding-left:22px;\">${d.action_items.map(a =>\n        `<li><strong>${a.owner || '—'}</strong>: ${a.task || ''}${a.due ? ' (Due: ' + a.due + ')' : ''}</li>`\n      ).join('')}</ol>`\n    : \"No explicit action items detected.\";\n\n  let html = `\n  <div style=\"font-family:Arial,sans-serif;font-size:16px;line-height:1.5;\">\n    <h2 style=\"color:#2c3e50;border-bottom:2px solid #2c3e50;padding-bottom:6px;margin-bottom:12px;\">Transcript Analysis</h2>\n    <table style=\"border-collapse:collapse;border:1px solid #ccc;width:100%;font-size:16px;\">\n      <thead>\n        <tr style=\"background:#2c3e50;color:#ffffff;\">\n          <th style=\"padding:12px 16px;text-align:left;width:220px;\">Section</th>\n          <th style=\"padding:12px 16px;text-align:left;\">Details</th>\n        </tr>\n      </thead>\n      <tbody>\n        ${row(\"Executive Summary\", d.summary, 0)}\n        ${row(\"Sentiment\", `<strong>Label:</strong> ${d.sentiment_label || ''}<br/><strong>Score:</strong> ${d.sentiment_score ?? ''}`, 1)}\n        ${row(\"Key Points\", ul(d.key_points), 2)}\n        ${row(\"Action Items\", actions, 3)}\n        ${row(\"Notable Quotes\", ul(d.notable_quotes), 4)}\n        ${row(\"Topics\", (d.topics || []).join(\", \"), 5)}\n      </tbody>\n    </table>\n  </div>\n  `;\n\n  return html;\n})()\n}}\n","options":{},"subject":"=Transcript summary & sentiment – \n {{ $now.toISO() }} \n"},"credentials":{"gmailOAuth2":{"id":"Fy5fuwOcFQfLWPg8","name":"Gmail account"}},"typeVersion":2.1},{"id":"19968c49-4e8b-41e4-89f6-54460867dbff","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[-1248,-720],"parameters":{"color":3,"width":736,"height":528,"content":"### Execution flow Form submission + Google Drive link\n#### Receive Google Drive Link "},"typeVersion":1},{"id":"65a9f81c-f35a-445e-89d4-17388693fbef","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[-992,-448],"parameters":{"color":5,"width":448,"height":240,"content":" ### Assembly AI\n"},"typeVersion":1},{"id":"30f56c7f-ede6-4037-bce3-a5c43227e28f","name":"The End","type":"n8n-nodes-base.noOp","position":[704,-256],"parameters":{},"typeVersion":1},{"id":"00ade2c9-7a3e-4e92-abff-342c71c0bc8f","name":"Extract File ID from Link","type":"n8n-nodes-base.code","position":[-1040,-592],"parameters":{"jsCode":"const link =\n  $json['Provide the URL/Link of the audio file'] ||\n  $json.drive_link ||\n  '';\n\nconst m = link.match(/(?:\\/d\\/|id=)([A-Za-z0-9_-]{20,})/);\nif (!m) {\n  throw new Error('Could not extract Google Drive file ID from the form field.');\n}\n\nreturn [{ fileId: m[1] }];\n"},"typeVersion":2},{"id":"9b86268c-57e6-4778-981b-f55d587be75d","name":"Fetch File from Google Drive","type":"n8n-nodes-base.googleDrive","position":[-784,-592],"parameters":{"fileId":{"__rl":true,"mode":"id","value":"={{ $json.fileId }}"},"options":{"binaryPropertyName":"file"},"operation":"download"},"credentials":{"googleDriveOAuth2Api":{"id":"RVWXcWPinJDBkS1P","name":"<< PROVIDE THE DRIVE NAME >>"}},"typeVersion":3},{"id":"504cfac0-19d2-4d0a-b7e8-97be9f450212","name":"Upload File to AssemblyAI","type":"n8n-nodes-base.httpRequest","position":[-928,-368],"parameters":{"url":"https://api.assemblyai.com/v2/upload","method":"POST","options":{},"sendBody":true,"contentType":"binaryData","sendHeaders":true,"headerParameters":{"parameters":[{"name":"authorization","value":"<< PROVIDE YOUR ASSEMBLY API KEY >>"}]},"inputDataFieldName":"file"},"typeVersion":4.2},{"id":"2b514d7f-49b2-4e82-aaa9-6ead8b7154bf","name":"Upload Audio file to Assembly AI1","type":"n8n-nodes-base.httpRequest","position":[-944,-64],"parameters":{"url":"https://api.assemblyai.com/v2/upload","method":"POST","options":{},"sendBody":true,"contentType":"binaryData","sendHeaders":true,"headerParameters":{"parameters":[{"name":"authorization","value":"<< PROVIDE YOUR ASSEMBLY API KEY >>"},{"name":"Content-Type","value":"application/json"}]},"inputDataFieldName":"Upload_file"},"typeVersion":4.2},{"id":"25c8cc0e-f416-4d3b-b0e6-e96388cff8e8","name":"Request Transcript from AssemblyAI","type":"n8n-nodes-base.httpRequest","position":[-688,-368],"parameters":{"url":"https://api.assemblyai.com/v2/transcript","method":"POST","options":{},"jsonBody":"={\n  \"audio_url\": \"{{$json.upload_url}}\",\n  \"speaker_labels\": false,\n  \"auto_highlights\": true,\n  \"punctuate\": true\n}\n","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"authorization","value":"<< PROVIDE YOUR ASSEMBLY API KEY >>"}]}},"typeVersion":4.2},{"id":"78b5a8c9-8f58-41c1-bcee-b149a183d1c0","name":"Request Transcript from AssemblyAI1","type":"n8n-nodes-base.httpRequest","position":[-704,-64],"parameters":{"url":"https://api.assemblyai.com/v2/transcript","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"audio_url","value":"={{ $json.upload_url }}"}]},"headerParameters":{"parameters":[{"name":"authorization","value":"<< PROVIDE YOUR ASSEMBLY API KEY >>"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2},{"id":"9fac3888-e100-4d1c-8af7-9764a930177f","name":"Audio_on form submission","type":"n8n-nodes-base.formTrigger","position":[-1232,-592],"webhookId":"5fcc6c50-5848-4f95-9cac-dc750a25dcc7","parameters":{"options":{},"formTitle":"Upload your Audio file","formFields":{"values":[{"fieldLabel":"Name of the Audio file","requiredField":true},{"fieldLabel":"Provide the URL/Link of the audio file","requiredField":true},{"fieldType":"email","fieldLabel":"E-mail","placeholder":"abc@gmail.com","requiredField":true}]},"formDescription":"The audio file will be transcribed, Analysed and summarised. "},"typeVersion":2.3},{"id":"6faa3fbf-269b-4bd3-9ff3-633ba4e88603","name":"Audio_on form submission1","type":"n8n-nodes-base.formTrigger","position":[-1216,48],"webhookId":"ee0a5a6c-d73e-42e1-8f45-91c56db65f69","parameters":{"options":{},"formTitle":"Upload your Audio file","formFields":{"values":[{"fieldLabel":"Name of the Audio file","requiredField":true},{"fieldType":"file","fieldLabel":"Upload file","requiredField":true,"acceptFileTypes":"e.g .MP4"},{"fieldType":"email","fieldLabel":"E-mail","placeholder":"abc@gmail.com","requiredField":true}]},"formDescription":"The audio file will be transcribed, Analysed and summarised. "},"typeVersion":2.3},{"id":"28b5a48c-2a91-4583-bd8a-aae180890768","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-2016,-752],"parameters":{"width":656,"height":1200,"content":"# Try It Out!\n\nThis n8n template demonstrates how to use AI to transform audio files into **actionable insights**.  \nIt supports both **local file uploads** and **Google Drive links**.  \n\n## How it works\n\n- Users upload an audio file **via form** or provide a **Google Drive link**  \n- Files are passed to **AssemblyAI** for transcription  \n- AssemblyAI converts audio → text with punctuation and highlights  \n- A loop with **Wait + If** ensures the transcript is ready before moving forward  \n- Transcript text is passed to **OpenAI** (via n8n LangChain)  \n- OpenAI generates a **structured summary** including:  \n  - Executive summary  \n  - Sentiment label + score  \n  - Key points and highlights  \n  - Action items (if detected)  \n  - Notable quotes  \n  - Topics  \n- The AI output is formatted into a **rich HTML email**  \n- Gmail node sends the email to the provided recipient  \n- The workflow ends with a clean, structured delivery  \n\n---\n\n## How to use\n\n- Replace the **manual trigger** with your own (e.g., webhook or form submission)  \n- Provide either a **local audio file** or a **Google Drive link**  \n- Ensure AssemblyAI and Gmail credentials are set in n8n  \n- Run the workflow end-to-end to generate insights  \n- Check your email inbox for the **analysis report**  \n- Use it for meetings, lectures, or podcasts instantly  \n\n---\n\n## Requirements\n\n- n8n instance with HTTP + Gmail integration  \n- **AssemblyAI account** for transcription  \n- **OpenAI account** (or equivalent LLM integration) for analysis  \n- Google Drive (optional, if using Drive links)  \n\n---\n\n## Need Help?\n\n- Join the [n8n Forum](https://community.n8n.io)  \n- Or connect with the n8n Discord community  \n\nHappyAutomating !!! \n"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"719df1dc-95af-42bb-9cca-3a83b2f4b6b6","connections":{"If":{"main":[[{"node":"Transcript Analysis (AI)","type":"main","index":0}],[{"node":"Wait","type":"main","index":0}]]},"Wait":{"main":[[{"node":"Get Transcript","type":"main","index":0}]]},"Get Transcript":{"main":[[{"node":"If","type":"main","index":0}]]},"Send Analysis Email":{"main":[[{"node":"The End","type":"main","index":0}]]},"Audio_on form submission":{"main":[[{"node":"Extract File ID from Link","type":"main","index":0}]]},"Transcript Analysis (AI)":{"main":[[{"node":"Send Analysis Email","type":"main","index":0}]]},"Audio_on form submission1":{"main":[[{"node":"Upload Audio file to Assembly AI1","type":"main","index":0}]]},"Extract File ID from Link":{"main":[[{"node":"Fetch File from Google Drive","type":"main","index":0}]]},"Upload File to AssemblyAI":{"main":[[{"node":"Request Transcript from AssemblyAI","type":"main","index":0}]]},"Fetch File from Google Drive":{"main":[[{"node":"Upload File to AssemblyAI","type":"main","index":0}]]},"Upload Audio file to Assembly AI1":{"main":[[{"node":"Request Transcript from AssemblyAI1","type":"main","index":0}]]},"Request Transcript from AssemblyAI":{"main":[[{"node":"Wait","type":"main","index":0}]]},"Request Transcript from AssemblyAI1":{"main":[[{"node":"Wait","type":"main","index":0}]]}}}