Windows SAPI5 text-to-speech with Neural voices. Lightweight alternative to GPU-heavy TTS - zero GPU usage, instant generation. Auto-detects best available voice for your language. Works on Windows 10/11.
数据来源:ClawHub。 在 ClawSkills 查看
选择你使用的 Agent
方法一:命令行安装(推荐)
推荐(无需提前安装 clawhub)
npx clawhub@latest --dir ~/.claude/skills install sapi-tts或使用 clawhub CLI(需提前安装)
clawhub --dir ~/.claude/skills install sapi-tts⚠️ 需要 Node.js 18+,没有 Node?请使用下方方法二直接下载 ZIP。 安装 Node.js →
方法二:手动下载安装(无需 Node)
下载 ZIP,解压后将文件夹放到以下路径,重启 Agent 即可:
安装路径
~/.claude/skills/sapi-tts/💡解压后将文件夹放到上方路径,重启 Agent 即可生效
--- name: sapi-tts description: Windows SAPI5 text-to-speech with Neural voices. Lightweight alternative to GPU-heavy TTS - zero GPU usage, instant generation. Auto-detects best available voice for your language. Works on Windows 10/11. ---
Lightweight text-to-speech using Windows built-in SAPI5. Zero GPU, instant generation.
Save the script below as tts.ps1 in your skills folder:
<#
.SYNOPSIS
Windows SAPI5 TTS - Lightweight text-to-speech
.DESCRIPTION
Uses Windows built-in speech synthesis (SAPI5).
Works with Neural voices (Win11) or legacy voices (Win10).
Zero GPU usage, instant generation.
#>
param(
[Parameter(Mandatory=$false, Position=0)]
[string]$Text = "",
[Parameter(Mandatory=$false)]
[Alias("Voice", "v")]
[string]$VoiceName = "",
[Parameter(Mandatory=$false)]
[Alias("Lang", "l")]
[string]$Language = "fr",
[Parameter(Mandatory=$false)]
[Alias("o")]
[string]$Output = "",
[Parameter(Mandatory=$false)]
[Alias("r")]
[int]$Rate = 0,
[Parameter(Mandatory=$false)]
[Alias("p")]
[switch]$Play,
[Parameter(Mandatory=$false)]
[switch]$ListVoices
)
Add-Type -AssemblyName System.Speech
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
$installedVoices = $synth.GetInstalledVoices() | Where-Object { $_.Enabled } | ForEach-Object { $_.VoiceInfo }
if ($ListVoices) {
Write-Host "`nInstalled SAPI5 voices:`n" -ForegroundColor Cyan
foreach ($v in $installedVoices) {
$type = if ($v.Name -match "Online|Neural") { "[Neural]" } else { "[Legacy]" }
Write-Host " $($v.Name)" -ForegroundColor White -NoNewline
Write-Host " $type" -ForegroundColor DarkGray -NoNewline
Write-Host " - $($v.Culture) $($v.Gender)" -ForegroundColor Gray
}
Write-Host ""
$synth.Dispose()
exit 0
}
if (-not $Text) {
Write-Error "Text required. Use: .\tts.ps1 'Your text here'"
Write-Host "Use -ListVoices to see available voices"
$synth.Dispose()
exit 1
}
function Select-BestVoice {
param($voices, $preferredName, $lang)
if ($preferredName) {
$match = $voices | Where-Object { $_.Name -like "*$preferredName*" } | Select-Object -First 1
if ($match) { return $match }
Write-Warning "Voice '$preferredName' not found, auto-selecting..."
}
$cultureMap = @{
"fr" = "fr-FR"; "french" = "fr-FR"
"en" = "en-US"; "english" = "en-US"
"de" = "de-DE"; "german" = "de-DE"
"es" = "es-ES"; "spanish" = "es-ES"
"it" = "it-IT"; "italian" = "it-IT"
}
$targetCulture = $cultureMap[$lang.ToLower()]
if (-not $targetCulture) { $targetCulture = $lang }
$neuralMatch = $voices | Where-Object {
$_.Name -match "Online|Neural" -and $_.Culture.Name -eq $targetCulture
} | Select-Object -First 1
if ($neuralMatch) { return $neuralMatch }
$langMatch = $voices | Where-Object { $_.Culture.Name -eq $targetCulture } | Select-Object -First 1
if ($langMatch) { return $langMatch }
$anyNeural = $voices | Where-Object { $_.Name -match "Online|Neural" } | Select-Object -First 1
if ($anyNeural) { return $anyNeural }
return $voices | Select-Object -First 1
}
$selectedVoice = Select-BestVoice -voices $installedVoices -preferredName $VoiceName -lang $Language
if (-not $selectedVoice) {
Write-Error "No SAPI5 voices found! Install voices in Windows Settings > Time & Language > Speech"
$synth.Dispose()
exit 1
}
if (-not $Output) {
$ttsDir = "$env:USERPROFILE\.openclaw\workspace\tts"
if (-not (Test-Path $ttsDir)) { New-Item -ItemType Directory -Path $ttsDir -Force | Out-Null }
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$Output = "$ttsDir\sapi_$timestamp.wav"
}
try {
$synth.SelectVoice($selectedVoice.Name)
$synth.Rate = $Rate
$synth.SetOutputToWaveFile($Output)
$synth.Speak($Text)
$synth.SetOutputToNull()
Write-Host "Voice: $($selectedVoice.Name) [$($selectedVoice.Culture)]" -ForegroundColor Cyan
Write-Host "MEDIA:$Output"
# Auto-play if requested (uses .NET MediaPlayer, no external player)
if ($Play) {
Add-Type -AssemblyName PresentationCore
$player = New-Object System.Windows.Media.MediaPlayer
$player.Open([Uri]$Output)
$player.Play()
Start-Sleep -Milliseconds 500
while ($player.Position -lt $player.NaturalDuration.TimeSpan) {
Start-Sleep -Milliseconds 100
}
$player.Close()
}
} catch {
Write-Error "TTS failed: $($_.Exception.Message)"
exit 1
} finally {
$synth.Dispose()
}
# Generate audio file
.\tts.ps1 "Bonjour, comment vas-tu ?"
# Generate AND play immediately
.\tts.ps1 "Bonjour !" -Play
| Parameter | Alias | Default | Description | |-----------|-------|---------|-------------| | -Text | (positional) | required | Text to speak | | -VoiceName | -Voice, -v | auto | Voice name (partial match OK) | | -Language | -Lang, -l | fr | Language: fr, en, de, es, it... | | -Output | -o | auto | Output WAV file path | | -Rate | -r | 0 | Speed: -10 (slow) to +10 (fast) | | -Play | -p | false | Play audio immediately after generation | | -ListVoices | | | Show installed voices |
# French with auto-play
.\tts.ps1 "Bonjour !" -Lang fr -Play
# English, faster
.\tts.ps1 "Hello there!" -Lang en -Rate 2 -Play
# Specific voice
.\tts.ps1 "Salut !" -Voice "Denise" -Play
# List available voices
.\tts.ps1 -ListVoices
Neural voices sound much better than legacy Desktop voices.
Neural voices are built-in. Go to: Settings → Time & Language → Speech → Manage voices
For additional Neural voices (like French Denise):
-ListVoices to verifyMade by Pocus 🎩 — AI assistant, with Olive (@Korddie).
安装 Sapi Tts 后,可以对 AI 说这些话来触发它
Help me get started with Sapi Tts
Explains what Sapi Tts does, walks through the setup, and runs a quick demo based on your current project
Use Sapi Tts to windows SAPI5 text-to-speech with Neural voices
Invokes Sapi Tts with the right parameters and returns the result directly in the conversation
What can I do with Sapi Tts in my design & creative workflow?
Lists the top use cases for Sapi Tts, with example commands for each scenario
将技能文件夹放到 ~/.claude/skills/sapi-tts/ 目录(个人级,所有项目可用),或 .claude/skills/sapi-tts/(项目级)。重启 AI 客户端后,用 /sapi-tts 主动调用,或让 AI 根据上下文自动发现并使用。
Sapi Tts 支持 Claude、Cursor、OpenClaw,可与这些 AI 平台无缝集成,扩展其能力。
Sapi Tts 可免费安装使用。请查阅仓库了解许可证信息。
Windows SAPI5 text-to-speech with Neural voices. Lightweight alternative to GPU-heavy TTS - zero GPU usage, instant generation. Auto-detects best available voice for your language. Works on Windows 10/11.
Sapi Tts 属于「Design & Creative」分类,该分类的技能帮助 AI 智能体在此领域执行专业任务。
Automate my design & creative tasks using Sapi Tts
Identifies repetitive steps in your workflow and sets up Sapi Tts to handle them automatically