moonshine 實戰:10 行程式碼做語音代理

moonshine 實戰:10 行程式碼做語音代理

📌 本文重點

  • moonshine 是可本地部署的低延遲語音代理 C++ pipeline
  • 一條 pipeline 完成 STT、意圖辨識與 TTS
  • 適合客服熱線、語音面板與 IoT 離線語音控制
  • 可直接接上任意 REST API 打造專屬語音 agent

只想做一個語音版 ChatGPT、客服機器人,卻不想被雲端 API 綁死、每月付帳單?moonshine 就是那套「自己裝在機器上、一次搞定語音輸入+理解+回覆」的 C++ pipeline。

原始碼在 GitHub:https://github.com/moonshine-ai/moonshine


核心功能:一條語音 pipeline,全都自己掌控

moonshine 的定位很直接:

Very low latency speech to text, intent recognition, and text to speech, for building voice agents and interfaces.

你可以把它想成「本地版語音代理引擎」——不是雲端服務,而是一個可以編譯進你自己程式的 C++ library/工具。

💡 關鍵: moonshine 把 STT、意圖辨識與 TTS 串成單一低延遲 pipeline,從輸入到輸出都在你自己的機器上完成。

1. 語音輸入:低延遲 STT(Speech-to-Text)

  • 功能:把麥克風語音即時轉成文字,延遲低,適合對話場景。
  • 實際效果:跑在桌機或中高階單板機上,可以做到「你講一句,它同時開始辨識」的互動感。
  • 你可以立刻做的事:
  • 把它接到客服電話錄音,轉成文字後送到 FAQ 引擎。
  • 接到操作面板上,用語音替代滑鼠點選。

2. 意圖辨識:Intent Recognition

  • 功能:從文字中判斷「使用者想做什麼」,例如:查訂單、開支援 ticket、關燈、查庫存。
  • moonshine 的做法:把語音轉文字後,丟進意圖模型(可換成你自己訓練的分類器/LLM)。
  • 你可以立刻做的事:
  • 自訂幾個意圖(如 查訂單問價格人工轉接),用簡單規則或模型判斷要打到哪個 API

3. 語音輸出:TTS(Text-to-Speech)

  • 功能:把系統回覆文字轉成語音,直接播放給使用者。
  • 實際效果:完成一個「講話→理解→查資料→講回來」的完整迴路,不需要外接雲端 TTS
  • 你可以立刻做的事:
  • 做一個「語音 FAQ 機器人」,接電話後用 TTS 讀出答案。
  • 做桌面語音助理,說出系統通知或報表摘要。

適合誰用:三種典型場景

1. 客服/熱線:電話接起來就有語音機器人

問題情境

  • 只想讓機器人先接電話、回答常見問題或先收集基本資料,但不想把所有通話丟到雲端 AI

moonshine 的用法

  • 把語音輸入接到電話系統的音訊流(VoIPSIP 方案都可),用 STT 轉文字。
  • 用意圖辨識判斷是「查訂單」「問營業時間」「真人客服」。
  • 走不同後端 API,最後用 TTS 回覆。

你可以立刻做的實驗

  • 先不接真正電話,用錄音檔或麥克風假裝客戶提問,串一個「FAQ 搜尋 API」,測試回答流程。

2. 語音面板:替既有系統加一層「講話就能操作」

問題情境

  • 你有一套 SaaS 或內部系統(CRMERP、工單系統),想讓使用者用「語音」查資料、下指令,但不想大改前端。

moonshine 的用法

  • 在桌面 appweb 前端旁放一個小語音代理程式:
  • 監聽麥克風 → STT → 判斷意圖 → 呼叫既有 REST API → 整理結果 → TTS 講回來或貼在 UI

你可以立刻做的實驗

  • 選一個已有的 REST API(例如:查客戶資訊),用下方「10 行程式碼」範例改成語音查詢。

3. IoT/嵌入式:低資源設備上的離線語音控制

問題情境

  • 想做離線語音控制:開關設備、切換模式,但硬體算力有限、網路不穩。

moonshine 的用法

  • 把精簡版模型放在裝置上(例如 ARM 單板機),只做幾個固定意圖:
  • 「開燈」「關燈」「設定 25 度」等,直接對接硬體控制程式。

💡 關鍵: 在 IoT 裝置離線情境下,moonshine 可只保留少數固定意圖,大幅降低對算力與網路的依賴。

你可以立刻做的實驗

  • 在一台樹莓派或小型工控機上跑最簡 demo,先做「聽到關燈就印出 turn_off_light」的文字,再接上 GPIO 控制。

