**Description**: Generate a daily technology news podcast with AI voice synthesis, covering latest tech/business news from Chinese sources. **Tags**: `audio`, `podcast`, `ai`, `tts`, `news` **Category**: Content Generation ---
Scanned 5/28/2026
Install via CLI
openskills install muzhicaomingwang/ai-ideas# Daily Tech Podcast Generator
**Description**: Generate a daily technology news podcast with AI voice synthesis, covering latest tech/business news from Chinese sources.
**Tags**: `audio`, `podcast`, `ai`, `tts`, `news`
**Category**: Content Generation
---
## Overview
This skill automates the complete workflow of generating a daily tech news podcast:
1. Fetch news from RSS feeds (36氪, 少数派, 虎嗅, etc.)
2. Summarize content using OpenAI GPT-4o-mini
3. Generate script with intro/transitions/outro
4. Synthesize audio using ElevenLabs TTS
5. Generate cover image
6. Output organized files in date-structured directory
**Typical Duration**: 5-8 minutes
**Cost per Run**: ~¥1-2 (OpenAI + ElevenLabs API)
---
## Prerequisites
### Required API Keys
Set these environment variables before running:
```bash
export OPENAI_API_KEY="sk-..."
export ELEVENLABS_API_KEY="..."
```
### Software Dependencies
- Python 3.11+
- Poetry (for dependency management)
- FFmpeg (for audio processing)
### Installation
```bash
cd /path/to/daily-podcast-ai
poetry install
```
---
## Configuration
### 1. Voice Settings (`config/voice.yaml`)
**Key Parameters**:
```yaml
elevenlabs:
voice_settings:
stability: 1.0 # Range: 0.0-1.0 (higher = more stable/consistent)
similarity_boost: 0.75 # Range: 0.0-1.0 (higher = closer to original voice)
style: 0.0 # Range: 0.0-1.0 (higher = more expressive)
use_speaker_boost: true
tts:
voice_id: "SKlxpKXGwoM0E8XpnxNs" # Your cloned voice ID
speed: 1.2 # Range: 0.7-1.2 (1.0 = normal)
hosts:
host_a:
name: "植萌"
role: "主理人 (Main Host)"
voice_id: "SKlxpKXGwoM0E8XpnxNs"
style: "natural, friendly"
```
**Typical Settings**:
- **High Stability (1.0)**: Professional broadcast quality
- **Medium Stability (0.75)**: Balanced naturalness and consistency
- **Low Stability (0.5)**: More expressive but less consistent
### 2. Output Path Logic (`scripts/daily_generate.py`)
**Default Behavior** (Lines 400-410):
```python
base_output_path = Path(output_dir)
if deep_dive:
output_path = base_output_path / date_str / "dailytechnews"
else:
# Classic mode: create date folder with custom subfolder
output_path = base_output_path / date_str / "dailyReport"
```
**Customize Output Structure**:
- **Deep Dive Mode**: `output/{date}/dailytechnews/`
- **Classic Mode**: `output/{date}/dailyReport/`
- Change subfolder name by editing line 407
---
## Usage
### Basic Command
```bash
python scripts/daily_generate.py \
--date YYYY-MM-DD \
--classic \
--output output
```
### Parameters
| Parameter | Description | Default | Example |
|-----------|-------------|---------|---------|
| `--date` | Target date for news | Today | `2026-01-13` |
| `--classic` | Solo narration mode | - | (flag) |
| `--deep-dive` | Dialogue mode (2 hosts) | - | (flag) |
| `--output` | Output directory | `output` | `output` |
### Examples
**Generate today's podcast**:
```bash
python scripts/daily_generate.py --classic
```
**Generate for specific date**:
```bash
python scripts/daily_generate.py --date 2026-01-13 --classic
```
**Deep dive mode (dialogue)**:
```bash
python scripts/daily_generate.py --date 2026-01-13 --deep-dive
```
---
## Output Files
### Directory Structure
```
output/
└── YYYY-MM-DD/
└── dailyReport/ # or "dailytechnews" in deep-dive mode
├── cover-YYYY-MM-DD.png # ~380KB, podcast cover image
├── podcast-YYYY-MM-DD.mp3 # ~12MB, 8-10 minutes audio
├── script-YYYY-MM-DD.md # ~8KB, full script text
└── temp/
├── merged.mp3 # Raw merged audio
├── YYYY-MM-DD_intro.mp3 # Intro segment
├── YYYY-MM-DD_segment_N.mp3
├── YYYY-MM-DD_transition_N.mp3
└── YYYY-MM-DD_outro.mp3
```
### File Details
**1. Cover Image** (`cover-YYYY-MM-DD.png`)
- Format: PNG
- Size: ~380KB
- Dimensions: 1400x1400 (typical)
- Generated by: OpenAI DALL-E or similar
**2. Audio File** (`podcast-YYYY-MM-DD.mp3`)
- Format: MP3, 44.1kHz, 128kbps
- Duration: 8-10 minutes (varies by news volume)
- Segments: 21-25 (intro + N×(segment+transition) + outro)
- Size: ~10-15MB
**3. Script** (`script-YYYY-MM-DD.md`)
- Format: Markdown
- Structure:
- Header (date, article count, categories)
- 开场白 (Intro)
- 新闻内容 (News segments, typically 8-12 articles)
- 结束语 (Outro)
---
## Verification Steps
### 1. Pre-execution Checklist
- [ ] API keys are set: `echo $OPENAI_API_KEY $ELEVENLABS_API_KEY`
- [ ] Voice settings are configured in `config/voice.yaml`
- [ ] Output directory exists: `mkdir -p output`
### 2. During Execution
Monitor console output for:
- ✅ News fetching: Should fetch 10-20 articles from 4 sources
- ✅ Content processing: Should summarize 8-12 selected articles
- ✅ Script generation: Check for intro/segments/transitions/outro
- ✅ Audio synthesis: Should generate 20+ segments
- ✅ Audio merging: Should combine all segments
- ✅ Cover generation: Final step
**Expected Failures** (non-blocking):
- Some RSS feeds may return 404 (e.g., 澎湃新闻) - gracefully handled
### 3. Post-execution Verification
**Check files exist**:
```bash
DATE="2026-01-13" # Replace with your date
ls -lh output/${DATE}/dailyReport/
# Expected output:
# cover-2026-01-13.png (~380KB)
# podcast-2026-01-13.mp3 (~12MB)
# script-2026-01-13.md (~8KB)
```
**Verify audio quality**:
```bash
# Play first 30 seconds
ffplay -t 30 output/${DATE}/dailyReport/podcast-${DATE}.mp3
# Check duration
ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 \
output/${DATE}/dailyReport/podcast-${DATE}.mp3
```
Expected duration: 480-600 seconds (8-10 minutes)
**Verify script content**:
```bash
# Check article count
grep -c "^### " output/${DATE}/dailyReport/script-${DATE}.md
# Expected: 8-12 articles
```
**Quick quality checks**:
- [ ] Voice sounds like target speaker (王植萌)
- [ ] Playback speed is 1.2x (noticeably faster but clear)
- [ ] Audio has smooth transitions between segments
- [ ] No clipping, distortion, or silence gaps
- [ ] Script matches audio content
---
## Customization
### Change Voice Actor
1. Get voice ID from ElevenLabs dashboard
2. Update `config/voice.yaml`:
```yaml
tts:
voice_id: "YOUR_NEW_VOICE_ID"
```
### Adjust Speed/Stability
Edit `config/voice.yaml`:
```yaml
tts:
speed: 1.0 # 1.0 = normal, 1.2 = 20% faster
elevenlabs:
voice_settings:
stability: 0.75 # Lower = more expressive
```
### Change Output Directory Name
Edit `scripts/daily_generate.py` line 407:
```python
output_path = base_output_path / date_str / "YOUR_CUSTOM_NAME"
```
### Add/Remove News Sources
Edit `config/news_sources.yaml` (or equivalent):
```yaml
sources:
- name: "36氪"
url: "https://36kr.com/feed"
- name: "你的新源"
url: "https://example.com/rss"
```
---
## Troubleshooting
### API Key Errors
```
Error: OpenAI API key not found
```
**Solution**: `export OPENAI_API_KEY="sk-..."`
### Voice Synthesis Fails
```
Error: ElevenLabs API rate limit exceeded
```
**Solution**:
- Wait 60 seconds and retry
- Check quota at https://elevenlabs.io/subscription
### RSS Feed 404 Errors
```
❌ 请求失败: 404 Client Error
```
**Solution**: Non-blocking error, system continues with other sources
### Audio Quality Issues
- **Robotic voice**: Lower stability (0.7-0.85)
- **Too fast**: Reduce speed (1.0-1.1)
- **Inconsistent**: Increase stability (0.9-1.0)
- **Mumbling**: Check voice_id is correct
### Output Directory Not Found
```
Error: output/2026-01-13/dailyReport/ not found
```
**Solution**: Check line 407 in `scripts/daily_generate.py` matches expected path
---
## Cost Estimation
### Per Episode (8-10 minutes)
- **OpenAI GPT-4o-mini**: ~¥0.5
- Summarization: 10 articles × 3000 tokens input
- Script generation: 2000 tokens output
- **ElevenLabs TTS**: ~¥0.8-1.2
- Character count: ~3000-4000 Chinese characters
- Multilingual v2 model
- **Total**: ~¥1.3-1.7 per episode
### Monthly (30 episodes)
- **Total**: ~¥40-50
---
## Advanced Usage
### Batch Generation (Multiple Dates)
```bash
for DATE in 2026-01-{01..07}; do
python scripts/daily_generate.py --date $DATE --classic
sleep 60 # Avoid rate limits
done
```
### Custom Script Template
Override intro/outro in `config/voice.yaml`:
```yaml
script:
intro_template: "你好,这里是{date}的科技播报..."
outro_template: "今天就到这里,明天见!"
```
### Post-processing
```bash
# Normalize audio volume
ffmpeg -i podcast.mp3 -filter:a loudnorm output.mp3
# Add ID3 tags
ffmpeg -i podcast.mp3 -metadata title="Tech News ${DATE}" \
-metadata artist="Daily Podcast AI" output.mp3
```
---
## Related Resources
- **Project README**: `README.md`
- **Voice Configuration**: `config/voice.yaml`
- **Main Script**: `scripts/daily_generate.py`
- **Plan Document**: `/Users/qitmac001395/.claude/plans/async-riding-bumblebee.md`
---
## Changelog
### 2026-01-13
- Initial skill creation
- Documented workflow from successful podcast generation
- Voice settings: Stability 1.0, Speed 1.2x
- Output path: `output/{date}/dailyReport/`
No comments yet. Be the first to comment!