# Config Voice

> Use when user asks to configure voice profiles, manage ASR (Automatic Speech Recognition) settings, add/update voice configurations, perform speech-to-text conversion, or set up voice models like Qwen ASR, OpenAI Whisper, Gemini ASR.

- **Type:** Skill
- **Install:** `agentstack add skill-vibesurf-ai-claude-surf-config-voice`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [vibesurf-ai](https://agentstack.voostack.com/s/vibesurf-ai)
- **Installs:** 0
- **Category:** [AI & ML](https://agentstack.voostack.com/c/ai-and-ml)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [vibesurf-ai](https://github.com/vibesurf-ai)
- **Source:** https://github.com/vibesurf-ai/claude-surf/tree/main/skills/config-voice

## Install

```sh
agentstack add skill-vibesurf-ai-claude-surf-config-voice
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Config Voice - Voice Profile & ASR Management

## Overview

Manage voice profiles for VibeSurf. Configure ASR (Automatic Speech Recognition) providers, models, and perform speech-to-text conversion.

Supported ASR providers:
- **qwen-asr** - Alibaba Qwen ASR models
- **openai-asr** - OpenAI Whisper API
- **gemini-asr** - Google Gemini ASR

## When to Use

- User wants to add a new voice profile for ASR
- User needs to configure speech-to-text settings
- User wants to update voice profile settings (API key, model params, etc.)
- User needs to list or manage existing voice profiles
- User wants to perform voice recognition (ASR) on an audio file
- User wants to see available voice models

## API Endpoints

Base path: `$VIBESURF_ENDPOINT/api/voices`

### Voice Profile Management

| Action | Method | Endpoint | Description |
|--------|--------|----------|-------------|
| List Profiles | GET | `/api/voices/voice-profiles?active_only=true` | List all voice profiles |
| Get Profile | GET | `/api/voices/{voice_profile_name}` | Get specific profile details |
| Create Profile | POST | `/api/voices/voice-profiles` | Create new voice profile |
| Update Profile | PUT | `/api/voices/voice-profiles/{voice_profile_name}` | Update existing profile |

### ASR (Speech Recognition)

| Action | Method | Endpoint | Description |
|--------|--------|----------|-------------|
| Perform ASR | POST | `/api/voices/asr` | Transcribe audio file to text |

### Model Management

| Action | Method | Endpoint | Description |
|--------|--------|----------|-------------|
| List Models | GET | `/api/voices/models` | Get available voice models |

## Request Examples

### Create ASR Profile

```json
POST /api/voices/voice-profiles
{
  "voice_profile_name": "my-qwen-asr",
  "voice_model_type": "asr",
  "voice_model_name": "qwen-asr",
  "api_key": "sk-...",
  "voice_meta_params": {
    "asr_model_name": "qwen-audio-asr-latest"
  },
  "description": "Qwen ASR for Chinese speech recognition"
}
```

### Create OpenAI Whisper Profile

```json
POST /api/voices/voice-profiles
{
  "voice_profile_name": "my-whisper",
  "voice_model_type": "asr",
  "voice_model_name": "openai-asr",
  "api_key": "sk-...",
  "voice_meta_params": {
    "asr_model_name": "whisper-1",
    "base_url": "https://api.openai.com/v1"  // Optional, for custom endpoints
  },
  "description": "OpenAI Whisper for English transcription"
}
```

### Update Profile

```json
PUT /api/voices/voice-profiles/my-qwen-asr
{
  "api_key": "new-api-key",
  "description": "Updated description",
  "is_active": true
}
```

### Perform ASR (Speech Recognition)

```bash
POST /api/voices/asr
Content-Type: multipart/form-data

Form fields:
- audio_file:  (required) - Audio file to transcribe (wav, mp3, etc.)
- voice_profile_name: "my-qwen-asr" (required) - Name of the voice profile to use
```

**Response:**
```json
{
  "success": true,
  "voice_profile_name": "my-qwen-asr",
  "voice_model_name": "qwen-asr",
  "recognized_text": "Transcribed text from audio",
  "filename": "recording.wav",
  "saved_audio_path": "/workspace/audios/asr-20250210_120000_000.wav"
}
```

## Profile Fields

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| voice_profile_name | string | Yes | Unique profile identifier |
| voice_model_type | string | Yes | Type: `"asr"` or `"tts"` (currently ASR is supported) |
| voice_model_name | string | Yes | Model name: `qwen-asr`, `openai-asr`, `gemini-asr` |
| api_key | string | No | API key for the provider (required for most providers) |
| voice_meta_params | object | No | Model-specific parameters |
| description | string | No | Profile description |
| is_active | bool | No | Whether the profile is active (default: true) |

### voice_meta_params by Provider

**Qwen ASR:**
| Parameter | Type | Description |
|-----------|------|-------------|
| asr_model_name | string | Qwen model name, e.g., `qwen-audio-asr-latest` |

**OpenAI Whisper:**
| Parameter | Type | Description |
|-----------|------|-------------|
| asr_model_name | string | Model name, e.g., `whisper-1` |
| base_url | string | Optional custom base URL for OpenAI-compatible APIs |

**Gemini ASR:**
| Parameter | Type | Description |
|-----------|------|-------------|
| asr_model_name | string | Gemini model name |

## Workflow

### Setting up a Voice Profile

1. **Get available models** → `GET /api/voices/models`
2. **Create profile** → `POST /api/voices/voice-profiles`
3. **Verify profile** → `GET /api/voices/{voice_profile_name}`

### Performing Speech Recognition

1. **Ensure profile exists** → `GET /api/voices/voice-profiles` (list active profiles)
2. **Submit audio for transcription** → `POST /api/voices/asr` with `audio_file` and `voice_profile_name`
3. **Get recognized text** from response `recognized_text` field

## Error Handling

| Error | Solution |
|-------|----------|
| Profile not found | Verify `voice_profile_name` exists: `GET /api/voices/voice-profiles` |
| Profile is inactive | Activate profile: `PUT /api/voices/voice-profiles/{name}` with `"is_active": true` |
| Invalid voice_model_type | Must be `"asr"` or `"tts"` |
| Model not supported | Check available models: `GET /api/voices/models` |
| ASR failed | Check API key is valid and audio file format is supported |

## Notes

- Audio files are saved to `{workspace_dir}/audios/` with timestamp-based filenames
- Supported audio formats depend on the ASR provider (typically WAV, MP3, M4A)
- The `voice_profile_name` parameter is required for ASR requests
- Profiles store API keys encrypted in the database

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [vibesurf-ai](https://github.com/vibesurf-ai)
- **Source:** [vibesurf-ai/claude-surf](https://github.com/vibesurf-ai/claude-surf)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-vibesurf-ai-claude-surf-config-voice
- Seller: https://agentstack.voostack.com/s/vibesurf-ai
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