怎麼開始:從 GitHub clone 到第一個語音 agent

💡 關鍵:git clone 到可用 demo,大致只需一次編譯與模型下載,就能完整體驗整條語音 pipeline。

1. 先把專案拉下來、編譯成功

  1. 安裝基本依賴(以 Ubuntu 為例):

bash
sudo apt update
sudo apt install -y git cmake build-essential

  1. Clone 專案:

bash
git clone https://github.com/moonshine-ai/moonshine.git
cd moonshine

  1. 編譯:

bash
mkdir build && cd build
cmake ..
make -j$(nproc)

完成後,你會得到可以執行的示範程式(名稱以官方 repo 為準,一般會有 demoexample 可跑)。

2. 跑最簡 demo:確認 STT / TTS pipeline

官方 repo 一般會提供類似:

./moonshine_demo --input mic --output speaker

典型流程會是:

  1. 啟動程式,指定輸入為麥克風、輸出為喇叭。
  2. 程式下載或載入預設 STTTTS 模型(通常第一次跑會需要網路)。
  3. 你講一句話,終端機顯示辨識出的文字,並用 TTS 回覆一句預設回答。

具體參數以官方 README 為準,重點是:先確認你機器上的音訊裝置、模型下載都 OK

3. 配置模型:STT / TTS / Intent 拆清楚

在實際專案中,你要決定三件事:

  1. STT 模型
  2. 選語系(中文/英文等)和大小(依你設備算力)。
  3. moonshine 通常會支援多種 backend,可以在 config 檔或啟動參數指定。
  4. TTS 模型
  5. 選擇語音風格(男聲/女聲)和延遲表現。
  6. 在設定中指定 model path 或使用預設 URL 拉取。
  7. Intent 模型或規則
  8. 簡單做法:先用關鍵字+正則,把意圖分成幾類。
  9. 進階做法:接上本地 LLM(例如使用你現有的推論服務)做意圖分類。

你可以建立一個簡單的 config.json

{
  "stt_model": "models/stt_zh_small.bin",
  "tts_model": "models/tts_zh_small.bin",
  "intent_backend": "http://localhost:8000/intent"
}

程式啟動時讀取這個 config,就能自由替換模型和意圖服務。

4. 10 行程式碼:把任何 REST API 包成語音代理

以下用「C++ + moonshine + 一個任意 REST API」示意,把核心流程壓縮成約 10 行邏輯。實際使用時需依官方 API 做正確呼叫。

#include "moonshine.h"      // 假設提供 STT / TTS 接口
#include <httplib.h>         // 用任意 HTTP client

int main() {
    MoonshineAgent agent{"config.json"};              // 載入 STT/TTS 設定
    httplib::Client api("https://api.yourservice.com");

    while (true) {
        std::string text = agent.listen();             // 1. 麥克風→文字
        auto res = api.Get("/search?query=" + text);  // 2. 呼叫任意 REST API
        std::string reply = res->body;                 // 3. 取回文字結果
        agent.speak(reply);                            // 4. TTS 語音回覆
    }
}

這個基本版就已經是一個「語音代理壓在你自己的後端」:

  • 你說話 → STT -> text
  • 丟到你預先寫好的 API(可以是 FAQ 搜尋、工單建立、資料查詢)
  • 回傳文字 → 用 TTS 說回來

你可以改幾行,就變成不同場景:

  • 客服熱線:把 text 先送進意圖辨識 API,再決定要打哪一個後端。
  • 語音面板:把 reply 不是用 TTS,而是顯示在 UITTS 只讀重點。
  • IoT 控制:把 api.Get(...) 換成控制硬體的函式,例如 set_light(false)

小結:想自己掌控語音代理,就先把 moonshine 跑起來

如果你:

  • 不想被雲端 STTTTS 綁約
  • 想在桌面 app、行動裝置或後端服務內嵌語音代理

那 moonshine 提供的就是一個單純、可編譯進你程式的 C++ 語音 pipeline。從 GitHub clone 下來,先跑官方 demo,再按照上面範例把你的 REST API 接上去,你就能在一台機器上完成第一個「可用的語音 agent」。

🚀 你現在可以做的事

  • 前往 moonshine GitHub 專案 clone 並完成一次編譯與官方 demo 執行
  • 寫一個簡單的 config.json,指定本地 STTTTS 模型與一個測試用意圖服務 endpoint
  • 按照文中「10 行程式碼」範例,挑一個現有 REST API,實作一個可對答的語音查詢小工具

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *