Skip to content
Back to skills

Tts

ASecurity

Text-to-speech with edge-tts (primary, high-quality neural voices) and macOS say (fallback). Supports Korean, English, Japanese, and 40+ languages. Includes Telegram voice delivery workflow.

  • 4 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added June 4, 2026
toolspythonbashapi

Works with

  • cli
  • api

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned June 4, 2026

npx -y skills add lidge-jun/cli-jaw-skills --skill tts --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Tts?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Tts
[![Security: A β€” Skills Directory](https://www.skillsdirectory.com/api/skills/lidge-jun-tts/badge)](https://www.skillsdirectory.com/skills/lidge-jun-tts)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: tts
description: "Text-to-speech with edge-tts (primary, high-quality neural voices) and macOS say (fallback). Supports Korean, English, Japanese, and 40+ languages. Includes Telegram voice delivery workflow."
metadata:
  {
    "openclaw":
      {
        "emoji": "πŸ”Š",
        "requires": "edge-tts (pip), ffmpeg (brew)",
        "install": "pip install edge-tts && brew install ffmpeg",
      },
  }
---

# Text-to-Speech

## Tool Priority

| Tool | Quality | Languages | File Output | Use When |
|------|---------|-----------|-------------|----------|
| **edge-tts** (primary) | Neural, natural | 40+ | Fast, reliable | Default for all TTS tasks |
| **macOS say** (fallback) | Robotic | ~30 | ⚠️ Hangs on Korean | English-only speaker output |

> ⚠️ macOS `say -o` hangs indefinitely for Korean text. Always use edge-tts for Korean file output.

## Quick Start (edge-tts)

### Install

```bash
pip install edge-tts  # In your project venv
brew install ffmpeg   # For format conversion
```

### Generate Voice File

Write a Python script (heredoc/inline causes encoding issues with non-ASCII text):

```python
# /tmp/tts_gen.py
import asyncio, edge_tts

async def main():
    text = "Hello! This is a test voice message from Jaw agent."
    voice = "en-US-JennyNeural"  # or "ko-KR-SunHiNeural" for Korean
    comm = edge_tts.Communicate(text, voice)
    await comm.save("/tmp/voice.mp3")

asyncio.run(main())
```

```bash
python3 /tmp/tts_gen.py
```

### Send to Telegram as Voice Message

```bash
# Convert to OGG Opus (Telegram voice format)
ffmpeg -y -i /tmp/voice.mp3 -c:a libopus /tmp/voice.ogg

# Send via Bot API (use python requests β€” curl multipart may hang)
python3 /tmp/tg_voice.py
```

```python
# /tmp/tg_voice.py
import json, os, requests

with open(os.path.expanduser("~/.cli-jaw/settings.json")) as f:
    s = json.load(f)
token = s["telegram"]["token"]
chat_id = s["telegram"]["allowedChatIds"][-1]

with open("/tmp/voice.ogg", "rb") as f:
    r = requests.post(
        f"https://api.telegram.org/bot{token}/sendVoice",
        data={"chat_id": chat_id, "caption": "Voice message"},
        files={"voice": f}
    )
print(r.status_code, r.json().get("ok"))
```

## Available Voices

### Korean (Recommended)

| Voice | Gender | Style |
|-------|--------|-------|
| `ko-KR-SunHiNeural` | Female | Friendly, natural |
| `ko-KR-InJoonNeural` | Male | Friendly, natural |
| `ko-KR-HyunsuMultilingualNeural` | Male | Multilingual capable |

### English

| Voice | Gender | Style |
|-------|--------|-------|
| `en-US-JennyNeural` | Female | Natural, conversational |
| `en-US-GuyNeural` | Male | Natural, conversational |
| `en-US-AriaNeural` | Female | Professional |
| `en-GB-SoniaNeural` | Female | British |

### Japanese

| Voice | Gender |
|-------|--------|
| `ja-JP-NanamiNeural` | Female |
| `ja-JP-KeitaNeural` | Male |

### List All Voices

```bash
edge-tts --list-voices                    # All voices
edge-tts --list-voices | grep ko-KR      # Korean only
edge-tts --list-voices | grep en-US      # US English only
```

## Advanced Options

### Speed and Pitch Control

```python
comm = edge_tts.Communicate(
    text,
    "ko-KR-SunHiNeural",
    rate="+20%",     # Speed: -50% to +100%
    pitch="+5Hz",    # Pitch adjustment
    volume="+0%"     # Volume adjustment
)
```

### SSML for Fine Control

```python
ssml = """
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-US-JennyNeural">
    <prosody rate="medium" pitch="medium">
      Hello there. <break time="500ms"/> Pausing briefly before continuing.
    </prosody>
  </voice>
</speak>
"""
```

### Batch Generation

```python
import asyncio, edge_tts

async def generate(text, output, voice="en-US-JennyNeural"):
    comm = edge_tts.Communicate(text, voice)
    await comm.save(output)

async def main():
    tasks = [
        generate("First message", "/tmp/msg1.mp3"),
        generate("Second message", "/tmp/msg2.mp3"),
        generate("Third in Korean", "/tmp/msg3.mp3", "ko-KR-SunHiNeural"),
    ]
    await asyncio.gather(*tasks)

asyncio.run(main())
```

## macOS `say` (Fallback β€” English Only)

```bash
say "Hello world"                          # Speak through speakers
say -v Samantha "Hello world"              # Specific voice
say -r 200 "Fast speech"                   # Speed control
say -o /tmp/out.aiff "Hello world"         # Save to file (English OK)
say -v '?' | grep en_                      # List English voices
```

> ⚠️ macOS `say -o` hangs indefinitely for Korean/CJK text. Use edge-tts for non-ASCII file output.

## Troubleshooting

| Problem | Solution |
|---------|----------|
| `edge-tts` not found | `pip install edge-tts` in active venv |
| Korean `say -o` hangs | Use edge-tts instead |
| Telegram curl hangs | Use python `requests` instead |
| OGG conversion fails | `brew install ffmpeg` |
| Inline Python encoding error | Write to .py file first, then `python3 file.py` |

## Complete Workflow Example

```bash
# 1. Generate β†’ 2. Convert β†’ 3. Send β†’ 4. Cleanup
python3 /tmp/tts_gen.py
ffmpeg -y -i /tmp/voice.mp3 -c:a libopus /tmp/voice.ogg
python3 /tmp/tg_voice.py
rm /tmp/tts_gen.py /tmp/tg_voice.py /tmp/voice.mp3 /tmp/voice.ogg
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…