speak-tts について
Apple Silicon Mac向けのローカル音声合成コマンドラインツールです。テキストの音声化や声のクローン、バッチ処理に対応し、ストリーミング再生、分割生成、音声結合も行えます。
主な機能
- 01テキストや文書の音声化
- 02短い録音から声の特徴を複製
- 03ストリーミング再生またはWAV保存
- 04長文の自動分割を含むバッチ処理
- 05複数の音声ファイルの結合
活用シーン
- 01記事を聴ける音声に変換
- 02書籍の章をまとめてオーディオブック化
- 03複数の声でポッドキャスト素材を生成
- 04中断した長時間の音声生成を再開
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ emzod/ speak --skill speak-ttsインストール後、Claude Code で/speak-ttsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.gitignoreREADME.mdbun.lockAGENTS.mdCHANGELOG.md.agentic/README.md.agentic/skill-optimization/SKILL_OPTIMIZED.mdOPTIMIZATION_REPORT.md.agentic/skill-optimization/focus-group-runs/README.mdround3-v2-news-article.mdround1b-v0-podcast.mdround2b-v1-podcast.mdround5b-v4-pdf-audiobook.mdround5a-v4-voice-clone.mdround5c-v5-combined.mdround1a-v0-pdf-audiobook.mdround4-v3-voice-clone.mdround2a-v1-pdf-audiobook.md.agentic/skill-optimization/iterations/SKILL_v1.mdSKILL_v3.mdSKILL_v4.mdSKILL_v5_final.mdSKILL_v0_original.mdSKILL_v2.md.github/workflows/install-test.ymltest.ymldev/Implementation_plan.mdall-docs.txtbug-report.mdbug-report-streaming-hang.md詳細
speak - Claude に話しかけてもらいましょう!
エージェントがリアルタイムであなたに話しかけられるようにします。Apple Silicon 上で動作するローカルのテキスト読み上げ、音声クローン、音声生成機能です。 エージェントがリアルタイムであなたに話しかけられるようにします。Apple Silicon 上で動作する、音声クローン機能を備えたローカル TTS です。
前提条件
| 要件 | 確認方法 | インストール |
|---|---|---|
| Apple Silicon Mac | uname -m → arm64 | Intel はサポートされていません |
| macOS 12.0+ | sw_vers | - |
| sox | which sox | brew install sox |
| ffmpeg | which ffmpeg | brew install ffmpeg |
| poppler(PDF) | which pdftotext | brew install poppler |
入力ソース
| ソース | 例 |
|---|---|
| テキストファイル | speak article.txt |
| Markdown | speak doc.md |
| 直接入力した文字列 | speak "Hello" |
| クリップボード | pbpaste | speak |
| 標準入力 | cat file.txt | speak |
ウェブ記事
lynx -dump -nolist "https://example.com/article" | speak --output article.wav
フォーマットの変換
| フォーマット | 変換コマンド |
|---|---|
pdftotext doc.pdf doc.txt | |
| DOCX | textutil -convert txt doc.docx |
| HTML | pandoc -f html -t plain doc.html > doc.txt |
出力モード
| 目的 | コマンド |
|---|---|
| 後で聴くために保存 | speak text.txt --output file.wav |
| 今すぐ聴く(ストリーミング) | speak text.txt --stream |
| 今すぐ聴く(全体) | speak text.txt --play |
| 両方 | speak text.txt --stream --output file.wav |
デフォルトの動作
speak article.txt # → ~/Audio/speak/article.wav (no playback)
speak "Hello" # → ~/Audio/speak/speak_<timestamp>.wav
ディレクトリの自動作成
| ディレクトリ | 自動作成されますか? |
|---|---|
~/Audio/speak/ | ✓ はい |
~/.chatter/voices/ | ✗ いいえ |
| カスタムディレクトリ | ✗ いいえ |
カスタムディレクトリは必ず先に作成してください:
mkdir -p ~/.chatter/voices/
mkdir -p ~/Audio/custom/
音声クローン
音声クローンは、短い録音からあなたの声の特徴(ピッチ、トーン、話すテンポ)に合った音声を生成します。
品質の目安
- 出力には声の一般的な特徴が反映されますが、完全な複製ではありません
- 品質はサンプルの品質に大きく左右されます
- 15~25 秒が最適です(最短 10 秒、最長 30 秒)
自分の声を録音する
QuickTime を使用する場合:
- QuickTime Player を開き、File → New Audio Recording を選択します
- はっきりとした発話を 20 秒間録音します
- File → Export As → Audio Only (.m4a) を選択します
- WAV に変換します(下記参照)
sox を使用する場合(コマンドライン):
# -d = use default microphone
# Recording starts immediately and stops after 25 seconds
sox -d -r 24000 -c 1 ~/.chatter/voices/my_voice.wav trim 0 25
必要なフォーマットへの変換
音声サンプルは、WAV、24000 Hz、モノラル、10~30 秒でなければなりません。
# From MP3
ffmpeg -i voice.mp3 -ar 24000 -ac 1 voice.wav
# From M4A (QuickTime)
ffmpeg -i voice.m4a -ar 24000 -ac 1 voice.wav
# Trim to 25 seconds
ffmpeg -i long.wav -t 25 -ar 24000 -ac 1 trimmed.wav
# Check sample properties
ffprobe -i voice.wav 2>&1 | grep -E "Duration|Stream"
# Should show: Duration ~15-25s, 24000 Hz, mono
自分の声を使う
# Create directory
mkdir -p ~/.chatter/voices/
# Move sample
mv voice.wav ~/.chatter/voices/my_voice.wav
# Test
speak "Testing my voice" --voice ~/.chatter/voices/my_voice.wav --stream
# Use for content
speak notes.txt --voice ~/.chatter/voices/my_voice.wav --output presentation.wav
パスの要件:
- ✓ 動作します:
~/.chatter/voices/my_voice.wav(チルダはシェルによって展開されます) - ✓ 動作します:
/Users/name/.chatter/voices/my_voice.wav - ✗ 失敗します:
my_voice.wav(相対パス) - ✗ 失敗します:
./voices/my_voice.wav(相対パス)
音声サンプルのヒント
| 良いサンプル | 悪いサンプル |
|---|---|
| 静かな部屋 | 背景ノイズ |
| 自然なペース | 急いだ話し方、または単調な話し方 |
| 明瞭な発音 | ぼそぼそした話し方 |
| 変化に富んだ内容 | 繰り返しの多いフレーズ |
デフォルトの音声
--voice を省略すると、組み込みのデフォルト音声が使われます:
speak "Hello world" --stream # Uses default voice
感情タグ
タグは、話し言葉ではなく実際に聞こえる効果音を生成します:
speak "[sigh] Monday again." --stream
# Output: (sigh sound) "Monday again."
| タグ | 効果 |
|---|---|
[laugh] | 笑い声 |
[chuckle] | 軽い含み笑い |
[sigh] | ため息 |
[gasp] | 息をのむ音 |
[groan] | うめき声 |
[clear throat] | 咳払い |
[cough] | 咳 |
[crying] | 泣き声 |
[singing] | 歌うような発話 |
サポート対象外: [pause]、[whisper](無視されます)
間を置くには: 句読点を使います:"Wait... let me think."
バッチ処理
mkdir -p ~/Audio/book/
speak ch01.txt ch02.txt ch03.txt --output-dir ~/Audio/book/
# Creates: ch01.wav, ch02.wav, ch03.wav
# With auto-chunking (for long files)
speak chapters/*.txt --output-dir ~/Audio/book/ --auto-chunk
# Skip completed files
speak chapters/*.txt --output-dir ~/Audio/book/ --skip-existing
自動チャンク分割の動作
バッチ処理で --auto-chunk を使う場合:
- 各入力ファイルは個別にチャンク分割されます
- チャンクが生成され、ファイルごとに自動で連結されます
- 最終出力:入力ファイルごとに 1 つの
.wavファイル(例:ch01.wav) - 中間チャンクは削除されます(
--keep-chunksを指定した場合を除く)
チャンクを手動で連結する必要はありません — 最終的な章のファイルだけを連結してください。
音声の連結
# Explicit order (recommended)
speak concat ch01.wav ch02.wav ch03.wav --output book.wav
# Glob pattern (REQUIRES zero-padded filenames)
speak concat audiobook/*.wav --output book.wav
ゼロ埋めのルール
正しい連結順にするために重要です:
| ファイル | 正しい形式 | 誤った形式 |
|---|---|---|
| 1-9 | 01、02、...、09 | 1、2、...、9 |
| 10-99 | 01、02、...、99 | 1、10、2、... |
| 100+ | 001、002、...、999 | 1、100、2、... |
理由: シェルのグロブ展開では、アルファベット順に並べ替えられます。1, 10, 2 と 01, 02, 10 の違いです。
PDFからオーディオブックへの変換(全ワークフロー)
ステップ 1:章の境界を見つける
# Preview table of contents
pdftotext -f 1 -l 5 textbook.pdf toc.txt
cat toc.txt # Note chapter page numbers
# Or search for "Chapter" markers
pdftotext textbook.pdf - | grep -n "Chapter"
ステップ 2:章を抽出する(ゼロ埋めすること!)
# For 100-page book with ~10 chapters
pdftotext -f 1 -l 12 -layout textbook.pdf ch01.txt
pdftotext -f 13 -l 25 -layout textbook.pdf ch02.txt
pdftotext -f 26 -l 38 -layout textbook.pdf ch03.txt
# ... continue for all chapters
ステップ 3:所要時間を見積もる
speak --estimate ch*.txt
# Shows: total audio duration, generation time, storage needed
# Quick estimates:
# 1 page ≈ 2 min audio ≈ 1 min generation
# 100 pages ≈ 200 min audio ≈ 100 min generation ≈ 500 MB
ステップ 4:音声を生成する
mkdir -p audiobook/
speak ch01.txt ch02.txt ch03.txt --output-dir audiobook/ --auto-chunk
# Creates: audiobook/ch01.wav, audiobook/ch02.wav, audiobook/ch03.wav
ステップ 5:連結する
speak concat audiobook/ch01.wav audiobook/ch02.wav audiobook/ch03.wav --output complete_audiobook.wav
# Or with glob (only if zero-padded):
speak concat audiobook/ch*.wav --output complete_audiobook.wav
PDFのトラブルシューティング
| 問題 | 解決策 |
|---|---|
| テキストが空、または文字化けしている | スキャンされたPDFです。OCRを使用します:brew install tesseract |
| エンコーディングが正しくない | 次を試します:pdftotext -enc UTF-8 doc.pdf |
| 単語数を確認する | pdftotext doc.pdf - | wc -w(100を超えている必要があります) |
複数の音声によるコンテンツ
mkdir -p podcast/scripts podcast/wav
echo "Welcome to the show." > podcast/scripts/01_host.txt
echo "Thanks for having me." > podcast/scripts/02_guest.txt
speak podcast/scripts/01_host.txt --voice ~/.chatter/voices/host.wav --output podcast/wav/01.wav
speak podcast/scripts/02_guest.txt --voice ~/.chatter/voices/guest.wav --output podcast/wav/02.wav
speak concat podcast/wav/01.wav podcast/wav/02.wav --output podcast.wav
オプション一覧
| オプション | 説明 | デフォルト |
|---|---|---|
--stream | 生成しながらストリーミングする | false |
--play | 完了後に再生する | false |
--output <path> | 出力ファイル | ~/Audio/speak/ |
--output-dir <dir> | バッチ出力ディレクトリ | - |
--voice <path> | 音声サンプル(フルパス) | default |
--timeout <sec> | ファイルごとのタイムアウト | 300 |
--auto-chunk | 長いドキュメントを分割する | false |
--chunk-size <n> | チャンクあたりの文字数 | 6000 |
--resume <file> | マニフェストから再開する | - |
--keep-chunks | 中間ファイルを保持する | false |
--skip-existing | 出力が存在する場合はスキップする | false |
--estimate | 所要時間の見積もりを表示する | false |
--dry-run | プレビューのみを行う | false |
--quiet | 出力を抑制する | false |
コマンド
| コマンド | 説明 |
|---|---|
speak setup | 環境をセットアップする |
speak health | システムの状態を確認する |
speak models | TTSモデルを一覧表示する |
speak concat | 音声を連結する |
speak daemon kill | TTSサーバーを停止する |
speak config | 設定を表示する |
パフォーマンス
| 指標 | 値 |
|---|---|
| コールドスタート | 約4~8秒 |
| ウォームスタート | 約3~8秒 |
| 速度 | 0.3~0.5x RTF(リアルタイムより高速) |
| ストレージ | 約2.5 MB/分、約150 MB/時間 |
再開機能
中断された長時間の生成を再開する場合:
# Single file with auto-chunk — use --resume
speak long.txt --auto-chunk --output book.wav
# If interrupted, manifest saved at ~/Audio/speak/manifest.json
speak --resume ~/Audio/speak/manifest.json
# Batch processing — use --skip-existing
speak ch*.txt --output-dir audiobook/ --auto-chunk
# If interrupted, re-run same command:
speak ch*.txt --output-dir audiobook/ --auto-chunk --skip-existing
よくあるエラー
| エラー | 原因 | 解決策 |
|---|---|---|
| "Voice file not found" | 相対パス | フルパスを使用します:~/.chatter/voices/x.wav |
| "Invalid WAV format" | 仕様が正しくない | 変換します:ffmpeg -i in.wav -ar 24000 -ac 1 out.wav |
| "Voice sample too short" | 10秒未満 | 15~25秒録音します |
| "Output directory doesn't exist" | 作成されていない | mkdir -p dirname/ |
| "sox not found" | インストールされていない | brew install sox |
| 連結順が乱れている | ゼロ埋めされていない | 1、2 ではなく、01、02 を使用します |
| タイムアウト | 生成に5分以上かかる | --auto-chunk または --timeout 600 を使用します |
| "Server not running" | 古いデーモン | speak daemon kill && speak health |
セットアップ
speak "test" # Auto-setup on first run (downloads model ~500MB)
speak setup # Or manual setup
speak health # Verify everything works
サーバー管理
サーバーは自動起動し、1時間アイドル状態が続くとシャットダウンします。
speak health # Check status
speak daemon kill # Stop manually