๐๏ธ VoiceScribe AI: OpenAI Whisper๋ฅผ ์ฌ์ฉํ Telegram ์ค๋์ค ๋ฉ์์ง ์๋ ์ ์ฌ
์ด๊ฒ์Document Extraction, Multimodal AI๋ถ์ผ์์๋ํ ์ํฌํ๋ก์ฐ๋ก, 19๊ฐ์ ๋ ธ๋๋ฅผ ํฌํจํฉ๋๋ค.์ฃผ๋ก If, Code, Merge, Telegram, GoogleDrive ๋ฑ์ ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ฉฐ. OpenAI Whisper ๋ฐ Google Workspace๋ฅผ ์ฌ์ฉํ์ฌ Telegram ์์ฑ ๋ฉ์์ง ์๋ ์ ์ฌ
- โขTelegram Bot Token
- โขGoogle Drive API ์ธ์ฆ ์ ๋ณด
- โขGoogle Sheets API ์ธ์ฆ ์ ๋ณด
- โขOpenAI API Key
์ฌ์ฉ๋ ๋ ธ๋ (19)
์นดํ ๊ณ ๋ฆฌ
{
"id": "Jd7X52ywyO4xTZoE",
"meta": {
"instanceId": "4a2e6764ba7a6bc9890d9225f4b21d570ce88fc9bd57549c89057fcee58fed0f",
"templateId": "2465",
"templateCredsSetupCompleted": true
},
"name": "๐๏ธ VoiceScribe AI: Telegram Audio Message Auto Transcription with OpenAI Whisper",
"tags": [
{
"id": "84SlSTthTSHRbFGM",
"name": "Telegram",
"createdAt": "2025-08-05T06:23:21.764Z",
"updatedAt": "2025-08-05T06:23:21.764Z"
},
{
"id": "nyc9wEV6N1lqPyOk",
"name": "Operations",
"createdAt": "2025-08-07T05:47:09.931Z",
"updatedAt": "2025-08-07T05:47:09.931Z"
},
{
"id": "ow6eIe95VK6fRkyw",
"name": "Chatbot",
"createdAt": "2025-08-05T06:23:11.231Z",
"updatedAt": "2025-08-05T06:23:11.231Z"
}
],
"nodes": [
{
"id": "638b4ba9-c381-44d4-9245-c5d4964371f7",
"name": "์ง์๋์ง ์๋ ๋ฉ์์ง ์ ํ",
"type": "n8n-nodes-base.telegram",
"position": [
1312,
2480
],
"webhookId": "344e09e1-f90a-4181-b88d-eba8a1729454",
"parameters": {
"text": "=Sorry, I canโt read your input right now.\nPlease send me a voice message, and Iโll help you transcribe and track it! ๐๏ธ๐ฌ",
"chatId": "={{ $('Telegram Voice Message Trigger').item.json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"id": "paNoPvnV5Wzt4Lhv",
"name": "Telegram account"
}
},
"typeVersion": 1.2
},
{
"id": "779f89de-cf46-467c-829e-48ef902f2e88",
"name": "์คํฐ์ปค ๋ฉ๋ชจ",
"type": "n8n-nodes-base.stickyNote",
"position": [
-800,
1648
],
"parameters": {
"width": 1232,
"height": 2032,
"content": "# ๐๏ธ VoiceScribe AI: Telegram Audio Message Auto Transcription with OpenAI Whisper\n> Automatically transcribe Telegram voice messages and store them as structured logs in Google Sheets, while backing up the audio in Google Drive.\n\n## ๐งโ๐ผ Whoโs it for\n\n- Journalists, content creators, or busy professionals who often record voice memos or short interviews on the go.\n- Anyone who wants to turn voice recordings into searchable, structured notes.\n\n## โ๏ธ How it works / What it does\n\n1. User sends a voice message to a Telegram bot.\n2. n8n checks if the message is an audio voice note.\n3. If valid, it downloads the audio file and:\n - Transcribes it using OpenAI Whisper (or your LLM of choice).\n - Uploads the original audio to Google Drive for safekeeping.\n4. The transcript and audio metadata are merged.\n5. The workflow:\n - Logs the data into a Google Sheet.\n - Sends a formatted confirmation message to the user via Telegram.\n\nIf the input is not audio, the bot politely informs the user that only voice messages are accepted.\n\n## โ
Features\n\n- Accepts only Telegram voice messages.\n- Transcribes via OpenAI Whisper.\n- Logs DateTime, Duration, Transcript, and Audio URL to Google Sheets.\n- Sends user feedback message via Telegram with download + transcript link.\n\n## ๐ How to set up\n### Prerequisites\n\n- Telegram Bot connected to n8n (via Telegram Trigger)\n- Google Drive & Google Sheets credentials configured\n- OpenAI or Whisper API credentials (for transcription)\n\n### Steps\n\n1. **Telegram Trigger** \n Start the flow when a new message is sent to your bot.\n2. **Check Message Type** \n Use a conditional node to confirm it's a voice message.\n3. **Download Voice Message** \n Download the `.oga` file from Telegram.\n4. **Transcribe Audio** \n Send the binary audio to OpenAI Whisper or your transcription service.\n5. **Upload to Google Drive** \n Backup the original audio file.\n6. **Merge Outputs** \n Combine transcription with Drive metadata.\n7. **Transform to Row Format** \n Prepare structured JSON for Google Sheets.\n8. **Append to Google Sheet** \n Store the transcript log (DateTime, Duration, Transcript, AudioURL).\n9. **Send Confirmation to User** \n Inform the user via Telegram with their transcript and download link.\n10. **Unsupported Message Handler** \n Reply to users who send non-audio messages.\n\n## ๐ Example Output in Google Sheet\n\n| DateTime | Duration | Transcript | AudioURL |\n|-----------------------|----------|--------------------------------------------|------------------------------------------------------------|\n| 2025-08-07T13:12:19Z | 27 | Dแปฑ รกn Outlet Activation lร ... | https://drive.google.com/uc?id=xxxx&export=download |\n\n## ๐ง How to customize the workflow\n\n- Swap Whisper with Deepgram, AssemblyAI, or other providers.\n- Add speaker name detection or prompt-based tagging via GPT.\n- Route transcripts into Notion, Airtable, or CRM systems.\n- Add multi-language support or summarization steps.\n\n## ๐ฆ Requirements\n\n| Component | Required |\n|---------------------|----------|\n| Telegram API | โ
|\n| Google Drive API | โ
|\n| Google Sheets API | โ
|\n| OpenAI Whisper API | โ
|\n| n8n Cloud or Self-hosted | โ
|\n\nCreated with โค๏ธ using [n8n](https://n8n.io)"
},
"typeVersion": 1
},
{
"id": "505c0e4a-11e2-4a81-ac38-518af4cd3bf6",
"name": "์คํฐ์ปค ๋ฉ๋ชจ1",
"type": "n8n-nodes-base.stickyNote",
"position": [
2608,
2080
],
"parameters": {
"width": 752,
"height": 288,
"content": ""
},
"typeVersion": 1
},
{
"id": "3eacc0c8-6f65-47a9-9eaf-559d5c3c273d",
"name": "์คํฐ์ปค ๋ฉ๋ชจ5",
"type": "n8n-nodes-base.stickyNote",
"position": [
496,
2400
],
"parameters": {
"width": 304,
"height": 128,
"content": "### 1. ๐ฉ Telegram Trigger \n**Description**: Listens for incoming messages from the user via the connected Telegram bot. This is the entry point of the workflow."
},
"typeVersion": 1
},
{
"id": "b0d947b0-e970-43ea-8cc9-f3fc3b4f2d02",
"name": "์คํฐ์ปค ๋ฉ๋ชจ6",
"type": "n8n-nodes-base.stickyNote",
"position": [
992,
2544
],
"parameters": {
"width": 272,
"height": 144,
"content": "### 2. Is Audio Message? \n**Description**: Checks whether the incoming Telegram message is a audio message. If not, the workflow routes to an \"unsupported message type\" handler."
},
"typeVersion": 1
},
{
"id": "447bc7be-707d-4eed-b3c3-1c3bc48bb103",
"name": "์คํฐ์ปค ๋ฉ๋ชจ7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
2096
],
"parameters": {
"width": 544,
"height": 80,
"content": "### 3.1. Download audio message and transcript with OpenAI\n Send the binary audio to OpenAI Whisper or your transcription service."
},
"typeVersion": 1
},
{
"id": "938080c1-2503-4eb5-be21-32f732017869",
"name": "์คํฐ์ปค ๋ฉ๋ชจ8",
"type": "n8n-nodes-base.stickyNote",
"position": [
2048,
2080
],
"parameters": {
"width": 400,
"height": 80,
"content": "### 4.1. Inform user via telegram\nSend friendly message to user with audio download URL\n"
},
"typeVersion": 1
},
{
"id": "297f8859-a2bf-4a71-82f9-161841669418",
"name": "์คํฐ์ปค ๋ฉ๋ชจ9",
"type": "n8n-nodes-base.stickyNote",
"position": [
2112,
2560
],
"parameters": {
"width": 304,
"height": 96,
"content": "### 4.2 Transform & log expense\n- Transform the Output to Audio Record \n- Log Audio Record to Google Sheet \n\n"
},
"typeVersion": 1
},
{
"id": "53031e0c-a427-4023-b1f6-c0aae9b6ad4f",
"name": "์ค๋์ค ๋ฉ์์ง์ธ๊ฐ์?",
"type": "n8n-nodes-base.if",
"position": [
1088,
2384
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "069b1c3b-d683-46f2-b7d6-9dbcdde41445",
"operator": {
"type": "string",
"operation": "contains"
},
"leftValue": "={{ $json.message.toJsonString() }}",
"rightValue": "audio/ogg"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "1ecf333c-3dd2-44a9-b301-547391695613",
"name": "์ค๋์ค ๋ฉ์์ง ๋ค์ด๋ก๋",
"type": "n8n-nodes-base.telegram",
"position": [
1312,
2288
],
"webhookId": "b7eb04dc-b5db-4fbd-8ea6-7692282d9469",
"parameters": {
"fileId": "={{ $json.message.voice.file_id }}",
"resource": "file"
},
"credentials": {
"telegramApi": {
"id": "paNoPvnV5Wzt4Lhv",
"name": "Telegram account"
}
},
"typeVersion": 1.2
},
{
"id": "d61a14e8-9541-48be-95a0-5d4e5df85ff3",
"name": "๋
น์ ์ ์ฌํ๊ธฐ",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
1536,
2192
],
"parameters": {
"options": {},
"resource": "audio",
"operation": "transcribe"
},
"credentials": {
"openAiApi": {
"id": "PPSwAKeLQYgAPobT",
"name": "OpenAi account"
}
},
"typeVersion": 1.8
},
{
"id": "564864d4-4a40-4f1a-b99e-fd0c6981ef7c",
"name": "ํ์ผ ์
๋ก๋",
"type": "n8n-nodes-base.googleDrive",
"position": [
1536,
2384
],
"parameters": {
"name": "=audio-{{ $now.toFormat(\"yyyyLLdd-HHmmss\") }}-{{$binary.data.fileName}}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1ObNNVJFR2vcKqP8p-ZnX_eaZy4gBHgha",
"cachedResultUrl": "https://drive.google.com/drive/folders/1ObNNVJFR2vcKqP8p-ZnX_eaZy4gBHgha",
"cachedResultName": "SmartIT"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "fC471es5gk5Mm900",
"name": "Google Drive account"
}
},
"typeVersion": 3
},
{
"id": "59241354-ef2f-43aa-bf2a-bf394ace5907",
"name": "๋ณํฉ",
"type": "n8n-nodes-base.merge",
"position": [
1760,
2288
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "af081dde-eb7d-4a4f-ad6c-d28ffd1a81ab",
"name": "Telegram ์์ฑ ๋ฉ์์ง ํธ๋ฆฌ๊ฑฐ",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
864,
2384
],
"webhookId": "5cdd7f36-b2e3-4c8d-ab5f-1f2763eb5c75",
"parameters": {
"updates": [
"message"
],
"additionalFields": {
"download": true
}
},
"credentials": {
"telegramApi": {
"id": "paNoPvnV5Wzt4Lhv",
"name": "Telegram account"
}
},
"typeVersion": 1.2
},
{
"id": "348897c4-3baf-4564-ae4c-f956d98936b9",
"name": "์คํฐ์ปค ๋ฉ๋ชจ2",
"type": "n8n-nodes-base.stickyNote",
"position": [
2464,
2400
],
"parameters": {
"width": 1072,
"height": 272,
"content": ""
},
"typeVersion": 1
},
{
"id": "e8a585eb-1ed0-41c9-a2d8-25d62c12d387",
"name": "Telegram์ ํตํด ์ฌ์ฉ์ ์๋ฆผ",
"type": "n8n-nodes-base.telegram",
"position": [
2208,
2192
],
"webhookId": "e7e7cab6-27c6-4604-bab4-901873f55e24",
"parameters": {
"text": "=โ
Voice Transcription Complete\n\nYour voice recording (โฑ๏ธ {{ $json.Duration }} seconds, recorded at {{ $json.DateTime }}) has been successfully transcribed and securely stored.\n\n๐ Original audio stored here: {{ $json.AudioURL }}\n\nThank you for using VoiceScribe AI! ๐๏ธ",
"chatId": "={{ $json.ChatID }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"id": "paNoPvnV5Wzt4Lhv",
"name": "Telegram account"
}
},
"typeVersion": 1.2
},
{
"id": "1ecbac8a-2451-4856-8a96-f7d5b3dbcef5",
"name": "google ์ํธ์ ์์ฑ ๊ธฐ๋ก ์ ์ฅ",
"type": "n8n-nodes-base.googleSheets",
"position": [
2208,
2384
],
"parameters": {
"columns": {
"value": {},
"schema": [],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1a-u0XHQWjn4VKbq5WpvSJy5_JgHuFl5A2Q2TEBDC5bI/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1a-u0XHQWjn4VKbq5WpvSJy5_JgHuFl5A2Q2TEBDC5bI",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1a-u0XHQWjn4VKbq5WpvSJy5_JgHuFl5A2Q2TEBDC5bI/edit?usp=drivesdk",
"cachedResultName": "Audio Notes"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "L670Nly6gZGo71br",
"name": "Google Sheets account 2"
}
},
"typeVersion": 4.6
},
{
"id": "ef75b354-3db8-4536-afc9-4268395dff0a",
"name": "์์ฑ ๊ธฐ๋ก ์ถ๋ ฅ ๋ณํ",
"type": "n8n-nodes-base.code",
"position": [
1984,
2288
],
"parameters": {
"jsCode": "const inputs = $input.all();\n\n// Assumes: \n// inputs[0] = transcript\n// inputs[1] = drive metadata\n\nconst transcriptData = inputs[0].json;\nconst driveData = inputs[1].json;\n\nconst result = {\n DateTime: driveData.createdTime || '',\n Duration: transcriptData.usage?.seconds || '',\n Transcript: transcriptData.text || '',\n AudioURL: driveData.webContentLink || '',\n ChatID: $('Telegram Voice Message Trigger').first().json.message.chat.id\n};\n\nreturn [{ json: result }];"
},
"typeVersion": 2
},
{
"id": "7996b57e-fffb-4707-a338-8bf390ecd134",
"name": "์คํฐ์ปค ๋ฉ๋ชจ10",
"type": "n8n-nodes-base.stickyNote",
"position": [
1520,
2544
],
"parameters": {
"width": 544,
"height": 80,
"content": "### 3.2. Upload the original audio to drive for later usage\nBackup the original audio file."
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "c8c05b3a-a276-4324-88ef-7a55779d4e2f",
"connections": {
"59241354-ef2f-43aa-bf2a-bf394ace5907": {
"main": [
[
{
"node": "ef75b354-3db8-4536-afc9-4268395dff0a",
"type": "main",
"index": 0
}
]
]
},
"564864d4-4a40-4f1a-b99e-fd0c6981ef7c": {
"main": [
[
{
"node": "59241354-ef2f-43aa-bf2a-bf394ace5907",
"type": "main",
"index": 1
}
]
]
},
"53031e0c-a427-4023-b1f6-c0aae9b6ad4f": {
"main": [
[
{
"node": "1ecf333c-3dd2-44a9-b301-547391695613",
"type": "main",
"index": 0
}
],
[
{
"node": "638b4ba9-c381-44d4-9245-c5d4964371f7",
"type": "main",
"index": 0
}
]
]
},
"1ecf333c-3dd2-44a9-b301-547391695613": {
"main": [
[
{
"node": "d61a14e8-9541-48be-95a0-5d4e5df85ff3",
"type": "main",
"index": 0
},
{
"node": "564864d4-4a40-4f1a-b99e-fd0c6981ef7c",
"type": "main",
"index": 0
}
]
]
},
"d61a14e8-9541-48be-95a0-5d4e5df85ff3": {
"main": [
[
{
"node": "59241354-ef2f-43aa-bf2a-bf394ace5907",
"type": "main",
"index": 0
}
]
]
},
"af081dde-eb7d-4a4f-ad6c-d28ffd1a81ab": {
"main": [
[
{
"node": "53031e0c-a427-4023-b1f6-c0aae9b6ad4f",
"type": "main",
"index": 0
}
]
]
},
"ef75b354-3db8-4536-afc9-4268395dff0a": {
"main": [
[
{
"node": "1ecbac8a-2451-4856-8a96-f7d5b3dbcef5",
"type": "main",
"index": 0
},
{
"node": "e8a585eb-1ed0-41c9-a2d8-25d62c12d387",
"type": "main",
"index": 0
}
]
]
}
}
}์ด ์ํฌํ๋ก์ฐ๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์?
์์ JSON ๊ตฌ์ฑ ์ฝ๋๋ฅผ ๋ณต์ฌํ์ฌ n8n ์ธ์คํด์ค์์ ์ ์ํฌํ๋ก์ฐ๋ฅผ ์์ฑํ๊ณ "JSON์์ ๊ฐ์ ธ์ค๊ธฐ"๋ฅผ ์ ํํ ํ, ๊ตฌ์ฑ์ ๋ถ์ฌ๋ฃ๊ณ ํ์์ ๋ฐ๋ผ ์ธ์ฆ ์ค์ ์ ์์ ํ์ธ์.
์ด ์ํฌํ๋ก์ฐ๋ ์ด๋ค ์๋๋ฆฌ์ค์ ์ ํฉํ๊ฐ์?
๊ณ ๊ธ - ๋ฌธ์ ์ถ์ถ, ๋ฉํฐ๋ชจ๋ฌ AI
์ ๋ฃ์ธ๊ฐ์?
์ด ์ํฌํ๋ก์ฐ๋ ์์ ํ ๋ฌด๋ฃ์ด๋ฉฐ ์ง์ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ง, ์ํฌํ๋ก์ฐ์์ ์ฌ์ฉํ๋ ํ์ฌ ์๋น์ค(์: OpenAI API)๋ ์ฌ์ฉ์ ์ง์ ๋น์ฉ์ ์ง๋ถํด์ผ ํ ์ ์์ต๋๋ค.
๊ด๋ จ ์ํฌํ๋ก์ฐ ์ถ์ฒ
Trung Tran
@trungtranEmpowering small and medium businesses with smart automation and practical AI, no big tech team required. Reach out: lets@automatewith.me
์ด ์ํฌํ๋ก์ฐ ๊ณต์