🎙️ SpeechPulse

語音情感理解 MCP 服務器
SpeechPulse 通過分析語音音頻,利用韻律特徵(音高、能量、節奏)來檢測情感、評估緊迫性並識別諷刺。Lite 層級完全基於 Python 標準庫構建,實現零機器學習依賴。
✨ 主要特性
- 🎭 情感檢測:基於變異係數(CV)閾值識別 7 種情感(高興、興奮、憤怒、悲傷、疲憊、焦慮、中性)
- ⏱️ 緊迫性評估:基於說話模式進行 4 級緊迫性檢測(低、中、高、緊急)
- 🙃 諷刺檢測:通過對比文本情感與音頻情感來識別諷刺
- 🚫 零機器學習依賴:Lite 層級僅使用 Python 標準庫(無需 numpy/scipy/librosa)
- 🔌 MCP 兼容:通過 Model Context Protocol 暴露工具,可與 Claude Desktop 及其他 MCP 客戶端集成
📦 安裝指南
從 PyPI 安裝(發佈後可用)
pip install speechpulse
從源碼安裝
git clone https://github.com/sophieMiao/speechpulse.git
cd speechpulse
pip install -e ".[dev]"
🚀 快速開始
作為 MCP 服務器使用
將其添加到你的 MCP 客戶端配置中(例如 Claude Desktop):
{
"mcpServers": {
"speechpulse": {
"command": "python",
"args": ["-m", "speechpulse"],
"env": {
"SPEECHPULSE_TIER": "lite"
}
}
}
}
作為 Python 庫使用
from speechpulse.analyzer import SpeechAnalyzer
analyzer = SpeechAnalyzer()
result = analyzer.analyze("path/to/audio.wav")
print(f"Primary emotion: {result['emotion']['primary']}")
urgency = analyzer.assess_urgency("path/to/audio.wav")
print(f"Urgency level: {urgency.level}")
sarcasm = analyzer.detect_sarcasm(
"path/to/audio.wav",
text="這真是太棒了"
)
print(f"Is sarcastic: {sarcasm.is_sarcastic}")
full = analyzer.full_analysis("path/to/audio.wav", text="我受夠了!")
print(full['summary'])
print(full['interpretation'])
命令行用法
python -m speechpulse
python -m speechpulse --transport sse --port 8080
python -m speechpulse -v
🔧 MCP 工具
analyze_audio
分析音頻的情感和基礎特徵。
參數:
audio_path(string,必填):WAV 音頻文件的路徑
text(string,可選):用於上下文的轉寫文本
返回: 情感檢測結果、說話人狀態以及原始音頻特徵
assess_urgency
基於音頻韻律評估緊迫程度。
參數:
audio_path(string,必填):音頻文件的路徑
text(string,可選):用於基於關鍵詞的緊迫性檢測的文本
返回: 緊迫性評分、級別以及判斷依據
detect_sarcasm
通過對比文本情感與音頻情感來檢測諷刺。
參數:
audio_path(string,必填):音頻文件的路徑
text(string,可選):轉寫文本(推薦提供)
返回: 諷刺檢測結果,包含置信度與指示項
full_analysis
執行完整分析(情感 + 緊迫性 + 諷刺)。
參數:
audio_path(string,必填):音頻文件的路徑
text(string,可選):轉寫文本
返回: 包含摘要與解讀的完整分析結果
health_check
檢查服務器健康狀態與能力。
返回: 狀態、版本、層級以及可用能力
🏗️ 項目架構
speechpulse/
├── types.py # Core data types (AudioFeatures, EmotionResult, etc.)
├── config.py # Configuration management
├── utils.py # Audio loading and processing utilities
├── audio_features.py # Feature extraction (pitch, energy, etc.)
├── emotion.py # CV-based emotion rule engine
├── urgency.py # Urgency assessment logic
├── sarcasm.py # Sarcasm detection
├── analyzer.py # Main analysis pipeline
├── server.py # MCP server implementation
├── asr.py # ASR stub (Standard/Pro tier)
└── ml_emotion.py # ML emotion stub (Pro tier)
🔬 技術細節
音頻處理
- 純 Python:僅使用
wave、struct、math 和 array 模塊
- 格式支持:8/16/24/32 位 PCM 的 WAV 文件
- 重採樣:線性插值至 16kHz
- 分幀:32ms 幀長,50% 重疊,Hamming 窗
特徵提取
- 音高(Pitch):基於自相關的 F0 檢測(50-500 Hz 範圍)
- 能量(Energy):逐幀 RMS 能量
- 過零率(Zero Crossing Rate):濁音/清音判別
- 靜音比(Silence Ratio):停頓模式分析
情感識別
使用變異係數(CV = 標準差/均值)來規避性別偏差,同時保持區分能力:
"happy": {
"conditions": [
("pitch_cv", ">", 0.15),
("energy_mean", ">", 0.3),
("energy_cv", ">", 0.2),
],
"weight": 0.8,
}
緊迫性評估
基於 5 個因素:
- 語速(快/中/慢)
- 音量(高/中/低)
- 音高變化(高/中/低)
- 停頓模式(少/正常/多)
- 關鍵詞檢測(當提供文本時)
🎚️ 服務層級
Lite 層級(當前)
- ✅ 基於規則的情感識別
- ✅ 韻律緊迫性評估
- ✅ 基於關鍵詞的諷刺檢測
- ✅ 純 Python(無機器學習依賴)
- ❌ 無 ASR 功能(需手動提供文本)
- ❌ 僅支持 WAV 格式
Standard 層級(規劃中)
- 基於 faster-whisper 的 ASR
- 更多音頻格式支持(MP3、FLAC 等)
- 說話人分離(Speaker Diarization)
Pro 層級(規劃中)
- Qwen2-Audio 集成
- 上下文感知的情感分析
- 更細膩的情感檢測
- 即時流式處理
🛠️ 開發指南
環境搭建
git clone https://github.com/sophieMiao/speechpulse.git
cd speechpulse
python -m venv venv
source venv/bin/activate
pip install -e ".[dev]"
運行測試
python -m pytest tests/
python tests/test_all.py
python tests/test_integration.py
演示
python examples/demo.py
⚙️ 配置
環境變量:
| 變量 |
默認值 |
描述 |
SPEECHPULSE_TIER |
lite |
服務層級(lite/standard/pro) |
SPEECHPULSE_SAMPLE_RATE |
16000 |
目標採樣率 |
SPEECHPULSE_FRAME_SIZE |
512 |
分析幀大小 |
SPEECHPULSE_HOP_SIZE |
256 |
幀移大小 |
⚠️ 侷限性
- Lite 層級進行諷刺檢測時需提供文本:通過
text 參數提供轉寫文本
- 僅支持 WAV 格式:其他格式需在分析前轉換為 WAV
- 基於規則的情感識別:更細膩的機器學習情感檢測將在 Pro 層級提供
- 針對中文/英文優化:完整的多語言支持將在 Pro 層級提供
🤝 貢獻指南
- Fork 本倉庫
- 創建功能分支(
git checkout -b feature/amazing-feature)
- 提交更改(
git commit -m 'Add amazing feature')
- 推送分支(
git push origin feature/amazing-feature)
- 發起 Pull Request
📄 許可證
本項目基於 MIT 許可證授權 —— 詳情請參閱 LICENSE 文件。
🙏 致謝
- 基於 MCP SDK 構建
- 靈感來源於語音情感識別中的韻律分析研究
- CV 方法基於性別公平的情感識別研究
💬 支持
Made with ❤️ for voice emotion understanding