[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6G7H08Y2QJZ2WG407JR9B66":3,"skill-same:01M6G7H08Y2QJZ2WG407JR9B66":102},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":45,"linkOnly":46,"markdownContent":47,"markdownBody":48,"frontMatter":49,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":59,"install":60,"resources":73},"01M6G7H08Y2QJZ2WG407JR9B66","doubao-open-tts",null,"Text-to-Speech service using Doubao (Volcano Engine) API with 200+ voices, interactive voice selection, and multilingual support","kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fxdrshjr\u002Fdoubao-api-open-tts\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],"doubao open tts","open","tts","engine","text-to-speech","with","volcano","service","selection","multilingual","opencode","interactive","python","text","voice","Audio","api","speech","support","2026-11-10 10:12:30",false,"---\nname: doubao-open-tts\ndescription: Text-to-Speech service using Doubao (Volcano Engine) API with 200+ voices, interactive voice selection, and multilingual support\nlicense: MIT\ncompatibility: opencode\nmetadata:\n  category: audio\n  language: python\n  provider: volcano-engine\n---\n\n# Doubao Open TTS\n\nText-to-Speech (TTS) service using Doubao (Volcano Engine) API V1 interface to convert text into natural-sounding speech.\n\n## Features\n\n- ?️ **200+ Voice Options** - Default: Shiny (灿灿) for general scenarios\n- ? **Multiple Audio Formats** - Supports mp3, pcm, wav\n- ⚡ **Adjustable Parameters** - Speed and volume control\n- ? **Dual Interface** - Command-line tool + Python API\n- ? **Voice Categorization** - Browse voices by category\n- ? **Mandatory API Configuration** - Requires API credentials; stops and prompts user if not configured (default voice only available with explicit user confirmation)\n\n## Quick Start for Agents\n\n**重要提示**: 当检测到没有API配置时，Agent必须**立即停止**并询问用户是否配置API，**不允许**直接使用默认音色生成音频，除非用户明确坚持使用默认音色。\n\nWhen using this SKILL, the Agent should follow this workflow:\n\n### Step 1: Check API Configuration\n\nFirst, check if API credentials are configured:\n\n```python\nfrom scripts.tts import check_api_config, setup_api_config\n\n# Check if API is configured\nconfig = check_api_config()\nif not config:\n    # API not configured, MUST stop and ask user\n    # DO NOT proceed with default voice\n    print(\"⚠️ API credentials not found. Cannot proceed without API configuration.\")\n    # ... ask user for credentials or if they want to use default\n```\n\n### Step 2: Handle Missing API Configuration\n\n**如果API凭证缺失，Agent必须停止并询问用户**: 用户可以选择配置API，或者明确坚持使用默认音色（仅当用户明确要求时才允许）。\n\n```\nAgent: I need API credentials to use the Doubao TTS service. \n       Please provide the following information:\n\n1. App ID (APPID)\n2. Access Token\n3. Secret Key\n\nYou can get these from: https:\u002F\u002Fconsole.volcengine.com\u002F\n\nPlease enter your App ID:\n\nUser: 4269953601\n\nAgent: Please enter your Access Token:\n\nUser: uAGE3iP8nJf3ewu-d6U1P6Jthv7i1DH7\n\nAgent: Please enter your Secret Key:\n\nUser: Dfta36aYgcdqY-ylHoh9FQyqiERS5iTv\n\nAgent: [Saves credentials to .env file]\n       ✅ API configuration saved successfully!\n```\n\n**用户选择**: 如果用户不想配置API但坚持使用默认音色:\n```\nUser: 我不想配置API，就用默认音色吧\n\nAgent: ⚠️ 确认使用默认音色吗？这将使用内置的默认音色生成音频。\n       输入 'yes' 确认使用默认音色，或提供API凭证以获得更好的体验。\n\nUser: yes\n\nAgent: [继续执行，使用默认音色]\n```\n\n### Step 3: Use the Service\n\nAfter API is configured OR user explicitly confirmed to use default voice:\n\n```python\nfrom scripts.tts import VolcanoTTS\n\ntts = VolcanoTTS()\noutput = tts.synthesize(\"Hello world\", output_file=\"output.mp3\")\n```\n\n## API Configuration Detection\n\n### Function: `check_api_config()`\n\nChecks if API credentials are available. Returns config dict or None.\n\n```python\nfrom scripts.tts import check_api_config\n\nconfig = check_api_config()\nif config:\n    print(f\"App ID: {config['app_id']}\")\n    print(f\"Access Token: {config['access_token'][:10]}...\")\n    print(f\"Secret Key: {config['secret_key'][:10]}...\")\nelse:\n    print(\"API not configured\")\n```\n\n### Function: `setup_api_config(app_id, access_token, secret_key, voice_type=None)`\n\nSaves API credentials to the .env file in the SKILL directory.\n\n```python\nfrom scripts.tts import setup_api_config\n\n# Save credentials\nsetup_api_config(\n    app_id=\"4269953601\",\n    access_token=\"uAGE3iP8nJf3ewu-d6U1P6Jthv7i1DH7\",\n    secret_key=\"Dfta36aYgcdqY-ylHoh9FQyqiERS5iTv\",\n    voice_type=\"zh_female_cancan_mars_bigtts\"  # optional\n)\n\nprint(\"✅ Configuration saved to .env file\")\n```\n\n### Complete Agent Workflow Example\n\n```python\nfrom scripts.tts import check_api_config, setup_api_config, VolcanoTTS\n\ndef synthesize_with_auto_config(text, output_file=\"output.mp3\", use_default_voice=False):\n    \"\"\"\n    Synthesize speech with automatic API configuration.\n    \n    IMPORTANT: If API is not configured, this function will STOP and ask user.\n    It will NOT automatically use default voice unless user explicitly confirms.\n    \"\"\"\n    # Step 1: Check if API is configured\n    config = check_api_config()\n    \n    if not config:\n        # Step 2: STOP and ask user - DO NOT proceed automatically\n        print(\"? API Configuration Required\")\n        print(\"=\" * 50)\n        print(\"\\n⚠️ No API credentials found. You have two options:\")\n        print(\"\\nOption 1: Configure API (Recommended)\")\n        print(\"  Please visit https:\u002F\u002Fconsole.volcengine.com\u002F to get your credentials\")\n        print(\"\\nOption 2: Use Default Voice\")\n        print(\"  ⚠️ Only available if you explicitly confirm\")\n        \n        # Ask user what they want to do\n        choice = input(\"\\nEnter '1' to configure API, or '2' to use default voice: \").strip()\n        \n        if choice == '1':\n            # Configure API\n            print(\"\\nRequired information:\")\n            app_id = input(\"1. Enter your App ID: \").strip()\n            access_token = input(\"2. Enter your Access Token: \").strip()\n            secret_key = input(\"3. Enter your Secret Key: \").strip()\n            \n            # Optional: ask for preferred voice\n            print(\"\\n?️ Optional: Select a default voice (press Enter to use Shiny)\")\n            voice_type = input(\"Voice type (or voice name): \").strip()\n            \n            # Save configuration\n            setup_api_config(app_id, access_token, secret_key, voice_type or None)\n            print(\"\\n✅ Configuration saved!\")\n            \n        elif choice == '2':\n            # User explicitly chose to use default voice\n            confirm = input(\"\\n⚠️ Are you sure you want to use the default voice? (yes\u002Fno): \").strip().lower()\n            if confirm != 'yes':\n                print(\"❌ Cancelled. Please configure API to proceed.\")\n                return None\n            use_default_voice = True\n            print(\"\\n⚠️ Using default voice as requested...\")\n        else:\n            print(\"❌ Invalid choice. Please configure API to proceed.\")\n            return None\n    \n    # Step 3: Use the service\n    if use_default_voice:\n        # Use default voice (only when user explicitly confirmed)\n        tts = VolcanoTTS(use_default=True)\n    else:\n        tts = VolcanoTTS()\n    \n    output_path = tts.synthesize(text, output_file=output_file)\n    return output_path\n\n# Use it\noutput = synthesize_with_auto_config(\"Hello, this is a test\")\nif output:\n    print(f\"Audio saved to: {output}\")\nelse:\n    print(\"Operation cancelled - API configuration required\")\n```\n\n## Configuration Methods\n\n## Installation\n\n```bash\ncd skills\u002Fvolcano-tts\npip install -r requirements.txt\n```\n\n## Configuration\n\n### Method 1: Environment Variables\n\n```bash\nexport VOLCANO_TTS_APPID=\"your_app_id\"\nexport VOLCANO_TTS_ACCESS_TOKEN=\"your_access_token\"\nexport VOLCANO_TTS_SECRET_KEY=\"your_secret_key\"\nexport VOLCANO_TTS_VOICE_TYPE=\"zh_female_cancan_mars_bigtts\"  # Optional: set default voice\n```\n\n### Method 2: .env File\n\nCopy `.env.example` to `.env` and fill in your credentials:\n\n```bash\ncp .env.example .env\n# Edit the .env file with your credentials\n```\n\n## Usage\n\n### Command Line\n\n```bash\n# Basic usage (uses default voice: Shiny)\npython scripts\u002Ftts.py \"Hello, this is a test of Doubao text-to-speech service\"\n\n# Specify output file and format\npython scripts\u002Ftts.py \"Welcome to use TTS\" -o output.mp3 -e mp3\n\n# Read text from file\npython scripts\u002Ftts.py -f input.txt -o output.mp3\n\n# Adjust parameters\npython scripts\u002Ftts.py \"Custom voice\" --speed 1.2 --volume 0.8 -v zh_female_cancan_mars_bigtts\n\n# List all available voices\npython scripts\u002Ftts.py --list-voices\n\n# List voices by category\npython scripts\u002Ftts.py --list-voices --category \"General-Multilingual\"\n\n# Use different cluster\npython scripts\u002Ftts.py \"Hello\" --cluster volcano_tts\n\n# Enable debug mode\npython scripts\u002Ftts.py \"Test\" --debug\n```\n\n### Python API\n\n```python\nfrom scripts.tts import VolcanoTTS, VOICE_TYPES, VOICE_CATEGORIES\n\n# Initialize client\ntts = VolcanoTTS(\n    app_id=\"your_app_id\",\n    access_token=\"your_access_token\",\n    secret_key=\"your_secret_key\",\n    voice_type=\"zh_female_cancan_mars_bigtts\"  # Optional: set default voice\n)\n\n# List available voices\nprint(\"All voices:\", tts.list_voices())\nprint(\"General voices:\", tts.list_voices(\"General-Normal\"))\n\n# Change voice\ntts.set_voice(\"zh_male_xudong_conversation_wvae_bigtts\")  # Set to \"Happy Xiaodong\"\n\n# Synthesize speech\noutput_path = tts.synthesize(\n    text=\"Hello, this is Doubao text-to-speech\",\n    voice_type=\"zh_female_cancan_mars_bigtts\",  # Optional: override default\n    encoding=\"mp3\",\n    cluster=\"volcano_tts\",\n    speed=1.0,\n    volume=1.0,\n    output_file=\"output.mp3\"\n)\n\nprint(f\"Audio saved to: {output_path}\")\n```\n\n## Interactive Voice Selection\n\nThe SKILL supports interactive voice selection workflow for Agent-User collaboration:\n\n### Workflow\n\n1. **Agent Prompts User** - Agent asks user to select a voice\n2. **Display Voice Options** - Show recommended voices by category\n3. **User Selection** - User tells Agent their preferred voice\n4. **Agent Calls Skill** - Agent uses the selected voice to generate audio\n\n### Python API for Interactive Selection\n\n**重要**: 在使用以下代码之前，必须先检查API配置。如果没有配置，必须停止并询问用户。\n\n```python\nfrom scripts.tts import (\n    get_voice_selection_prompt,\n    find_voice_by_name,\n    get_voice_info,\n    check_api_config,\n    VolcanoTTS\n)\n\n# Step 0: Check API configuration FIRST\nconfig = check_api_config()\nif not config:\n    print(\"⚠️ API credentials not found. Please configure API first.\")\n    print(\"Visit: https:\u002F\u002Fconsole.volcengine.com\u002F\")\n    # STOP here and ask user to configure API\n    # DO NOT proceed with voice selection until API is configured\n    # OR user explicitly confirms to use default voice\n    \n# Step 1: Get the selection prompt to show user\nprompt = get_voice_selection_prompt()\nprint(prompt)\n# Agent displays this to user and waits for response\n\n# Step 2: User responds with their choice (e.g., \"Shiny\" or \"灿灿\")\nuser_input = \"Shiny\"  # This comes from user\n\n# Step 3: Find the voice_type from user input\nvoice_type, voice_name = find_voice_by_name(user_input)\nif voice_type:\n    print(f\"Selected voice: {voice_name} ({voice_type})\")\n    \n    # Get detailed info\n    info = get_voice_info(voice_type)\n    print(f\"Category: {info['category_display']}\")\n    \n    # Step 4: Use the voice to synthesize (API already verified)\n    tts = VolcanoTTS(\n        app_id=\"your_app_id\",\n        access_token=\"your_access_token\",\n        secret_key=\"your_secret_key\"\n    )\n    \n    output_path = tts.synthesize(\n        text=\"Hello, this is the selected voice\",\n        voice_type=voice_type,\n        output_file=\"output.mp3\"\n    )\n    print(f\"Audio saved to: {output_path}\")\nelse:\n    print(\"Voice not found. Please select a valid voice.\")\n    # DO NOT automatically use default - ask user instead\n```\n\n### Example Agent-User Conversation\n\n```\nAgent: ?️ Please select a voice for text-to-speech synthesis:\n\nHere are our recommended voices by category:\n\n[General - Normal]\n  • 灿灿\u002FShiny [DEFAULT] (Chinese) -> voice_type: zh_female_cancan_mars_bigtts\n  • 快乐小东 (Chinese) -> voice_type: zh_male_xudong_conversation_wvae_bigtts\n  • 亲切女声 (Chinese) -> voice_type: zh_female_qinqienvsheng_moon_bigtts\n\n[Roleplay]\n  • 纯真少女 (Chinese) -> voice_type: ICL_zh_female_chunzhenshaonv_e588402fb8ad_tob\n  • 霸道总裁 (Chinese) -> voice_type: ICL_zh_male_badaozongcai_v1_tob\n  • 撒娇男友 (Chinese) -> voice_type: ICL_zh_male_sajiaonanyou_tob\n\n[Video Dubbing]\n  • 猴哥 (Chinese) -> voice_type: zh_male_sunwukong_mars_bigtts\n  • 熊二 (Chinese) -> voice_type: zh_male_xionger_mars_bigtts\n  • 佩奇猪 (Chinese) -> voice_type: zh_female_peiqi_mars_bigtts\n\n? Tips:\n  • You can say the voice name (e.g., 'Shiny', '猴哥', '霸道总裁')\n  • Or provide the voice_type directly\n  • Type 'list all' to see all 200+ available voices\n  • Press Enter to use the default voice (Shiny) - **only if API is configured**\n\n⚠️ **Note**: Voice selection requires API credentials. If not configured, you must configure API first or explicitly confirm to use default voice.\n\nWhich voice would you like to use?\n\nUser: I want to use 猴哥\n\nAgent: [Calls skill with voice_type=\"zh_male_sunwukong_mars_bigtts\"]\n       ✅ Generated audio with voice: 猴哥\n```\n\n### Supported Input Formats\n\nThe `find_voice_by_name()` function supports:\n- **Direct voice_type**: `zh_female_cancan_mars_bigtts`\n- **Chinese name**: `灿灿`, `猴哥`, `霸道总裁`\n- **English alias**: `Shiny`, `Skye`, `Alvin`\n- **Partial match**: `灿灿` matches `灿灿\u002FShiny`\n\n## Parameters\n\n| Parameter | Description | Default | Options |\n|-----------|-------------|---------|---------|\n| voice_type | Voice type | zh_female_cancan_mars_bigtts | See voice list below |\n| encoding | Audio format | mp3 | mp3, pcm, wav |\n| sample_rate | Sample rate | 24000 | 8000, 16000, 24000 |\n| speed | Speech speed | 1.0 | 0.5 - 2.0 |\n| volume | Volume level | 1.0 | 0.5 - 2.0 |\n| cluster | Cluster name | volcano_tts | volcano_tts |\n\n## Voice Categories\n\n### General - Multilingual (with emotion support)\n\nSupported emotions: happy, sad, angry, surprised, fear, hate, excited, coldness, neutral, depressed, lovey-dovey, shy, comfort, tension, tender, storytelling, radio, magnetic, advertising, vocal-fry, ASMR, news, entertainment, dialect\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| zh_male_lengkugege_emo_v2_mars_bigtts | Cold Brother (Emotion) | Chinese |\n| zh_female_tianxinxiaomei_emo_v2_mars_bigtts | Sweet Xiaomei (Emotion) | Chinese |\n| zh_female_gaolengyujie_emo_v2_mars_bigtts | Cold Lady (Emotion) | Chinese |\n| zh_male_aojiaobazong_emo_v2_mars_bigtts | Proud CEO (Emotion) | Chinese |\n| zh_male_guangzhoudege_emo_mars_bigtts | Guangzhou Brother (Emotion) | Chinese |\n| zh_male_jingqiangkanye_emo_mars_bigtts | Beijing Style (Emotion) | Chinese |\n| zh_female_linjuayi_emo_v2_mars_bigtts | Neighbor Aunt (Emotion) | Chinese |\n| zh_male_yourougongzi_emo_v2_mars_bigtts | Gentleman (Emotion) | Chinese |\n| zh_male_ruyayichen_emo_v2_mars_bigtts | Elegant Boyfriend (Emotion) | Chinese |\n| zh_male_junlangnanyou_emo_v2_mars_bigtts | Handsome Boyfriend (Emotion) | Chinese |\n| zh_male_beijingxiaoye_emo_v2_mars_bigtts | Beijing Guy (Emotion) | Chinese |\n| zh_female_roumeinvyou_emo_v2_mars_bigtts | Gentle Girlfriend (Emotion) | Chinese |\n| zh_male_yangguangqingnian_emo_v2_mars_bigtts | Sunshine Youth (Emotion) | Chinese |\n| zh_female_meilinvyou_emo_v2_mars_bigtts | Charming Girlfriend (Emotion) | Chinese |\n| zh_female_shuangkuaisisi_emo_v2_mars_bigtts | Cheerful Sisi (Emotion) | Chinese\u002FAmerican English |\n| en_female_candice_emo_v2_mars_bigtts | Candice (Emotion) | American English |\n| en_female_skye_emo_v2_mars_bigtts | Serena (Emotion) | American English |\n| en_male_glen_emo_v2_mars_bigtts | Glen (Emotion) | American English |\n| en_male_sylus_emo_v2_mars_bigtts | Sylus (Emotion) | American English |\n| en_male_corey_emo_v2_mars_bigtts | Corey (Emotion) | British English |\n| en_female_nadia_tips_emo_v2_mars_bigtts | Nadia (Emotion) | British English |\n| zh_male_shenyeboke_emo_v2_mars_bigtts | Late Night Podcast (Emotion) | Chinese |\n\n### General - Normal\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| **zh_female_cancan_mars_bigtts** | **Shiny (灿灿)** ⭐Default | **Chinese\u002FAmerican English** |\n| zh_female_qinqienvsheng_moon_bigtts | Friendly Female | Chinese |\n| zh_male_xudong_conversation_wvae_bigtts | Happy Xiaodong | Chinese |\n| zh_female_shuangkuaisisi_moon_bigtts | Cheerful Sisi\u002FSkye | Chinese\u002FAmerican English |\n| zh_male_wennuanahu_moon_bigtts | Warm Ahu\u002FAlvin | Chinese\u002FAmerican English |\n| zh_male_yangguangqingnian_moon_bigtts | Sunshine Youth | Chinese |\n| zh_female_linjianvhai_moon_bigtts | Girl Next Door | Chinese |\n| zh_male_yuanboxiaoshu_moon_bigtts | Knowledgeable Uncle | Chinese |\n| zh_female_gaolengyujie_moon_bigtts | Cold Lady | Chinese |\n| zh_male_aojiaobazong_moon_bigtts | Proud CEO | Chinese |\n| zh_female_meilinvyou_moon_bigtts | Charming Girlfriend | Chinese |\n| zh_male_shenyeboke_moon_bigtts | Late Night Podcast | Chinese |\n| zh_male_dongfanghaoran_moon_bigtts | Oriental Haoran | Chinese |\n\n### Roleplay\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| ICL_zh_female_chunzhenshaonv_e588402fb8ad_tob | Innocent Girl | Chinese |\n| ICL_zh_male_xiaonaigou_edf58cf28b8b_tob | Cute Boy | Chinese |\n| ICL_zh_female_jinglingxiangdao_1beb294a9e3e_tob | Elf Guide | Chinese |\n| ICL_zh_male_menyoupingxiaoge_ffed9fc2fee7_tob | Silent Guy | Chinese |\n| ICL_zh_male_anrenqinzhu_cd62e63dcdab_tob | Dark Lord | Chinese |\n| ICL_zh_male_badaozongcai_v1_tob | Dominant CEO | Chinese |\n| ICL_zh_male_bingruogongzi_tob | Sickly Gentleman | Chinese |\n| ICL_zh_female_bingjiao3_tob | Evil Queen | Chinese |\n| ICL_zh_male_shuanglangshaonian_tob | Cheerful Youth | Chinese |\n| ICL_zh_male_sajiaonanyou_tob | Clingy Boyfriend | Chinese |\n| ICL_zh_male_wenrounanyou_tob | Gentle Boyfriend | Chinese |\n| ICL_zh_male_tiancaitongzhuo_tob | Genius Deskmate | Chinese |\n| ICL_zh_male_bingjiaoshaonian_tob | Yandere Youth | Chinese |\n| ICL_zh_male_bingjiaonanyou_tob | Yandere Boyfriend | Chinese |\n| ICL_zh_male_bingruoshaonian_tob | Sickly Youth | Chinese |\n| ICL_zh_male_bingjiaogege_tob | Yandere Brother | Chinese |\n| ICL_zh_female_bingjiaojiejie_tob | Yandere Sister | Chinese |\n| ICL_zh_male_bingjiaodidi_tob | Yandere Brother (Young) | Chinese |\n| ICL_zh_female_bingruoshaonv_tob | Sickly Girl | Chinese |\n| ICL_zh_female_bingjiaomengmei_tob | Yandere Cute Girl | Chinese |\n| ICL_zh_male_bingjiaobailian_tob | Yandere White Lotus | Chinese |\n\n### Video Dubbing\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| zh_male_M100_conversation_wvae_bigtts | Gentleman | Chinese |\n| zh_female_maomao_conversation_wvae_bigtts | Quiet Maomao | Chinese |\n| zh_male_tiancaitongsheng_mars_bigtts | Child Prodigy | Chinese |\n| zh_male_sunwukong_mars_bigtts | Monkey King | Chinese |\n| zh_male_xionger_mars_bigtts | Bear Two | Chinese |\n| zh_female_peiqi_mars_bigtts | Peppa Pig | Chinese |\n| zh_female_wuzetian_mars_bigtts | Empress Wu | Chinese |\n| zh_female_yingtaowanzi_mars_bigtts | Cherry Maruko | Chinese |\n| zh_male_silang_mars_bigtts | Silang | Chinese |\n| zh_male_jieshuonansheng_mars_bigtts | Narrator\u002FMorgan | Chinese\u002FAmerican English |\n\n### Audiobook\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| zh_male_changtianyi_mars_bigtts | Mystery Narrator | Chinese |\n| zh_male_ruyaqingnian_mars_bigtts | Elegant Youth | Chinese |\n| zh_male_baqiqingshu_mars_bigtts | Dominant Uncle | Chinese |\n| zh_male_qingcang_mars_bigtts | Qingcang | Chinese |\n| zh_female_gufengshaoyu_mars_bigtts | Ancient Style Lady | Chinese |\n| zh_female_wenroushunv_mars_bigtts | Gentle Lady | Chinese |\n\n### Multilingual\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| en_female_lauren_moon_bigtts | Lauren | American English |\n| en_male_michael_moon_bigtts | Michael | American English |\n| en_male_bruce_moon_bigtts | Bruce | American English |\n| en_female_emily_mars_bigtts | Emily | British English |\n| en_male_smith_mars_bigtts | Smith | British English |\n| en_female_anna_mars_bigtts | Anna | British English |\n\n### IP Voices\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| zh_male_hupunan_mars_bigtts | Shanghai Male | Chinese |\n| zh_male_lubanqihao_mars_bigtts | Luban No.7 | Chinese |\n| zh_female_yangmi_mars_bigtts | Lin Xiao | Chinese |\n| zh_female_linzhiling_mars_bigtts | Sister Lingling | Chinese |\n| zh_female_jiyejizi2_mars_bigtts | Kasukabe Sister | Chinese |\n| zh_male_tangseng_mars_bigtts | Tang Monk | Chinese |\n| zh_male_zhuangzhou_mars_bigtts | Zhuang Zhou | Chinese |\n| zh_male_zhubajie_mars_bigtts | Zhu Bajie | Chinese |\n| zh_female_ganmaodianyin_mars_bigtts | Sick Electronic Sister | Chinese |\n| zh_female_naying_mars_bigtts | Frank Ying | Chinese |\n| zh_female_leidian_mars_bigtts | Female Thor | Chinese |\n\n### Fun Accents\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| zh_female_yueyunv_mars_bigtts | Cantonese Girl | Chinese |\n| zh_male_yuzhouzixuan_moon_bigtts | Henan Boy | Chinese-Henan Accent |\n| zh_female_daimengchuanmei_moon_bigtts | Sichuan Girl | Chinese-Sichuan Accent |\n| zh_male_guangxiyuanzhou_moon_bigtts | Guangxi Boy | Chinese-Guangxi Accent |\n| zh_male_zhoujielun_emo_v2_mars_bigtts | Nunchaku Guy | Chinese-Taiwan Accent |\n| zh_female_wanwanxiaohe_moon_bigtts | Taiwan Xiaohe | Chinese-Taiwan Accent |\n| zh_female_wanqudashu_moon_bigtts | Bay Area Uncle | Chinese-Guangdong Accent |\n| zh_male_guozhoudege_moon_bigtts | Guangzhou Brother | Chinese-Guangdong Accent |\n| zh_male_haoyuxiaoge_moon_bigtts | Qingdao Boy | Chinese-Qingdao Accent |\n| zh_male_beijingxiaoye_moon_bigtts | Beijing Guy | Chinese-Beijing Accent |\n| zh_male_jingqiangkanye_moon_bigtts | Beijing Style\u002FHarmony | Chinese-Beijing\u002FAmerican English |\n| zh_female_meituojieer_moon_bigtts | Changsha Girl | Chinese-Changsha Accent |\n\n### Customer Service\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| ICL_zh_female_lixingyuanzi_cs_tob | Rational Yuanzi | Chinese |\n| ICL_zh_female_qingtiantaotao_cs_tob | Sweet Taotao | Chinese |\n| ICL_zh_female_qingxixiaoxue_cs_tob | Clear Xiaoxue | Chinese |\n| ICL_zh_female_qingtianmeimei_cs_tob | Sweet Meimei | Chinese |\n| ICL_zh_female_kailangtingting_cs_tob | Cheerful Tingting | Chinese |\n| ICL_zh_male_qingxinmumu_cs_tob | Fresh Mumu | Chinese |\n| ICL_zh_male_shuanglangxiaoyang_cs_tob | Cheerful Xiaoyang | Chinese |\n| ICL_zh_male_qingxinbobo_cs_tob | Fresh Bobo | Chinese |\n| ICL_zh_female_wenwanshanshan_cs_tob | Gentle Shanshan | Chinese |\n| ICL_zh_female_tianmeixiaoyu_cs_tob | Sweet Xiaoyu | Chinese |\n| ICL_zh_female_reqingaina_cs_tob | Enthusiastic Aina | Chinese |\n| ICL_zh_female_tianmeixiaoju_cs_tob | Sweet Xiaoju | Chinese |\n| ICL_zh_male_chenwenmingzai_cs_tob | Steady Mingzai | Chinese |\n| ICL_zh_male_qinqiexiaozhuo_cs_tob | Friendly Xiaozhuo | Chinese |\n| ICL_zh_female_lingdongxinxin_cs_tob | Lively Xinxin | Chinese |\n| ICL_zh_female_guaiqiaokeer_cs_tob | Good Keer | Chinese |\n| ICL_zh_female_nuanxinqianqian_cs_tob | Warm Qianqian | Chinese |\n| ICL_zh_female_ruanmengtuanzi_cs_tob | Soft Tuanzi | Chinese |\n| ICL_zh_male_yangguangyangyang_cs_tob | Sunny Yangyang | Chinese |\n| ICL_zh_female_ruanmengtangtang_cs_tob | Soft Tangtang | Chinese |\n| ICL_zh_female_xiuliqianqian_cs_tob | Beautiful Qianqian | Chinese |\n| ICL_zh_female_kaixinxiaohong_cs_tob | Happy Xiaohong | Chinese |\n| ICL_zh_female_qingyingduoduo_cs_tob | Light Duoduo | Chinese |\n| zh_female_kefunvsheng_mars_bigtts | Warm Female | Chinese |\n\n> **Tip**: Use `python scripts\u002Ftts.py --list-voices` to see the complete voice list\n\n## Get API Credentials\n\n1. Visit [Volcano Engine Console](https:\u002F\u002Fconsole.volcengine.com\u002F)\n2. Enable \"Doubao Voice\" service\n3. Create an application in the console to get AppID, Access Token, and Secret Key\n4. **Ensure your account has sufficient TTS quota**\n\n## Troubleshooting\n\n### Error: \"requested resource not granted\"\n\n**Cause**: Account lacks TTS service permission\n\n**Solution**:\n1. Login to [Volcano Engine Console](https:\u002F\u002Fconsole.volcengine.com\u002F)\n2. Go to \"Doubao Voice\" product page\n3. Confirm service is enabled and has available quota\n4. Check if Token has TTS calling permission\n\n### Error: \"invalid auth token\"\n\n**Cause**: Authentication information error\n\n**Solution**:\n1. Check if AppID, Access Token, Secret Key are correct\n2. Ensure no extra spaces\n\n### Error: \"requested resource not found\"\n\n**Cause**: Voice type or cluster name error\n\n**Solution**:\n1. Try different voice_type, such as BV001_streaming, BV002_streaming\n2. Try different cluster, such as volcano_tts, volcano\n\n### Test Configuration\n\nRun test script to try multiple configurations:\n\n```bash\npython scripts\u002Ftest_tts.py\n```\n\n## Notes\n\n- Ensure your account has sufficient speech synthesis quota\n- Text length limits refer to official documentation\n- Network request timeout defaults to 30 seconds\n","# Doubao Open TTS\n\nText-to-Speech (TTS) service using Doubao (Volcano Engine) API V1 interface to convert text into natural-sounding speech.\n\n## Features\n\n- ?️ **200+ Voice Options** - Default: Shiny (灿灿) for general scenarios\n- ? **Multiple Audio Formats** - Supports mp3, pcm, wav\n- ⚡ **Adjustable Parameters** - Speed and volume control\n- ? **Dual Interface** - Command-line tool + Python API\n- ? **Voice Categorization** - Browse voices by category\n- ? **Mandatory API Configuration** - Requires API credentials; stops and prompts user if not configured (default voice only available with explicit user confirmation)\n\n## Quick Start for Agents\n\n**重要提示**: 当检测到没有API配置时，Agent必须**立即停止**并询问用户是否配置API，**不允许**直接使用默认音色生成音频，除非用户明确坚持使用默认音色。\n\nWhen using this SKILL, the Agent should follow this workflow:\n\n### Step 1: Check API Configuration\n\nFirst, check if API credentials are configured:\n\n```python\nfrom scripts.tts import check_api_config, setup_api_config\n\n# Check if API is configured\nconfig = check_api_config()\nif not config:\n    # API not configured, MUST stop and ask user\n    # DO NOT proceed with default voice\n    print(\"⚠️ API credentials not found. Cannot proceed without API configuration.\")\n    # ... ask user for credentials or if they want to use default\n```\n\n### Step 2: Handle Missing API Configuration\n\n**如果API凭证缺失，Agent必须停止并询问用户**: 用户可以选择配置API，或者明确坚持使用默认音色（仅当用户明确要求时才允许）。\n\n```\nAgent: I need API credentials to use the Doubao TTS service. \n       Please provide the following information:\n\n1. App ID (APPID)\n2. Access Token\n3. Secret Key\n\nYou can get these from: https:\u002F\u002Fconsole.volcengine.com\u002F\n\nPlease enter your App ID:\n\nUser: 4269953601\n\nAgent: Please enter your Access Token:\n\nUser: uAGE3iP8nJf3ewu-d6U1P6Jthv7i1DH7\n\nAgent: Please enter your Secret Key:\n\nUser: Dfta36aYgcdqY-ylHoh9FQyqiERS5iTv\n\nAgent: [Saves credentials to .env file]\n       ✅ API configuration saved successfully!\n```\n\n**用户选择**: 如果用户不想配置API但坚持使用默认音色:\n```\nUser: 我不想配置API，就用默认音色吧\n\nAgent: ⚠️ 确认使用默认音色吗？这将使用内置的默认音色生成音频。\n       输入 'yes' 确认使用默认音色，或提供API凭证以获得更好的体验。\n\nUser: yes\n\nAgent: [继续执行，使用默认音色]\n```\n\n### Step 3: Use the Service\n\nAfter API is configured OR user explicitly confirmed to use default voice:\n\n```python\nfrom scripts.tts import VolcanoTTS\n\ntts = VolcanoTTS()\noutput = tts.synthesize(\"Hello world\", output_file=\"output.mp3\")\n```\n\n## API Configuration Detection\n\n### Function: `check_api_config()`\n\nChecks if API credentials are available. Returns config dict or None.\n\n```python\nfrom scripts.tts import check_api_config\n\nconfig = check_api_config()\nif config:\n    print(f\"App ID: {config['app_id']}\")\n    print(f\"Access Token: {config['access_token'][:10]}...\")\n    print(f\"Secret Key: {config['secret_key'][:10]}...\")\nelse:\n    print(\"API not configured\")\n```\n\n### Function: `setup_api_config(app_id, access_token, secret_key, voice_type=None)`\n\nSaves API credentials to the .env file in the SKILL directory.\n\n```python\nfrom scripts.tts import setup_api_config\n\n# Save credentials\nsetup_api_config(\n    app_id=\"4269953601\",\n    access_token=\"uAGE3iP8nJf3ewu-d6U1P6Jthv7i1DH7\",\n    secret_key=\"Dfta36aYgcdqY-ylHoh9FQyqiERS5iTv\",\n    voice_type=\"zh_female_cancan_mars_bigtts\"  # optional\n)\n\nprint(\"✅ Configuration saved to .env file\")\n```\n\n### Complete Agent Workflow Example\n\n```python\nfrom scripts.tts import check_api_config, setup_api_config, VolcanoTTS\n\ndef synthesize_with_auto_config(text, output_file=\"output.mp3\", use_default_voice=False):\n    \"\"\"\n    Synthesize speech with automatic API configuration.\n    \n    IMPORTANT: If API is not configured, this function will STOP and ask user.\n    It will NOT automatically use default voice unless user explicitly confirms.\n    \"\"\"\n    # Step 1: Check if API is configured\n    config = check_api_config()\n    \n    if not config:\n        # Step 2: STOP and ask user - DO NOT proceed automatically\n        print(\"? API Configuration Required\")\n        print(\"=\" * 50)\n        print(\"\\n⚠️ No API credentials found. You have two options:\")\n        print(\"\\nOption 1: Configure API (Recommended)\")\n        print(\"  Please visit https:\u002F\u002Fconsole.volcengine.com\u002F to get your credentials\")\n        print(\"\\nOption 2: Use Default Voice\")\n        print(\"  ⚠️ Only available if you explicitly confirm\")\n        \n        # Ask user what they want to do\n        choice = input(\"\\nEnter '1' to configure API, or '2' to use default voice: \").strip()\n        \n        if choice == '1':\n            # Configure API\n            print(\"\\nRequired information:\")\n            app_id = input(\"1. Enter your App ID: \").strip()\n            access_token = input(\"2. Enter your Access Token: \").strip()\n            secret_key = input(\"3. Enter your Secret Key: \").strip()\n            \n            # Optional: ask for preferred voice\n            print(\"\\n?️ Optional: Select a default voice (press Enter to use Shiny)\")\n            voice_type = input(\"Voice type (or voice name): \").strip()\n            \n            # Save configuration\n            setup_api_config(app_id, access_token, secret_key, voice_type or None)\n            print(\"\\n✅ Configuration saved!\")\n            \n        elif choice == '2':\n            # User explicitly chose to use default voice\n            confirm = input(\"\\n⚠️ Are you sure you want to use the default voice? (yes\u002Fno): \").strip().lower()\n            if confirm != 'yes':\n                print(\"❌ Cancelled. Please configure API to proceed.\")\n                return None\n            use_default_voice = True\n            print(\"\\n⚠️ Using default voice as requested...\")\n        else:\n            print(\"❌ Invalid choice. Please configure API to proceed.\")\n            return None\n    \n    # Step 3: Use the service\n    if use_default_voice:\n        # Use default voice (only when user explicitly confirmed)\n        tts = VolcanoTTS(use_default=True)\n    else:\n        tts = VolcanoTTS()\n    \n    output_path = tts.synthesize(text, output_file=output_file)\n    return output_path\n\n# Use it\noutput = synthesize_with_auto_config(\"Hello, this is a test\")\nif output:\n    print(f\"Audio saved to: {output}\")\nelse:\n    print(\"Operation cancelled - API configuration required\")\n```\n\n## Configuration Methods\n\n## Installation\n\n```bash\ncd skills\u002Fvolcano-tts\npip install -r requirements.txt\n```\n\n## Configuration\n\n### Method 1: Environment Variables\n\n```bash\nexport VOLCANO_TTS_APPID=\"your_app_id\"\nexport VOLCANO_TTS_ACCESS_TOKEN=\"your_access_token\"\nexport VOLCANO_TTS_SECRET_KEY=\"your_secret_key\"\nexport VOLCANO_TTS_VOICE_TYPE=\"zh_female_cancan_mars_bigtts\"  # Optional: set default voice\n```\n\n### Method 2: .env File\n\nCopy `.env.example` to `.env` and fill in your credentials:\n\n```bash\ncp .env.example .env\n# Edit the .env file with your credentials\n```\n\n## Usage\n\n### Command Line\n\n```bash\n# Basic usage (uses default voice: Shiny)\npython scripts\u002Ftts.py \"Hello, this is a test of Doubao text-to-speech service\"\n\n# Specify output file and format\npython scripts\u002Ftts.py \"Welcome to use TTS\" -o output.mp3 -e mp3\n\n# Read text from file\npython scripts\u002Ftts.py -f input.txt -o output.mp3\n\n# Adjust parameters\npython scripts\u002Ftts.py \"Custom voice\" --speed 1.2 --volume 0.8 -v zh_female_cancan_mars_bigtts\n\n# List all available voices\npython scripts\u002Ftts.py --list-voices\n\n# List voices by category\npython scripts\u002Ftts.py --list-voices --category \"General-Multilingual\"\n\n# Use different cluster\npython scripts\u002Ftts.py \"Hello\" --cluster volcano_tts\n\n# Enable debug mode\npython scripts\u002Ftts.py \"Test\" --debug\n```\n\n### Python API\n\n```python\nfrom scripts.tts import VolcanoTTS, VOICE_TYPES, VOICE_CATEGORIES\n\n# Initialize client\ntts = VolcanoTTS(\n    app_id=\"your_app_id\",\n    access_token=\"your_access_token\",\n    secret_key=\"your_secret_key\",\n    voice_type=\"zh_female_cancan_mars_bigtts\"  # Optional: set default voice\n)\n\n# List available voices\nprint(\"All voices:\", tts.list_voices())\nprint(\"General voices:\", tts.list_voices(\"General-Normal\"))\n\n# Change voice\ntts.set_voice(\"zh_male_xudong_conversation_wvae_bigtts\")  # Set to \"Happy Xiaodong\"\n\n# Synthesize speech\noutput_path = tts.synthesize(\n    text=\"Hello, this is Doubao text-to-speech\",\n    voice_type=\"zh_female_cancan_mars_bigtts\",  # Optional: override default\n    encoding=\"mp3\",\n    cluster=\"volcano_tts\",\n    speed=1.0,\n    volume=1.0,\n    output_file=\"output.mp3\"\n)\n\nprint(f\"Audio saved to: {output_path}\")\n```\n\n## Interactive Voice Selection\n\nThe SKILL supports interactive voice selection workflow for Agent-User collaboration:\n\n### Workflow\n\n1. **Agent Prompts User** - Agent asks user to select a voice\n2. **Display Voice Options** - Show recommended voices by category\n3. **User Selection** - User tells Agent their preferred voice\n4. **Agent Calls Skill** - Agent uses the selected voice to generate audio\n\n### Python API for Interactive Selection\n\n**重要**: 在使用以下代码之前，必须先检查API配置。如果没有配置，必须停止并询问用户。\n\n```python\nfrom scripts.tts import (\n    get_voice_selection_prompt,\n    find_voice_by_name,\n    get_voice_info,\n    check_api_config,\n    VolcanoTTS\n)\n\n# Step 0: Check API configuration FIRST\nconfig = check_api_config()\nif not config:\n    print(\"⚠️ API credentials not found. Please configure API first.\")\n    print(\"Visit: https:\u002F\u002Fconsole.volcengine.com\u002F\")\n    # STOP here and ask user to configure API\n    # DO NOT proceed with voice selection until API is configured\n    # OR user explicitly confirms to use default voice\n    \n# Step 1: Get the selection prompt to show user\nprompt = get_voice_selection_prompt()\nprint(prompt)\n# Agent displays this to user and waits for response\n\n# Step 2: User responds with their choice (e.g., \"Shiny\" or \"灿灿\")\nuser_input = \"Shiny\"  # This comes from user\n\n# Step 3: Find the voice_type from user input\nvoice_type, voice_name = find_voice_by_name(user_input)\nif voice_type:\n    print(f\"Selected voice: {voice_name} ({voice_type})\")\n    \n    # Get detailed info\n    info = get_voice_info(voice_type)\n    print(f\"Category: {info['category_display']}\")\n    \n    # Step 4: Use the voice to synthesize (API already verified)\n    tts = VolcanoTTS(\n        app_id=\"your_app_id\",\n        access_token=\"your_access_token\",\n        secret_key=\"your_secret_key\"\n    )\n    \n    output_path = tts.synthesize(\n        text=\"Hello, this is the selected voice\",\n        voice_type=voice_type,\n        output_file=\"output.mp3\"\n    )\n    print(f\"Audio saved to: {output_path}\")\nelse:\n    print(\"Voice not found. Please select a valid voice.\")\n    # DO NOT automatically use default - ask user instead\n```\n\n### Example Agent-User Conversation\n\n```\nAgent: ?️ Please select a voice for text-to-speech synthesis:\n\nHere are our recommended voices by category:\n\n[General - Normal]\n  • 灿灿\u002FShiny [DEFAULT] (Chinese) -> voice_type: zh_female_cancan_mars_bigtts\n  • 快乐小东 (Chinese) -> voice_type: zh_male_xudong_conversation_wvae_bigtts\n  • 亲切女声 (Chinese) -> voice_type: zh_female_qinqienvsheng_moon_bigtts\n\n[Roleplay]\n  • 纯真少女 (Chinese) -> voice_type: ICL_zh_female_chunzhenshaonv_e588402fb8ad_tob\n  • 霸道总裁 (Chinese) -> voice_type: ICL_zh_male_badaozongcai_v1_tob\n  • 撒娇男友 (Chinese) -> voice_type: ICL_zh_male_sajiaonanyou_tob\n\n[Video Dubbing]\n  • 猴哥 (Chinese) -> voice_type: zh_male_sunwukong_mars_bigtts\n  • 熊二 (Chinese) -> voice_type: zh_male_xionger_mars_bigtts\n  • 佩奇猪 (Chinese) -> voice_type: zh_female_peiqi_mars_bigtts\n\n? Tips:\n  • You can say the voice name (e.g., 'Shiny', '猴哥', '霸道总裁')\n  • Or provide the voice_type directly\n  • Type 'list all' to see all 200+ available voices\n  • Press Enter to use the default voice (Shiny) - **only if API is configured**\n\n⚠️ **Note**: Voice selection requires API credentials. If not configured, you must configure API first or explicitly confirm to use default voice.\n\nWhich voice would you like to use?\n\nUser: I want to use 猴哥\n\nAgent: [Calls skill with voice_type=\"zh_male_sunwukong_mars_bigtts\"]\n       ✅ Generated audio with voice: 猴哥\n```\n\n### Supported Input Formats\n\nThe `find_voice_by_name()` function supports:\n- **Direct voice_type**: `zh_female_cancan_mars_bigtts`\n- **Chinese name**: `灿灿`, `猴哥`, `霸道总裁`\n- **English alias**: `Shiny`, `Skye`, `Alvin`\n- **Partial match**: `灿灿` matches `灿灿\u002FShiny`\n\n## Parameters\n\n| Parameter | Description | Default | Options |\n|-----------|-------------|---------|---------|\n| voice_type | Voice type | zh_female_cancan_mars_bigtts | See voice list below |\n| encoding | Audio format | mp3 | mp3, pcm, wav |\n| sample_rate | Sample rate | 24000 | 8000, 16000, 24000 |\n| speed | Speech speed | 1.0 | 0.5 - 2.0 |\n| volume | Volume level | 1.0 | 0.5 - 2.0 |\n| cluster | Cluster name | volcano_tts | volcano_tts |\n\n## Voice Categories\n\n### General - Multilingual (with emotion support)\n\nSupported emotions: happy, sad, angry, surprised, fear, hate, excited, coldness, neutral, depressed, lovey-dovey, shy, comfort, tension, tender, storytelling, radio, magnetic, advertising, vocal-fry, ASMR, news, entertainment, dialect\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| zh_male_lengkugege_emo_v2_mars_bigtts | Cold Brother (Emotion) | Chinese |\n| zh_female_tianxinxiaomei_emo_v2_mars_bigtts | Sweet Xiaomei (Emotion) | Chinese |\n| zh_female_gaolengyujie_emo_v2_mars_bigtts | Cold Lady (Emotion) | Chinese |\n| zh_male_aojiaobazong_emo_v2_mars_bigtts | Proud CEO (Emotion) | Chinese |\n| zh_male_guangzhoudege_emo_mars_bigtts | Guangzhou Brother (Emotion) | Chinese |\n| zh_male_jingqiangkanye_emo_mars_bigtts | Beijing Style (Emotion) | Chinese |\n| zh_female_linjuayi_emo_v2_mars_bigtts | Neighbor Aunt (Emotion) | Chinese |\n| zh_male_yourougongzi_emo_v2_mars_bigtts | Gentleman (Emotion) | Chinese |\n| zh_male_ruyayichen_emo_v2_mars_bigtts | Elegant Boyfriend (Emotion) | Chinese |\n| zh_male_junlangnanyou_emo_v2_mars_bigtts | Handsome Boyfriend (Emotion) | Chinese |\n| zh_male_beijingxiaoye_emo_v2_mars_bigtts | Beijing Guy (Emotion) | Chinese |\n| zh_female_roumeinvyou_emo_v2_mars_bigtts | Gentle Girlfriend (Emotion) | Chinese |\n| zh_male_yangguangqingnian_emo_v2_mars_bigtts | Sunshine Youth (Emotion) | Chinese |\n| zh_female_meilinvyou_emo_v2_mars_bigtts | Charming Girlfriend (Emotion) | Chinese |\n| zh_female_shuangkuaisisi_emo_v2_mars_bigtts | Cheerful Sisi (Emotion) | Chinese\u002FAmerican English |\n| en_female_candice_emo_v2_mars_bigtts | Candice (Emotion) | American English |\n| en_female_skye_emo_v2_mars_bigtts | Serena (Emotion) | American English |\n| en_male_glen_emo_v2_mars_bigtts | Glen (Emotion) | American English |\n| en_male_sylus_emo_v2_mars_bigtts | Sylus (Emotion) | American English |\n| en_male_corey_emo_v2_mars_bigtts | Corey (Emotion) | British English |\n| en_female_nadia_tips_emo_v2_mars_bigtts | Nadia (Emotion) | British English |\n| zh_male_shenyeboke_emo_v2_mars_bigtts | Late Night Podcast (Emotion) | Chinese |\n\n### General - Normal\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| **zh_female_cancan_mars_bigtts** | **Shiny (灿灿)** ⭐Default | **Chinese\u002FAmerican English** |\n| zh_female_qinqienvsheng_moon_bigtts | Friendly Female | Chinese |\n| zh_male_xudong_conversation_wvae_bigtts | Happy Xiaodong | Chinese |\n| zh_female_shuangkuaisisi_moon_bigtts | Cheerful Sisi\u002FSkye | Chinese\u002FAmerican English |\n| zh_male_wennuanahu_moon_bigtts | Warm Ahu\u002FAlvin | Chinese\u002FAmerican English |\n| zh_male_yangguangqingnian_moon_bigtts | Sunshine Youth | Chinese |\n| zh_female_linjianvhai_moon_bigtts | Girl Next Door | Chinese |\n| zh_male_yuanboxiaoshu_moon_bigtts | Knowledgeable Uncle | Chinese |\n| zh_female_gaolengyujie_moon_bigtts | Cold Lady | Chinese |\n| zh_male_aojiaobazong_moon_bigtts | Proud CEO | Chinese |\n| zh_female_meilinvyou_moon_bigtts | Charming Girlfriend | Chinese |\n| zh_male_shenyeboke_moon_bigtts | Late Night Podcast | Chinese |\n| zh_male_dongfanghaoran_moon_bigtts | Oriental Haoran | Chinese |\n\n### Roleplay\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| ICL_zh_female_chunzhenshaonv_e588402fb8ad_tob | Innocent Girl | Chinese |\n| ICL_zh_male_xiaonaigou_edf58cf28b8b_tob | Cute Boy | Chinese |\n| ICL_zh_female_jinglingxiangdao_1beb294a9e3e_tob | Elf Guide | Chinese |\n| ICL_zh_male_menyoupingxiaoge_ffed9fc2fee7_tob | Silent Guy | Chinese |\n| ICL_zh_male_anrenqinzhu_cd62e63dcdab_tob | Dark Lord | Chinese |\n| ICL_zh_male_badaozongcai_v1_tob | Dominant CEO | Chinese |\n| ICL_zh_male_bingruogongzi_tob | Sickly Gentleman | Chinese |\n| ICL_zh_female_bingjiao3_tob | Evil Queen | Chinese |\n| ICL_zh_male_shuanglangshaonian_tob | Cheerful Youth | Chinese |\n| ICL_zh_male_sajiaonanyou_tob | Clingy Boyfriend | Chinese |\n| ICL_zh_male_wenrounanyou_tob | Gentle Boyfriend | Chinese |\n| ICL_zh_male_tiancaitongzhuo_tob | Genius Deskmate | Chinese |\n| ICL_zh_male_bingjiaoshaonian_tob | Yandere Youth | Chinese |\n| ICL_zh_male_bingjiaonanyou_tob | Yandere Boyfriend | Chinese |\n| ICL_zh_male_bingruoshaonian_tob | Sickly Youth | Chinese |\n| ICL_zh_male_bingjiaogege_tob | Yandere Brother | Chinese |\n| ICL_zh_female_bingjiaojiejie_tob | Yandere Sister | Chinese |\n| ICL_zh_male_bingjiaodidi_tob | Yandere Brother (Young) | Chinese |\n| ICL_zh_female_bingruoshaonv_tob | Sickly Girl | Chinese |\n| ICL_zh_female_bingjiaomengmei_tob | Yandere Cute Girl | Chinese |\n| ICL_zh_male_bingjiaobailian_tob | Yandere White Lotus | Chinese |\n\n### Video Dubbing\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| zh_male_M100_conversation_wvae_bigtts | Gentleman | Chinese |\n| zh_female_maomao_conversation_wvae_bigtts | Quiet Maomao | Chinese |\n| zh_male_tiancaitongsheng_mars_bigtts | Child Prodigy | Chinese |\n| zh_male_sunwukong_mars_bigtts | Monkey King | Chinese |\n| zh_male_xionger_mars_bigtts | Bear Two | Chinese |\n| zh_female_peiqi_mars_bigtts | Peppa Pig | Chinese |\n| zh_female_wuzetian_mars_bigtts | Empress Wu | Chinese |\n| zh_female_yingtaowanzi_mars_bigtts | Cherry Maruko | Chinese |\n| zh_male_silang_mars_bigtts | Silang | Chinese |\n| zh_male_jieshuonansheng_mars_bigtts | Narrator\u002FMorgan | Chinese\u002FAmerican English |\n\n### Audiobook\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| zh_male_changtianyi_mars_bigtts | Mystery Narrator | Chinese |\n| zh_male_ruyaqingnian_mars_bigtts | Elegant Youth | Chinese |\n| zh_male_baqiqingshu_mars_bigtts | Dominant Uncle | Chinese |\n| zh_male_qingcang_mars_bigtts | Qingcang | Chinese |\n| zh_female_gufengshaoyu_mars_bigtts | Ancient Style Lady | Chinese |\n| zh_female_wenroushunv_mars_bigtts | Gentle Lady | Chinese |\n\n### Multilingual\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| en_female_lauren_moon_bigtts | Lauren | American English |\n| en_male_michael_moon_bigtts | Michael | American English |\n| en_male_bruce_moon_bigtts | Bruce | American English |\n| en_female_emily_mars_bigtts | Emily | British English |\n| en_male_smith_mars_bigtts | Smith | British English |\n| en_female_anna_mars_bigtts | Anna | British English |\n\n### IP Voices\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| zh_male_hupunan_mars_bigtts | Shanghai Male | Chinese |\n| zh_male_lubanqihao_mars_bigtts | Luban No.7 | Chinese |\n| zh_female_yangmi_mars_bigtts | Lin Xiao | Chinese |\n| zh_female_linzhiling_mars_bigtts | Sister Lingling | Chinese |\n| zh_female_jiyejizi2_mars_bigtts | Kasukabe Sister | Chinese |\n| zh_male_tangseng_mars_bigtts | Tang Monk | Chinese |\n| zh_male_zhuangzhou_mars_bigtts | Zhuang Zhou | Chinese |\n| zh_male_zhubajie_mars_bigtts | Zhu Bajie | Chinese |\n| zh_female_ganmaodianyin_mars_bigtts | Sick Electronic Sister | Chinese |\n| zh_female_naying_mars_bigtts | Frank Ying | Chinese |\n| zh_female_leidian_mars_bigtts | Female Thor | Chinese |\n\n### Fun Accents\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| zh_female_yueyunv_mars_bigtts | Cantonese Girl | Chinese |\n| zh_male_yuzhouzixuan_moon_bigtts | Henan Boy | Chinese-Henan Accent |\n| zh_female_daimengchuanmei_moon_bigtts | Sichuan Girl | Chinese-Sichuan Accent |\n| zh_male_guangxiyuanzhou_moon_bigtts | Guangxi Boy | Chinese-Guangxi Accent |\n| zh_male_zhoujielun_emo_v2_mars_bigtts | Nunchaku Guy | Chinese-Taiwan Accent |\n| zh_female_wanwanxiaohe_moon_bigtts | Taiwan Xiaohe | Chinese-Taiwan Accent |\n| zh_female_wanqudashu_moon_bigtts | Bay Area Uncle | Chinese-Guangdong Accent |\n| zh_male_guozhoudege_moon_bigtts | Guangzhou Brother | Chinese-Guangdong Accent |\n| zh_male_haoyuxiaoge_moon_bigtts | Qingdao Boy | Chinese-Qingdao Accent |\n| zh_male_beijingxiaoye_moon_bigtts | Beijing Guy | Chinese-Beijing Accent |\n| zh_male_jingqiangkanye_moon_bigtts | Beijing Style\u002FHarmony | Chinese-Beijing\u002FAmerican English |\n| zh_female_meituojieer_moon_bigtts | Changsha Girl | Chinese-Changsha Accent |\n\n### Customer Service\n\n| voice_type | Voice Name | Language |\n|------------|------------|----------|\n| ICL_zh_female_lixingyuanzi_cs_tob | Rational Yuanzi | Chinese |\n| ICL_zh_female_qingtiantaotao_cs_tob | Sweet Taotao | Chinese |\n| ICL_zh_female_qingxixiaoxue_cs_tob | Clear Xiaoxue | Chinese |\n| ICL_zh_female_qingtianmeimei_cs_tob | Sweet Meimei | Chinese |\n| ICL_zh_female_kailangtingting_cs_tob | Cheerful Tingting | Chinese |\n| ICL_zh_male_qingxinmumu_cs_tob | Fresh Mumu | Chinese |\n| ICL_zh_male_shuanglangxiaoyang_cs_tob | Cheerful Xiaoyang | Chinese |\n| ICL_zh_male_qingxinbobo_cs_tob | Fresh Bobo | Chinese |\n| ICL_zh_female_wenwanshanshan_cs_tob | Gentle Shanshan | Chinese |\n| ICL_zh_female_tianmeixiaoyu_cs_tob | Sweet Xiaoyu | Chinese |\n| ICL_zh_female_reqingaina_cs_tob | Enthusiastic Aina | Chinese |\n| ICL_zh_female_tianmeixiaoju_cs_tob | Sweet Xiaoju | Chinese |\n| ICL_zh_male_chenwenmingzai_cs_tob | Steady Mingzai | Chinese |\n| ICL_zh_male_qinqiexiaozhuo_cs_tob | Friendly Xiaozhuo | Chinese |\n| ICL_zh_female_lingdongxinxin_cs_tob | Lively Xinxin | Chinese |\n| ICL_zh_female_guaiqiaokeer_cs_tob | Good Keer | Chinese |\n| ICL_zh_female_nuanxinqianqian_cs_tob | Warm Qianqian | Chinese |\n| ICL_zh_female_ruanmengtuanzi_cs_tob | Soft Tuanzi | Chinese |\n| ICL_zh_male_yangguangyangyang_cs_tob | Sunny Yangyang | Chinese |\n| ICL_zh_female_ruanmengtangtang_cs_tob | Soft Tangtang | Chinese |\n| ICL_zh_female_xiuliqianqian_cs_tob | Beautiful Qianqian | Chinese |\n| ICL_zh_female_kaixinxiaohong_cs_tob | Happy Xiaohong | Chinese |\n| ICL_zh_female_qingyingduoduo_cs_tob | Light Duoduo | Chinese |\n| zh_female_kefunvsheng_mars_bigtts | Warm Female | Chinese |\n\n> **Tip**: Use `python scripts\u002Ftts.py --list-voices` to see the complete voice list\n\n## Get API Credentials\n\n1. Visit [Volcano Engine Console](https:\u002F\u002Fconsole.volcengine.com\u002F)\n2. Enable \"Doubao Voice\" service\n3. Create an application in the console to get AppID, Access Token, and Secret Key\n4. **Ensure your account has sufficient TTS quota**\n\n## Troubleshooting\n\n### Error: \"requested resource not granted\"\n\n**Cause**: Account lacks TTS service permission\n\n**Solution**:\n1. Login to [Volcano Engine Console](https:\u002F\u002Fconsole.volcengine.com\u002F)\n2. Go to \"Doubao Voice\" product page\n3. Confirm service is enabled and has available quota\n4. Check if Token has TTS calling permission\n\n### Error: \"invalid auth token\"\n\n**Cause**: Authentication information error\n\n**Solution**:\n1. Check if AppID, Access Token, Secret Key are correct\n2. Ensure no extra spaces\n\n### Error: \"requested resource not found\"\n\n**Cause**: Voice type or cluster name error\n\n**Solution**:\n1. Try different voice_type, such as BV001_streaming, BV002_streaming\n2. Try different cluster, such as volcano_tts, volcano\n\n### Test Configuration\n\nRun test script to try multiple configurations:\n\n```bash\npython scripts\u002Ftest_tts.py\n```\n\n## Notes\n\n- Ensure your account has sufficient speech synthesis quota\n- Text length limits refer to official documentation\n- Network request timeout defaults to 30 seconds\n",{"name":5,"license":14,"metadata":50,"description":7,"compatibility":36},{"category":51,"language":38,"provider":52},"audio","volcano-engine","main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fxdrshjr\u002Fdoubao-api-open-tts",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add kbarbel640-del\u002Fskills --skill doubao-open-tts",{"tool":66,"command":67},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill doubao-open-tts",{"tool":69,"command":70},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill doubao-open-tts","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fxdrshjr\u002Fdoubao-api-open-tts\u002FSKILL.md",true,[74,80,84,88,92,98],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"_meta.json","REFERENCE","参考文档",291,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fxdrshjr\u002Fdoubao-api-open-tts\u002F_meta.json",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},".env.example.txt",145,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fxdrshjr\u002Fdoubao-api-open-tts\u002F.env.example.txt",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"README.md",5223,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fxdrshjr\u002Fdoubao-api-open-tts\u002FREADME.md",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"requirements.txt",17,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fxdrshjr\u002Fdoubao-api-open-tts\u002Frequirements.txt",{"path":93,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":96,"sourceHtmlUrl":97},"scripts\u002Ftest_tts.py","SCRIPT","脚本",3935,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fxdrshjr\u002Fdoubao-api-open-tts\u002Fscripts\u002Ftest_tts.py",{"path":99,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":100,"sourceHtmlUrl":101},"scripts\u002Ftts.py",42688,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fxdrshjr\u002Fdoubao-api-open-tts\u002Fscripts\u002Ftts.py",[103,131,158,179,185,205],{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":114,"publishedAt":45},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[109],{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[115,116,42,31,117,118,119,120,121,122,39,123,124,125,126,127,128,129,130],"crowd prompting","prompting","tokens","domain","world","prompts","operations","instructions","tool","system","improve","productivity","marketplace","https","content","ai agents",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":140,"publishedAt":45},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[137],{"categoryNo":138,"categoryName":139,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[141,42,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,120,157],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":167,"publishedAt":45},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[164],{"categoryNo":165,"categoryName":166,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000021","资料检索与研究",[168,169,170,171,172,173,174,31,175,155,157,176,42,177,178],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http","via",{"skillNo":180,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":184,"publishedAt":45},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[183],{"categoryNo":165,"categoryName":166,"taxonomyType":20,"taxonomyTypeDesc":21},[171,170,169,168,178,173,174,31,172,155,157,175,176,42,177],{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":191,"publishedAt":45},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[192,193,194,195,196,197,198,199,200,201,202,203,204],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":206,"name":207,"nameZh":6,"description":208,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":209,"categories":210,"keywords":215,"publishedAt":45},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[211,212],{"categoryNo":138,"categoryName":139,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":213,"categoryName":214,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000037","律师与法务",[216,217,218,219,31,220,221,53,222,176,223,224,225,226,227,128,228,229,230],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance","github"]