標籤: 離線語音控制

  • 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,實作一個可對答的語音查詢小工具