【n8n教學】自動生成 AI 語音天氣預報並發送至 Line

介紹如何透過 n8n 製作一個自動語音天氣預報機器人,我會抓取氣象署的 API,接著透過 AI 轉換成語音後發送到 Line。

 

Step 1: 建立初始節點

這邊可以用 Schedule Trigger,這樣之後就可以自動生成了。

 

Step 2: 抓取氣象資訊

接著建立 Http Request 節點,我是抓 36 小時天氣預報,並依序填入:

 

Step 3: 整理氣象資訊

要發送給 TTS 的話要先把內容給整理好,由於氣象資訊可以直接組合成一個語句,所以就不透過大語言模型,我直接建一個 Code 節點來處理資訊:

const location = items[0].json.records.location[0];
const elements = Object.fromEntries(location.weatherElement.map(e => [e.elementName, e]));

// 找出所有要素中最早的時間段
const allStarts = location.weatherElement
  .flatMap(e => (e.time || []).map(t => t.startTime))
  .filter(Boolean);
const targetStart = allStarts.sort()[0];

// 取指定時間段參數
function pickByStart(el, start) {
  if (!el || !Array.isArray(el.time)) return null;
  const hit = el.time.find(t => t.startTime === start) || el.time[0];
  return hit ? { value: hit.parameter?.parameterName ?? null, start: hit.startTime, end: hit.endTime } : null;
}
function pickPoP(start) {
  const candidates = [elements.PoP, elements.PoP6h, elements.PoP12h];
  for (const el of candidates) {
    const res = pickByStart(el, start);
    if (res) return res;
  }
  return null;
}

const wx   = pickByStart(elements.Wx, targetStart);
const pop  = pickPoP(targetStart);
const minT = pickByStart(elements.MinT, targetStart);
const maxT = pickByStart(elements.MaxT, targetStart);

// 安全解析時間字串(避免 new Date(YYYY-MM-DD HH:mm:ss) 解析誤差)
function parseDateStr(str) {
  if (!str) return null;
  const [date, time] = str.split(' ');
  const [y, m, d] = date.split('-').map(Number);
  const [hh='0', mm='0', ss='0'] = (time || '').split(':');
  return new Date(Number(y), Number(m)-1, Number(d), Number(hh), Number(mm), Number(ss));
}

// 格式:M月D日 + (凌晨/早上/下午/晚上) + 12小時制
function formatTime(str) {
  if (!str) return "";
  const d = parseDateStr(str);
  const M = d.getMonth() + 1;
  const D = d.getDate();
  const h = d.getHours();

  let label = "";
  if (h < 6) label = "凌晨";
  else if (h < 12) label = "早上";
  else if (h < 18) label = "下午";
  else label = "晚上";

  // 12 小時制(18 -> 6,13 -> 1;特別處理 0 點顯示為 0 點)
  let h12 = h % 12 || 12;
  if (h === 0) h12 = 0;

  return `${M}月${D}日 ${label}${h12}點`;
}

const startStr = formatTime(wx?.start || targetStart);
const endStr   = formatTime(wx?.end);

// 只輸出口語化 message
return [{
  json: {
    message: `${startStr} 到 ${endStr},${location.locationName}的天氣預報是 ${wx?.value || "—"},氣溫在 ${minT?.value || "—"} 到 ${maxT?.value || "—"} 度之間,降雨機率大約 ${pop?.value || "—"}%。`
  }
}];

 

Step 4: 透過 TTS 轉成語音

這裡你可以用 OpenAI 節點,但我發現預設節點沒有比較新的 TTS 模型,所以我就改用自訂 API 的方式去呼叫,我這邊建立一個 Http Request 節點,並設定:

  • Method: POST
  • URL: https://api.openai.com/v1/audio/speech
  • Send Header 打開
    • Authorization: Bearer 你的OpenAI API token
    • Content-Type: application/json
  • Send Body 打開
    • Body Content Type: JSON
    • Specify Body: Using JSON
{
  "model": "gpt-4o-mini-tts",
  "input": "{{ $json.message }}",
  "instructions": "請用台灣本地口音的標準國語發音,語氣自然親切,避免兒化音,使用台灣慣用詞。",
  "audio": { "voice": "verse", "format": "mp3" }
}

這裡我就是把前一個節點整理的文字丟給 OpenAI,我使用的是 gpt-4o-mini-tts 模型,並指定他用台灣腔。

 

Step 5: 整理音訊檔

因為要傳到雲端空間有時候傳過去的格式有問題就會失敗,我這邊先新增一個 Code 節點去處理上一個節點來的音訊檔。

// 把 binary 的 key 整到 data,並補上檔名與 MIME
for (const item of items) {
  if (!item.binary) throw new Error('這個 item 沒有 binary');
  const keys = Object.keys(item.binary);
  const srcKey = keys.includes('data') ? 'data' : keys[0];
  const b = item.binary[srcKey];
  if (!b?.data) throw new Error('binary 沒內容');

  item.binary.data = b;                     // 讓 key 一律叫 data
  item.binary.data.fileName = 'speech.mp3'; // 一定要有 .mp3
  item.binary.data.mimeType = 'audio/mpeg'; // 對應 mp3
  if (srcKey !== 'data') delete item.binary[srcKey];
}
return items;

 

Step 6: 上傳至雲端空間

由於要發送給 Line 需要給他一個在網路上的連結,所以需要把檔案傳到伺服器上,我這邊示範傳到一個雲端暫存空間,因為比較單純大家都能做到,不過如果是真正的服務就一定要有自己的空間且不會刪檔會比較好。

新增 Http Request 節點,並設定:

 

Step 7: 處理連結網址

接著處理上傳到雲端後的網址,我這邊先處理 tmpfiles 去抓到檔案真正的路徑,另外由於要發送給 Line 的連結一定要是 https,而 tmpfiles 回傳的路徑預設會是 http,所以我就用一個 Code 節點來整理這些資訊。

const pageUrl = $json.data?.url || '';
// 確保使用 https + dl 直連
const link = pageUrl
  .replace('http://', 'https://')
  .replace('://tmpfiles.org/', '://tmpfiles.org/dl/');
return [{ json: { link } }];

 

Step 8: 發送至 Line

最後就是發送到 Line 啦,新增一個 Http Requst 節點,然後設定:

  • Method: POST
  • URL: https://api.line.me/v2/bot/message/push
  • Send Header 打開
    • Authorization: Bearer Channel_token
    • Content-Type: application/json
  • Send Body 打開
  • Body Content Type: JSON
  • Specify Body: Using JSON
{
  "to": 接收者 Line ID,
  "messages": [
    {
      "type":"audio",
      "originalContentUrl":"{{$json.link}}",
      "duration":4000
    }
  ]

}

這裡因為一定要給 duration 資訊,不過不一定要正確,所以我就都給一個估計的值,如果希望很精準再去處理就好。

最後成功就可以在 Line 看到處理完傳過來的語音訊息啦。

完整工作流會長這樣:

 

 

 

 
 

 

 

課程推薦

3 小時掌握自動化工作新手應用實作 – n8n AI Agent

3 小時掌握自動化工作新手應用實作 – n8n AI Agent

這門課程將帶你循序漸進掌握 n8n 的自動化技巧,從基礎認識與操作入門,到進階節點應用與流程控制,再到 Google 服務的整合實作,最後延伸至部署思維與 OpenAI API 的智慧化串接。

輸入折扣碼 TC1600UY 還可以額外獲得 NT$500 優惠喔。

用 AI 生成網站? AI 高效網站設計實戰課:ChatGPT X HTML X SEO

用 AI 生成網站? AI 高效網站設計實戰課:ChatGPT X HTML X SEO

利用 AI 提升網站設計效率與 SEO 排名!了解如何透過 ChatGPT 等工具快速建立 HTML 架構,優化關鍵字與用戶體驗,讓網站更具競爭力。

輸入折扣碼 TC1533SL 還可以額外獲得 NT$500 優惠喔。

AI工作術全面學習實戰營:6 堂精選課程,學會最好用 AI 工具,翻轉你的人生

AI工作術全面學習實戰營:6 堂精選課程,學會最好用 AI 工具,翻轉你的人生

《PChome雜誌》攜手 5 位在 AI 領域的專業講師,打造上述 6 堂實用課程,教你學會時下最好用的 AI 工具,導入生成式 AI 來產製工作內容,改造並升級你的工作流程。

輸入折扣碼 ZERO2024 還可以額外獲得 NT$400 優惠喔。

HTML與SEO實戰應用—並以ChatGPT助力提升網站品質與流量

HTML與SEO實戰應用—並以ChatGPT助力提升網站品質與流量

本課程專為希望深入了解 HTML 並有效結合 SEO 策略的學員設計。我們將重點放在 HTML 的深度學習與應用上,同時穿插介紹如何透過搜索引擎優化提升網站能見度。透過即時互動式的直播教學,加上 ChatGPT 的輔助,您將學習到如何建立一個結構優良、美觀且符合 SEO 標準的網站。這不僅會提升網站的用戶體驗,還會大幅提高網站的搜索引擎排名,進而增加訪客流量和潛在客戶。
用AI強化職場競爭力 ChatGPT、Midjourney從入門到精通

用AI強化職場競爭力 ChatGPT、Midjourney從入門到精通

在快速變遷的職場中,提升競爭力成為關鍵。透過引領潮流的AI技術,ChatGPT和Midjourney將助您勇攀高峰。無論您是AI新手還是專家,這個課程將引導您從入門到精通,解密AI的奧秘,並學習如何運用於職場。
GitHub Copilot AI 程式碼編輯工具應用實務班

GitHub Copilot AI 程式碼編輯工具應用實務班

讓學員瞭解有效地使用該工具來加速開發流程、提高程式碼品質和生產力。課程重點放在以 JavaScript 程式語言為例,介紹 Copilot 的基本原理、使用方法和最佳實踐。

輸入折扣碼 TC1456JA 還可以額外獲得 NT$500 優惠喔。

ChatGPT X Clipchamp AI 生成影片、配音與字幕應用實戰班

ChatGPT X Clipchamp AI 生成影片、配音與字幕應用實戰班

掌握Clipchamp AI的操作技巧,靈活運用Clipchamp AI進行影片編輯和創作,實現創意表達和傳播目的。

輸入折扣碼 TC1451JAN 還可以額外獲得 NT$500 優惠喔。

如何串接多種數位工具資訊?Looker Studio 資料視覺化實戰班|GoogleAds x FB廣告 x GA流量數據

如何串接多種數位工具資訊?Looker Studio 資料視覺化實戰班|GoogleAds x FB廣告 x GA流量數據

Looker Studio除了可協助使用者監控網站流量、廣告成效、選擇匯入資源的管道之外,還可以將數據資料多平台整合、數據報表即時更新、數據範本可重複套用的效益,透過自動化系統,將數據全部匯入同一個報表平台,是企業不可或缺的重要工具。

輸入折扣碼 TC1270JIA 還可以額外獲得 NT$500 優惠喔。

和我們交流

加入我們的社群,裡面會有一些技術的內容、有趣的技術梗,以及職缺的分享,歡迎和我們一起討論。