當我們說出「開燈」的瞬間,腦中其實已經構築了一個期望 —— 我希望燈亮起來,而不是只是被「聽見」。
這正是語音互動設計的核心:語音不只是輸入,還必須驅動回應。
今天,我們就來實作一個最小可行語音互動系統(MVP):
👉🏻 使用 CNN 模型辨識「開燈」和「關燈」語音指令,並用 print()
模擬控制燈光的行為!
模組 | 功能說明 |
---|---|
語音輸入 | 使用 Google Speech Commands 的 on / off 指令 |
音訊處理 | 將語音波形轉為梅爾頻譜圖(MelSpectrogram) |
CNN 模型 | 分類語音為 on 或 off |
控制邏輯 | 使用 print() 輸出「燈亮起來了!」或「燈熄滅了...」 |
本專案採用 Google 開源的 Speech Commands Dataset:
我們將挑選其中的 on
與 off
,分別代表「開燈」與「關燈」指令。
CNN 模型對圖像敏感,因此我們會將聲音波形轉換成 梅爾頻譜圖(Mel Spectrogram),讓聲音變成一張圖片:
如下圖所示:
import torchaudio
import matplotlib.pyplot as plt
waveform, sr = torchaudio.load("on.wav")
mel = torchaudio.transforms.MelSpectrogram()(waveform)
plt.figure(figsize=(10, 4))
plt.imshow(mel.log2()[0].numpy(), cmap='viridis', aspect='auto')
plt.title("Mel Spectrogram of 'on'")
plt.xlabel("Time")
plt.ylabel("Mel Frequency")
plt.colorbar()
plt.show()
以下為模型架構,經資料增強後進行訓練,最終在測試集達到 94.45% 的準確率:
import torch.nn as nn
class CNNClassifier(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Conv2d(1, 16, kernel_size=3),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(16, 32, kernel_size=3),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(32 * 14 * 14, 64),
nn.ReLU(),
nn.Linear(64, 2)
)
def forward(self, x):
return self.net(x)
def control_light(pred_label):
if pred_label == 1:
print("燈亮起來了!")
elif pred_label == 0:
print("燈熄滅了...")
else:
print("無法辨識的指令")
y_pred = model(mel_tensor.unsqueeze(0).to(device))
pred_label = torch.argmax(y_pred, dim=1).item()
control_light(pred_label)
輸出:
模型訓練後的測試結果:
✅ Test Accuracy:94.45%
✅ 混淆矩陣如下:
Confusion Matrix:
[[374 6]
[ 20 300]]
✅ 分類報告:
precision | recall | f1-score | support | |
---|---|---|---|---|
off | 0.94 | 0.96 | 0.95 | 165 |
on | 0.94 | 0.92 | 0.93 | 207 |
accuracy | 0.94 | 372 |
這是一個從 語音資料 → CNN 模型 → 控制回應 簡單的 print()
語音控制開關燈的實作,雖然只是 HCI × Deep Learning 世界中的一個小實驗,卻象徵著智慧互動將不再侷限於滑鼠與螢幕,而是更貼近我們的語言與感官。
你是否也開始想像,下一個用語音控制的對象會是什麼?