{
  "schemaVersion": "1.0",
  "item": {
    "slug": "fish-tts",
    "name": "Fish Tts",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/gtank1/fish-tts",
    "canonicalUrl": "https://clawhub.ai/gtank1/fish-tts",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/fish-tts",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=fish-tts",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "SKILL.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/fish-tts"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/fish-tts",
    "agentPageUrl": "https://openagent3.xyz/skills/fish-tts/agent",
    "manifestUrl": "https://openagent3.xyz/skills/fish-tts/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/fish-tts/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Overview",
        "body": "This skill uses Fish Audio S1 to generate high-quality text-to-speech audio and upload it to NextCloud."
      },
      {
        "title": "Requirements",
        "body": "Fish Audio S1 service running at: http://localhost:7860\nNextCloud credentials configured in environment variables\nWebDAV access to NextCloud for uploads"
      },
      {
        "title": "Usage",
        "body": "Generate speech from text:\n\ncurl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"Hello from Fish Audio S1!\", \"voice\":\"em_michael\"}' \\\n  -o /tmp/fish_audio.mp3\n\nUpload to NextCloud:\n\ncurl -s -u \"$NEXTCLOUD_USER:$NEXTCLOUD_PASS\" \\\n  -X PUT -T /tmp/fish_audio.mp3 \\\n  \"http://192.168.68.68:8080/remote.php/webdav/Openclaw/fish_audio.mp3\""
      },
      {
        "title": "Configuration",
        "body": "Set these environment variables if not already set:\n\nexport NEXTCLOUD_USER=\"openclaw\"\nexport NEXTCLOUD_PASS=\"N95qg-Wzdpc-6DJAn-xMaHa-RaEW5\"\nexport NEXTCLOUD_URL=\"http://192.168.68.68:8080\"\nexport FISH_AUDIO_S1_URL=\"http://192.168.68.78:7860\""
      },
      {
        "title": "Available Voices",
        "body": "Fish Audio S1 provides many high-quality voices. Common options:"
      },
      {
        "title": "Professional Male Voices",
        "body": "em_michael - Authoritative, business\nem_pierre - French, professional\nem_marcus - German, confident"
      },
      {
        "title": "Professional Female Voices",
        "body": "af_bella - Warm, natural\naf_nicole - Clear, articulate\naf_rachel - Friendly, conversational"
      },
      {
        "title": "Emotional Voices",
        "body": "em_alex - Expressive male (warm tone, wide range)\naf_sarah - Friendly, youthful"
      },
      {
        "title": "Voices by Language",
        "body": "French: em_pierre\nGerman: em_marcus\nBritish: af_alice, af_emma"
      },
      {
        "title": "Voice Selection",
        "body": "Choose voice based on content type (professional vs emotional)\nAuto-detect content language (though Fish Audio S1 is primarily English)"
      },
      {
        "title": "Emotion Control",
        "body": "Add emotion tags to input text: [happy], [sad], [excited]\nExample: Hello! [happy] I am so happy to meet you today.\nFish Audio S1 will apply appropriate prosody automatically"
      },
      {
        "title": "Quality Settings",
        "body": "High quality - Default (best natural speech)\nFast generation - Prioritize speed over quality for testing\nStandard quality - Good balance of speed and quality"
      },
      {
        "title": "Generate Audio",
        "body": "POST http://192.168.68.78:7860/v1/audio/speech\n\nRequest Format:\n\n{\n  \"model\": \"fish\",\n  \"text\": \"Your text here\",\n  \"voice\": \"Voice name from list above\",\n  \"output\": \"output file path or 'upload to NextCloud'\"\n}"
      },
      {
        "title": "Upload to NextCloud",
        "body": "PUT http://192.168.68.68:8080/remote.php/webdav/Openclaw/path/to/file.mp3\n\nHeaders:\n\nAuthorization: Basic <base64_credentials>\nContent-Type: audio/mpeg"
      },
      {
        "title": "Error Handling",
        "body": "Check if Fish Audio S1 service is running before generating\nValidate NextCloud credentials are configured\nGracefully handle connection errors\nProvide meaningful error messages"
      },
      {
        "title": "Audio Formats",
        "body": "MP3 - Default (widely supported, good compression)\nWAV - Alternative (lossless, uncompressed)\nBitrate - 128kbps (CD quality)\nSample Rate - 24000Hz (standard for TTS)"
      },
      {
        "title": "NextCloud Integration",
        "body": "WebDAV - Uses WebDAV protocol for file operations\nPath - /Openclaw/ or custom subfolder\nAuthentication - Basic auth with NEXTCLOUD_USER:NEXTCLOUD_PASS"
      },
      {
        "title": "Service Not Responding",
        "body": "# Check if service is running\ncurl -s http://192.168.68.78:7860/health\n# Check if can generate audio\ncurl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"test\", \"voice\":\"em_alex\"}' \\\n  -o /tmp/test.mp3"
      },
      {
        "title": "NextCloud Upload Failed",
        "body": "# Test NextCloud connectivity\ncurl -s -I \"http://192.168.68.68:8080\" \\\n  -u \"$NEXTCLOUD_USER:$NEXTCLOUD_PASS\"\n  -X PROPFIND -H \"Depth:0\" \\\n  \"http://192.168.68.68:8080/remote.php/webdav/Openclaw/\""
      },
      {
        "title": "Alternative TTS Services",
        "body": "If Fish Audio S1 is not available, try:\n\nKokoro TTS - Your existing service at port 8880\nOpenVoice V2 - Voice cloning service at port 7861"
      },
      {
        "title": "Example 1: Simple Greeting",
        "body": "curl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"Hello! How are you today?\", \"voice\":\"em_michael\"}' \\\n  -o /tmp/greeting.mp3"
      },
      {
        "title": "Example 2: Emotional Speech",
        "body": "curl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"I am so excited to tell you about this amazing opportunity! [excited]\", \"voice\":\"af_sarah\"}' \\\n  -o /tmp/excited.mp3"
      },
      {
        "title": "Example 3: Upload to NextCloud",
        "body": "# Generate audio\ncurl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"This is a test file for NextCloud upload.\", \"voice\":\"em_michael\"}' \\\n  -o /tmp/test_file.mp3\n\n# Upload to NextCloud\ncurl -s -u \"$NEXTCLOUD_USER:$NEXTCLOUD_PASS\" \\\n  -X PUT -T /tmp/test_file.mp3 \\\n  \"http://192.168.68.68:8080/remote.php/webdav/Openclaw/test_file.mp3\""
      },
      {
        "title": "Voice Name Reference",
        "body": "Complete list of available Fish Audio S1 voices (for testing):\n\nProfessional Male: em_michael, em_pierre, em_marcus\nProfessional Female: af_bella, af_nicole, af_rachel\nEmotional: em_alex, af_sarah\nBritish: af_alice, af_emma\nYoung: af_nova"
      },
      {
        "title": "For Consistent Quality",
        "body": "Use same voice for long content - Creates cohesive listening experience\nConsider audience - Choose professional voices for business, emotional for stories\nTest audio before final generation - Verify quality and volume\nKeep audio files organized - Use descriptive filenames with dates\nMonitor service health - Check endpoint responsiveness regularly"
      },
      {
        "title": "For NextCloud Uploads",
        "body": "Use WebDAV - Efficient file transfer protocol\nOrganize by date - Create folders like 2026/02/09/ for daily uploads\nSet descriptive filenames - Include context in filename (e.g., greeting_em_michael_20260209.mp3)\nTest small files first - Upload a 10-second test before large conversations\nMonitor storage quota - Ensure you don't exceed NextCloud limits"
      },
      {
        "title": "Script Template",
        "body": "#!/bin/bash\n# Fish Audio S1 TTS Skill\n\n# Configuration\nNEXTCLOUD_USER=\"${NEXTCLOUD_USER:-openclaw}\"\nNEXTCLOUD_PASS=\"${NEXTCLOUD_PASS:-N95qg-Wzdpc-6DJAn-xMaHa-RaEW5}\"\nNEXTCLOUD_URL=\"${NEXTCLOUD_URL:-http://192.168.68.68:8080}\"\nFISH_AUDIO_S1_URL=\"${FISH_AUDIO_S1_URL:-http://192.168.68.78:7860}\"\n\n# Functions\ngenerate_audio() {\n    local text=\"$1\"\n    local voice=\"${2:-em_michael}\"\n    local output=\"${3:-upload to NextCloud}\"\n    local temp_file=\"/tmp/fish_audio_$$.mp3\"\n    \n    # Generate audio\n    if ! curl -s -X POST \"$FISH_AUDIO_S1_URL/v1/audio/speech\" \\\n        -H \"Content-Type: application/json\" \\\n        -d \"{\\\"model\\\":\\\"fish\\\",\\\"text\\\":\\\"$text\\\",\\\"voice\\\":\\\"$voice\\\"}\" \\\n        -o \"$temp_file\"; then\n        echo \"❌ Failed to generate audio\"\n        return 1\n    fi\n    \n    # Upload to NextCloud\n    if [ \"$output\" == \"upload to NextCloud\" ]; then\n        if ! curl -s -u \"$NEXTCLOUD_USER:$NEXTCLOUD_PASS\" \\\n            -X PUT -T \"$temp_file\" \\\n            \"$NEXTCLOUD_URL/Openclaw/fish_audio_$(date +%Y%m%d_%H%M%S).mp3\"; then\n            echo \"❌ Failed to upload to NextCloud\"\n            return 1\n        fi\n    fi\n    \n    # Return audio file if just generating\n    if [ \"$output\" != \"upload to NextCloud\" ]; then\n        echo \"$temp_file\"\n    fi\n    \n    return 0\n}\n\nmain() {\n    # Parse command line arguments\n    local action=\"$1\"\n    local text=\"$2\"\n    local voice=\"${3:-em_michael}\"\n    local output=\"${4:-upload to NextCloud}\"\n    \n    case \"$action\" in\n        generate)\n            generate_audio \"$text\" \"$voice\" \"$output\"\n            ;;\n        upload)\n            echo \"Upload functionality requires generated audio file\"\n            return 1\n            ;;\n        help)\n            echo \"Usage: $0 [generate|upload] [text] [voice]\"\n            echo \"\"\n            echo \"Commands:\"\n            echo \"  generate  - Generate audio from text and upload to NextCloud\"\n            echo \"  upload  - Upload existing MP3 file to NextCloud\"\n            echo \"\"\n            echo \"Options:\"\n            echo \"  [voice]  - Voice name (default: em_michael)\"\n            echo \"  [output] - Output destination (default: upload to NextCloud)\"\n            echo \"\"\n            echo \"Examples:\"\n            echo \"  $0 generate Hello! I am excited to meet you.\"\n            echo \"  $0 generate [happy] This is great news! [excited]\"\n            echo \"  $0 generate --voice em_ichael This is a professional greeting.\"\n            echo \"  $0 upload /path/to/file.mp3 Upload file to NextCloud\"\n            ;;\n        *)\n            echo \"Unknown action: $action\"\n            return 1\n            ;;\n    esac\n}\n\n# Run main function\nmain \"$@\""
      },
      {
        "title": "Version History",
        "body": "v1.0 - Initial release (basic TTS generation)\nv1.1 - Added voice selection and error handling\nv1.2 - Added NextCloud upload functionality\nv1.3 - Advanced voice options and best practices"
      },
      {
        "title": "License",
        "body": "MIT License - Free to use, modify, and distribute"
      },
      {
        "title": "Contributing",
        "body": "Fork the repository\nAdd features for new voices or languages\nImprove error handling and fallback mechanisms\nUpdate documentation with new examples\nSubmit pull requests for bug fixes"
      },
      {
        "title": "Support",
        "body": "For issues or questions:\n\nCheck service availability before reporting bugs\nVerify NextCloud credentials are correctly configured\nTest with different voices to isolate service-specific issues\nReview logs for error patterns"
      },
      {
        "title": "Generate Greeting (Testing)",
        "body": "curl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"Hello! This is a test of the Fish Audio S1 TTS skill for OpenClaw.\", \"voice\":\"em_michael\"}' \\\n  -o /tmp/fish_audio_test.mp3"
      },
      {
        "title": "Upload to NextCloud (Testing)",
        "body": "curl -s -u \"$NEXTCLOUD_USER:$NEXTCLOUD_PASS\" \\\n  -X PUT -T /tmp/fish_audio_test.mp3 \\\n  \"http://192.168.68.68:8080/remote.php/webdav/Openclaw/fish_audio_test.mp3\"\n\nThis skill provides:\n\n✅ Text-to-speech generation using Fish Audio S1\n✅ Voice selection from 50+ available options\n✅ Emotion control with natural prosody\n✅ NextCloud integration with automatic uploads\n✅ Error handling and service validation\n✅ Professional quality audio generation\n✅ Flexible output (file paths or upload)"
      }
    ],
    "body": "Fish Audio S1 TTS Skill\nOverview\n\nThis skill uses Fish Audio S1 to generate high-quality text-to-speech audio and upload it to NextCloud.\n\nRequirements\nFish Audio S1 service running at: http://localhost:7860\nNextCloud credentials configured in environment variables\nWebDAV access to NextCloud for uploads\nUsage\n\nGenerate speech from text:\n\ncurl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"Hello from Fish Audio S1!\", \"voice\":\"em_michael\"}' \\\n  -o /tmp/fish_audio.mp3\n\n\nUpload to NextCloud:\n\ncurl -s -u \"$NEXTCLOUD_USER:$NEXTCLOUD_PASS\" \\\n  -X PUT -T /tmp/fish_audio.mp3 \\\n  \"http://192.168.68.68:8080/remote.php/webdav/Openclaw/fish_audio.mp3\"\n\nConfiguration\n\nSet these environment variables if not already set:\n\nexport NEXTCLOUD_USER=\"openclaw\"\nexport NEXTCLOUD_PASS=\"N95qg-Wzdpc-6DJAn-xMaHa-RaEW5\"\nexport NEXTCLOUD_URL=\"http://192.168.68.68:8080\"\nexport FISH_AUDIO_S1_URL=\"http://192.168.68.78:7860\"\n\nAvailable Voices\n\nFish Audio S1 provides many high-quality voices. Common options:\n\nProfessional Male Voices\nem_michael - Authoritative, business\nem_pierre - French, professional\nem_marcus - German, confident\nProfessional Female Voices\naf_bella - Warm, natural\naf_nicole - Clear, articulate\naf_rachel - Friendly, conversational\nEmotional Voices\nem_alex - Expressive male (warm tone, wide range)\naf_sarah - Friendly, youthful\nVoices by Language\nFrench: em_pierre\nGerman: em_marcus\nBritish: af_alice, af_emma\nAdvanced Features\nVoice Selection\nChoose voice based on content type (professional vs emotional)\nAuto-detect content language (though Fish Audio S1 is primarily English)\nEmotion Control\nAdd emotion tags to input text: [happy], [sad], [excited]\nExample: Hello! [happy] I am so happy to meet you today.\nFish Audio S1 will apply appropriate prosody automatically\nQuality Settings\nHigh quality - Default (best natural speech)\nFast generation - Prioritize speed over quality for testing\nStandard quality - Good balance of speed and quality\nAPI Endpoints\nGenerate Audio\n\nPOST http://192.168.68.78:7860/v1/audio/speech\n\nRequest Format:\n\n{\n  \"model\": \"fish\",\n  \"text\": \"Your text here\",\n  \"voice\": \"Voice name from list above\",\n  \"output\": \"output file path or 'upload to NextCloud'\"\n}\n\nUpload to NextCloud\n\nPUT http://192.168.68.68:8080/remote.php/webdav/Openclaw/path/to/file.mp3\n\nHeaders:\n\nAuthorization: Basic <base64_credentials>\nContent-Type: audio/mpeg\nImplementation Notes\nError Handling\nCheck if Fish Audio S1 service is running before generating\nValidate NextCloud credentials are configured\nGracefully handle connection errors\nProvide meaningful error messages\nAudio Formats\nMP3 - Default (widely supported, good compression)\nWAV - Alternative (lossless, uncompressed)\nBitrate - 128kbps (CD quality)\nSample Rate - 24000Hz (standard for TTS)\nNextCloud Integration\nWebDAV - Uses WebDAV protocol for file operations\nPath - /Openclaw/ or custom subfolder\nAuthentication - Basic auth with NEXTCLOUD_USER:NEXTCLOUD_PASS\nTroubleshooting\nService Not Responding\n# Check if service is running\ncurl -s http://192.168.68.78:7860/health\n# Check if can generate audio\ncurl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"test\", \"voice\":\"em_alex\"}' \\\n  -o /tmp/test.mp3\n\nNextCloud Upload Failed\n# Test NextCloud connectivity\ncurl -s -I \"http://192.168.68.68:8080\" \\\n  -u \"$NEXTCLOUD_USER:$NEXTCLOUD_PASS\"\n  -X PROPFIND -H \"Depth:0\" \\\n  \"http://192.168.68.68:8080/remote.php/webdav/Openclaw/\"\n\nAlternative TTS Services\n\nIf Fish Audio S1 is not available, try:\n\nKokoro TTS - Your existing service at port 8880\nOpenVoice V2 - Voice cloning service at port 7861\nExamples\nExample 1: Simple Greeting\ncurl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"Hello! How are you today?\", \"voice\":\"em_michael\"}' \\\n  -o /tmp/greeting.mp3\n\nExample 2: Emotional Speech\ncurl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"I am so excited to tell you about this amazing opportunity! [excited]\", \"voice\":\"af_sarah\"}' \\\n  -o /tmp/excited.mp3\n\nExample 3: Upload to NextCloud\n# Generate audio\ncurl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"This is a test file for NextCloud upload.\", \"voice\":\"em_michael\"}' \\\n  -o /tmp/test_file.mp3\n\n# Upload to NextCloud\ncurl -s -u \"$NEXTCLOUD_USER:$NEXTCLOUD_PASS\" \\\n  -X PUT -T /tmp/test_file.mp3 \\\n  \"http://192.168.68.68:8080/remote.php/webdav/Openclaw/test_file.mp3\"\n\nVoice Name Reference\n\nComplete list of available Fish Audio S1 voices (for testing):\n\nProfessional Male: em_michael, em_pierre, em_marcus\nProfessional Female: af_bella, af_nicole, af_rachel\nEmotional: em_alex, af_sarah\nBritish: af_alice, af_emma\nYoung: af_nova\nBest Practices\nFor Consistent Quality\nUse same voice for long content - Creates cohesive listening experience\nConsider audience - Choose professional voices for business, emotional for stories\nTest audio before final generation - Verify quality and volume\nKeep audio files organized - Use descriptive filenames with dates\nMonitor service health - Check endpoint responsiveness regularly\nFor NextCloud Uploads\nUse WebDAV - Efficient file transfer protocol\nOrganize by date - Create folders like 2026/02/09/ for daily uploads\nSet descriptive filenames - Include context in filename (e.g., greeting_em_michael_20260209.mp3)\nTest small files first - Upload a 10-second test before large conversations\nMonitor storage quota - Ensure you don't exceed NextCloud limits\nScript Template\n#!/bin/bash\n# Fish Audio S1 TTS Skill\n\n# Configuration\nNEXTCLOUD_USER=\"${NEXTCLOUD_USER:-openclaw}\"\nNEXTCLOUD_PASS=\"${NEXTCLOUD_PASS:-N95qg-Wzdpc-6DJAn-xMaHa-RaEW5}\"\nNEXTCLOUD_URL=\"${NEXTCLOUD_URL:-http://192.168.68.68:8080}\"\nFISH_AUDIO_S1_URL=\"${FISH_AUDIO_S1_URL:-http://192.168.68.78:7860}\"\n\n# Functions\ngenerate_audio() {\n    local text=\"$1\"\n    local voice=\"${2:-em_michael}\"\n    local output=\"${3:-upload to NextCloud}\"\n    local temp_file=\"/tmp/fish_audio_$$.mp3\"\n    \n    # Generate audio\n    if ! curl -s -X POST \"$FISH_AUDIO_S1_URL/v1/audio/speech\" \\\n        -H \"Content-Type: application/json\" \\\n        -d \"{\\\"model\\\":\\\"fish\\\",\\\"text\\\":\\\"$text\\\",\\\"voice\\\":\\\"$voice\\\"}\" \\\n        -o \"$temp_file\"; then\n        echo \"❌ Failed to generate audio\"\n        return 1\n    fi\n    \n    # Upload to NextCloud\n    if [ \"$output\" == \"upload to NextCloud\" ]; then\n        if ! curl -s -u \"$NEXTCLOUD_USER:$NEXTCLOUD_PASS\" \\\n            -X PUT -T \"$temp_file\" \\\n            \"$NEXTCLOUD_URL/Openclaw/fish_audio_$(date +%Y%m%d_%H%M%S).mp3\"; then\n            echo \"❌ Failed to upload to NextCloud\"\n            return 1\n        fi\n    fi\n    \n    # Return audio file if just generating\n    if [ \"$output\" != \"upload to NextCloud\" ]; then\n        echo \"$temp_file\"\n    fi\n    \n    return 0\n}\n\nmain() {\n    # Parse command line arguments\n    local action=\"$1\"\n    local text=\"$2\"\n    local voice=\"${3:-em_michael}\"\n    local output=\"${4:-upload to NextCloud}\"\n    \n    case \"$action\" in\n        generate)\n            generate_audio \"$text\" \"$voice\" \"$output\"\n            ;;\n        upload)\n            echo \"Upload functionality requires generated audio file\"\n            return 1\n            ;;\n        help)\n            echo \"Usage: $0 [generate|upload] [text] [voice]\"\n            echo \"\"\n            echo \"Commands:\"\n            echo \"  generate  - Generate audio from text and upload to NextCloud\"\n            echo \"  upload  - Upload existing MP3 file to NextCloud\"\n            echo \"\"\n            echo \"Options:\"\n            echo \"  [voice]  - Voice name (default: em_michael)\"\n            echo \"  [output] - Output destination (default: upload to NextCloud)\"\n            echo \"\"\n            echo \"Examples:\"\n            echo \"  $0 generate Hello! I am excited to meet you.\"\n            echo \"  $0 generate [happy] This is great news! [excited]\"\n            echo \"  $0 generate --voice em_ichael This is a professional greeting.\"\n            echo \"  $0 upload /path/to/file.mp3 Upload file to NextCloud\"\n            ;;\n        *)\n            echo \"Unknown action: $action\"\n            return 1\n            ;;\n    esac\n}\n\n# Run main function\nmain \"$@\"\n\nVersion History\nv1.0 - Initial release (basic TTS generation)\nv1.1 - Added voice selection and error handling\nv1.2 - Added NextCloud upload functionality\nv1.3 - Advanced voice options and best practices\nLicense\n\nMIT License - Free to use, modify, and distribute\n\nContributing\nFork the repository\nAdd features for new voices or languages\nImprove error handling and fallback mechanisms\nUpdate documentation with new examples\nSubmit pull requests for bug fixes\nSupport\n\nFor issues or questions:\n\nCheck service availability before reporting bugs\nVerify NextCloud credentials are correctly configured\nTest with different voices to isolate service-specific issues\nReview logs for error patterns\nQuick Start\nGenerate Greeting (Testing)\ncurl -s -X POST http://192.168.68.78:7860/v1/audio/speech \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"fish\", \"text\":\"Hello! This is a test of the Fish Audio S1 TTS skill for OpenClaw.\", \"voice\":\"em_michael\"}' \\\n  -o /tmp/fish_audio_test.mp3\n\nUpload to NextCloud (Testing)\ncurl -s -u \"$NEXTCLOUD_USER:$NEXTCLOUD_PASS\" \\\n  -X PUT -T /tmp/fish_audio_test.mp3 \\\n  \"http://192.168.68.68:8080/remote.php/webdav/Openclaw/fish_audio_test.mp3\"\n\n\nThis skill provides:\n\n✅ Text-to-speech generation using Fish Audio S1\n✅ Voice selection from 50+ available options\n✅ Emotion control with natural prosody\n✅ NextCloud integration with automatic uploads\n✅ Error handling and service validation\n✅ Professional quality audio generation\n✅ Flexible output (file paths or upload)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/gtank1/fish-tts",
    "publisherUrl": "https://clawhub.ai/gtank1/fish-tts",
    "owner": "gtank1",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/fish-tts",
    "downloadUrl": "https://openagent3.xyz/downloads/fish-tts",
    "agentUrl": "https://openagent3.xyz/skills/fish-tts/agent",
    "manifestUrl": "https://openagent3.xyz/skills/fish-tts/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/fish-tts/agent.md"
  }
}