diff --git a/.github/workflows/dev-docker-test.yml b/.github/workflows/dev-docker-test.yml index dca61f25d6a896036f92bfdfeac552033b1a167c..d55d1484d762fffe1f9c7217a80946dd0bfb3bbf 100644 --- a/.github/workflows/dev-docker-test.yml +++ b/.github/workflows/dev-docker-test.yml @@ -1,10 +1,24 @@ name: Full Dev Docker Test - on: - workflow_dispatch: {} - push: + workflow_dispatch: + inputs: + docker_tag: + description: 'Docker tag to use for testing' + required: false + default: 'dev_v25' + type: string + stop_on_failure: + description: 'Stop tests on first failure' + required: false + default: false + type: boolean + pull_request: branches: - - v25 + - main + types: + - opened + - synchronize + - reopened paths-ignore: - CODE_OF_CONDUCT.md - LICENSE @@ -17,6 +31,8 @@ on: jobs: build: runs-on: [self-hosted, Linux, ARM64] + env: + DOCKER_TAG: ${{ inputs.docker_tag || 'dev_v25' }} steps: - name: Checkout code uses: actions/checkout@v3 @@ -75,599 +91,109 @@ jobs: shell: bash run: | docker buildx build --platform linux/amd64,linux/arm64 \ - -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 \ + -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} \ --push . # Build and Push Dev_v25 Docker Image for Windows using PowerShell - name: Build and Push Dev_25 Docker Image (multi-arch, Windows) if: runner.os == 'Windows' shell: powershell - run: docker buildx build --platform linux/amd64,linux/arm64 -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --push . - - - - - - - - - test_help: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Help command test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --help || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --help) - - name: Run Help command test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --help - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --help - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_fairseq_single_eng: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Fairseq headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq) - - name: Run English Fairseq headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - - test_fairseq_batch_eng: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Fairseq headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq) - - name: Run English Fairseq headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_fairseq_custom_eng_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Fairseq Custom-Voice headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English Fairseq Custom-Voice headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_fairseq_custom_eng_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Fairseq Custom-Voice headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English Fairseq Custom-Voice headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_unusual_fairseq_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Unusual Fairseq headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq) - - name: Run Unusual Fairseq headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - test_unusual_fairseq_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Unusual Fairseq headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq) - - name: Run Unusual Fairseq headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - test_unusual_fairseq_custom_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Unusual Fairseq Custom-Voice headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run Unusual Fairseq Custom-Voice headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - test_unusual_fairseq_custom_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Unusual Fairseq Custom-Voice headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run Unusual Fairseq Custom-Voice headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - test_vits_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Vits headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits) - - name: Run English Vits headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits - } - - name: Prune all dangling Docker images - run: docker image prune -f - + run: docker buildx build --platform linux/amd64,linux/arm64 -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} --push . - test_vits_batch: + run_tests: needs: build runs-on: self-hosted + strategy: + matrix: + test: + - name: "Help command test" + command: "--help" + - name: "English Fairseq headless single test" + command: "--headless --script_mode full_docker --language eng --ebook \"tools/workflow-testing/test1.txt\" --tts_engine fairseq" + - name: "English Fairseq headless batch test" + command: "--headless --script_mode full_docker --language eng --ebooks_dir \"tools/workflow-testing\" --tts_engine fairseq" + - name: "English Fairseq Custom-Voice headless single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English Fairseq Custom-Voice headless batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "Unusual Fairseq headless single test" + command: '--headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq' + - name: "Unusual Fairseq headless batch test" + command: '--headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq' + - name: "Unusual Fairseq Custom-Voice headless single test" + command: '--headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "Unusual Fairseq Custom-Voice headless batch test" + command: '--headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English Vits headless single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits' + - name: "English Vits headless batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits' + - name: "English Vits Custom-Voice headless single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English Vits Custom-Voice headless batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English YourTTS headless single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts' + - name: "English YourTTS headless batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts' + - name: "English YourTTS Custom-Voice headless single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English YourTTS Custom-Voice headless batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "Default headless single test" + command: '--headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt"' + - name: "Default XTTS headless batch test" + command: '--headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts' + - name: "Default XTTS headless Custom-Voice single test" + command: '--headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "Default XTTS headless Custom-Voice batch test" + command: '--headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English XTTS headless fine-tuned XTTS model single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained' + - name: "English XTTS headless fine-tuned XTTS model batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained' + #- name: "English Bark headless single test" + # command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark' + #- name: "English Bark Custom-Voice headless batch test" # Marked out as it takes too long + # command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + #- name: "English Bark Custom-Voice headless single test" + # command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + #- name: "English Bark headless batch test" + # command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine bark' + # Add more test configurations as needed + fail-fast: ${{ inputs.stop_on_failure || false }} + env: + DOCKER_TAG: ${{ inputs.docker_tag || 'dev_v25' }} steps: - name: Prune all dangling Docker images run: docker image prune -f - - - name: Run English Vits headless batch test (with GPU if available, Unix) + + - name: Run ${{ matrix.test.name }} (with GPU if available, Unix) if: runner.os != 'Windows' shell: bash + continue-on-error: ${{ !inputs.stop_on_failure }} run: | echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits) - - name: Run English Vits headless batch test (with GPU if available, Windows) + docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ${{ matrix.test.command }} || \ + (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ${{ matrix.test.command }}) + + - name: Run ${{ matrix.test.name }} (with GPU if available, Windows) if: runner.os == 'Windows' shell: powershell + continue-on-error: ${{ !inputs.stop_on_failure }} run: | $ErrorActionPreference = "Stop" Write-Host "Attempting to run with GPU support..." try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits + docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ${{ matrix.test.command }} } catch { Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits + docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ${{ matrix.test.command }} } + - name: Prune all dangling Docker images run: docker image prune -f - test_vits_custom_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Vits Custom-Voice headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English Vits Custom-Voice headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_vits_custom_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Vits Custom-Voice headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English Vits Custom-Voice headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_yourtts_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English YourTTS headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts) - - name: Run English YourTTS headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - - test_yourtts_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English YourTTS headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts) - - name: Run English YourTTS headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_yourtts_custom_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English YourTTS Custom-Voice headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English YourTTS Custom-Voice headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_yourtts_custom_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English YourTTS Custom-Voice headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English YourTTS Custom-Voice headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_default_headless_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Default headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt") - - name: Run Default headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_xtts_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Default XTTS headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts) - - name: Run Default XTTS headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts - } - - name: Prune all dangling Docker images - run: docker image prune -f - - # The following tests are kept as comments for future implementation: # test_create_custom_xtts: @@ -688,192 +214,3 @@ jobs: # steps: # - name: English xtts headless custom xtts model batch test docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev # run: docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --custom_model "custom_xtts_test.zip" - - test_xtts_custom_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Default XTTS headless Custom-Voice single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run Default XTTS headless Custom-Voice single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_xtts_custom_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Default XTTS headless Custom-Voice batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run Default XTTS headless Custom-Voice batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_xtts_finetuned_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English XTTS headless fine-tuned XTTS model single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained) - - name: Run English XTTS headless fine-tuned XTTS model single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_xtts_finetuned_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English XTTS headless fine-tuned XTTS model batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained) - - name: Run English XTTS headless fine-tuned XTTS model batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_bark_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Bark headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark) - - name: Run English Bark headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark - } - - name: Prune all dangling Docker images - run: docker image prune -f - -# Batch Bark Test takes too long -# - name: English Bark Custom-Voice headless batch test -# run: docker run athomasson2/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - - - test_bark_custom_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Bark Custom-Voice headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English Bark Custom-Voice headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - -# Batch Bark Test takes too long -# - name: English Bark headless batch test -# run: docker run athomasson2/ebook2audiobook:dev_v25 --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine bark diff --git a/.github/workflows/docker-build+test.yml b/.github/workflows/docker-build+test.yml new file mode 100644 index 0000000000000000000000000000000000000000..c01f787e84d43fef62e280cefaf0e41092ec1ef1 --- /dev/null +++ b/.github/workflows/docker-build+test.yml @@ -0,0 +1,630 @@ +name: Docker Build+Test +on: + workflow_dispatch: + inputs: + docker_tag: + description: 'Docker tag to use for testing' + required: false + default: 'dev' + type: string + require_all_tests: + description: 'Require all tests to pass' + required: false + default: true + type: boolean + push: + branches: + - main + paths-ignore: + - CODE_OF_CONDUCT.md + - LICENSE + - README.md + - readme/** + - dockerfiles/** + - Notebooks/** + + +jobs: + build_base: + runs-on: [self-hosted, Linux, ARM64] + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx (Unix) + if: runner.os != 'Windows' + uses: docker/setup-buildx-action@v2 + with: + driver: docker-container + buildkitd-flags: "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host" + + - name: Set up Docker Buildx (Windows) + if: runner.os == 'Windows' + uses: docker/setup-buildx-action@v2 + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Prune all dangling Docker images + run: docker image prune -f + + - name: Build and Push Base Docker Image + run: | + docker buildx build --pull --target base --platform linux/amd64,linux/arm64 \ + -t athomasson2/ebook2audiobook:base \ + --push . + + + + + build: + needs: build_base + runs-on: [self-hosted, Linux, ARM64] + env: + DOCKER_TAG: ${{ inputs.docker_tag || 'dev' }} + steps: + - name: Checkout code + uses: actions/checkout@v3 + + # Set up Docker Buildx conditionally based on OS: + - name: Set up Docker Buildx (Windows) + if: runner.os == 'Windows' + uses: docker/setup-buildx-action@v2 + + - name: Set up Docker Buildx (Unix) + if: runner.os != 'Windows' + uses: docker/setup-buildx-action@v2 + with: + driver: docker-container + buildkitd-flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + # Get Git Commit Hash for Linux/macOS + - name: Get Git Commit Hash (Unix) + if: runner.os != 'Windows' + run: echo "GIT_HASH=$(git rev-parse --short=9 HEAD)" >> $GITHUB_ENV + + # Get Git Commit Hash for Windows using PowerShell + - name: Get Git Commit Hash (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + $gitHash = (git rev-parse --short=9 HEAD).Trim() + Add-Content -Path $env:GITHUB_ENV -Value "GIT_HASH=$gitHash" + # Get Latest Release Tag for Linux/macOS + - name: Get Latest Release Tag (Unix) + if: runner.os != 'Windows' + id: get_tag + run: | + TAG=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name) + echo "RELEASE_TAG=$TAG" >> $GITHUB_ENV + # Get Latest Release Tag for Windows using PowerShell + - name: Get Latest Release Tag (Windows) + if: runner.os == 'Windows' + id: get_tag_win + shell: powershell + run: | + $response = Invoke-WebRequest -Uri "https://api.github.com/repos/${{ github.repository }}/releases/latest" -UseBasicParsing + $json = $response.Content | ConvertFrom-Json + $tag = $json.tag_name + Add-Content -Path $env:GITHUB_ENV -Value "RELEASE_TAG=$tag" + # Re-integrate once the other parts pass please Drew :) + # Build and Push Dev Docker Image for Unix using bash + - name: Build and Push Dev Docker Image (multi-arch, Unix) + if: runner.os != 'Windows' + shell: bash + run: | + docker buildx build --pull --platform linux/amd64,linux/arm64 \ + --build-arg BASE_IMAGE=${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:base \ + -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} \ + --push \ + . + + # Build and Push Dev Docker Image for Windows using PowerShell + - name: Build and Push Dev Docker Image (multi-arch, Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + docker buildx build --pull --platform linux/amd64,linux/arm64 ` + --build-arg BASE_IMAGE=${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:base ` + -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ` + --push ` + . + + + + + + + + + + run_tests: + needs: build + runs-on: self-hosted + continue-on-error: ${{ inputs.require_all_tests == false }} + strategy: + matrix: + test: + - name: "Help command test" + command: "--help" + - name: "English Fairseq headless single test" + command: "--headless --script_mode full_docker --language eng --ebook \"tools/workflow-testing/test1.txt\" --tts_engine fairseq" + - name: "English Fairseq headless batch test" + command: "--headless --script_mode full_docker --language eng --ebooks_dir \"tools/workflow-testing\" --tts_engine fairseq" + - name: "English Fairseq Custom-Voice headless single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English Fairseq Custom-Voice headless batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "Unusual Fairseq headless single test" + command: '--headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq' + - name: "Unusual Fairseq headless batch test" + command: '--headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq' + - name: "Unusual Fairseq Custom-Voice headless single test" + command: '--headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "Unusual Fairseq Custom-Voice headless batch test" + command: '--headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English Vits headless single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits' + - name: "English Vits headless batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits' + - name: "English Vits Custom-Voice headless single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English Vits Custom-Voice headless batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English YourTTS headless single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts' + - name: "English YourTTS headless batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts' + - name: "English YourTTS Custom-Voice headless single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English YourTTS Custom-Voice headless batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "Default headless single test" + command: '--headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt"' + - name: "Default XTTS headless batch test" + command: '--headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts' + - name: "Default XTTS headless Custom-Voice single test" + command: '--headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "Default XTTS headless Custom-Voice batch test" + command: '--headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + - name: "English XTTS headless fine-tuned XTTS model single test" + command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained' + - name: "English XTTS headless fine-tuned XTTS model batch test" + command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained' + #- name: "English Bark headless single test" + # command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark' + #- name: "English Bark Custom-Voice headless batch test" # Marked out as it takes too long + # command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + #- name: "English Bark Custom-Voice headless single test" + # command: '--headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav"' + #- name: "English Bark headless batch test" + # command: '--headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine bark' + # Add more test configurations as needed + env: + DOCKER_TAG: ${{ inputs.docker_tag || 'dev' }} + steps: + - name: Prune all dangling Docker images + run: docker image prune -f + + - name: Run ${{ matrix.test.name }} (with GPU if available, Unix) + if: runner.os != 'Windows' + shell: bash + run: | + echo "Attempting to run with GPU support..." + docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ${{ matrix.test.command }} || \ + (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ${{ matrix.test.command }}) + + - name: Run ${{ matrix.test.name }} (with GPU if available, Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + $ErrorActionPreference = "Stop" + Write-Host "Attempting to run with GPU support..." + try { + docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ${{ matrix.test.command }} + } catch { + Write-Host "GPU run failed, trying without GPU support..." + docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ${{ matrix.test.command }} + } + + - name: Prune all dangling Docker images + run: docker image prune -f + + + # The following tests are kept as comments for future implementation: + # test_create_custom_xtts: + # needs: build + # runs-on: self-hosted + # steps: + # - name: Create the custom_xtts_test.zip for headless custom xtts model single test docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev + # run: cp voices/eng/elder/male/DavidAttenborough_24000.wav ref.wav && zip -j custom_xtts_test.zip models/tts/tts_models--multilingual--multi-dataset--xtts_v2/config.json models/tts/tts_models--multilingual--multi-dataset--xtts_v2/model.pth models/tts/tts_models--multilingual--multi-dataset--xtts_v2/vocab.json ref.wav && rm -f ref.wav + # test_xtts_custom_single: + # needs: build + # runs-on: self-hosted + # steps: + # - name: English xtts headless custom xtts model single test docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev + # run: docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --custom_model "custom_xtts_test.zip" + # test_xtts_custom_batch: + # needs: build + # runs-on: self-hosted + # steps: + # - name: English xtts headless custom xtts model batch test docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev + # run: docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --custom_model "custom_xtts_test.zip" + + + final_push: + needs: run_tests + if: ${{ !failure() || inputs.require_all_tests == false }} + runs-on: self-hosted + env: + DOCKER_TAG: ${{ inputs.docker_tag || 'dev' }} + steps: + - name: Checkout code + uses: actions/checkout@v3 + + # Set up Docker Buildx conditionally + - name: Set up Docker Buildx (Windows) + if: runner.os == 'Windows' + uses: docker/setup-buildx-action@v2 + + - name: Set up Docker Buildx (Unix) + if: runner.os != 'Windows' + uses: docker/setup-buildx-action@v2 + with: + driver: docker-container + buildkitd-flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + # Get Git Commit Hash conditionally + - name: Get Git Commit Hash (Unix) + if: runner.os != 'Windows' + shell: bash + run: | + echo "GIT_HASH=$(git rev-parse --short=9 HEAD)" >> $GITHUB_ENV + + - name: Get Git Commit Hash (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + $gitHash = (git rev-parse --short=9 HEAD).Trim() + Add-Content -Path $env:GITHUB_ENV -Value "GIT_HASH=$gitHash" + + # Get Latest Release Tag conditionally + - name: Get Latest Release Tag (Unix) + if: runner.os != 'Windows' + shell: bash + run: | + TAG=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name) + if [[ -z "$TAG" || "$TAG" == "null" ]]; then TAG="latest"; fi + echo "RELEASE_TAG=$TAG" >> $GITHUB_ENV + + - name: Get Latest Release Tag (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + $response = Invoke-WebRequest -Uri "https://api.github.com/repos/${{ github.repository }}/releases/latest" -UseBasicParsing + $json = $response.Content | ConvertFrom-Json + $tag = $json.tag_name + if (-not $tag -or $tag -eq "null") { $tag = "latest" } + Add-Content -Path $env:GITHUB_ENV -Value "RELEASE_TAG=$tag" + + # ✅ Debugging Step (Shell-Specific) + - name: Debug Print Variables (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + echo "DOCKER_USERNAME: $env:DOCKER_USERNAME" + echo "GIT_HASH: $env:GIT_HASH" + echo "RELEASE_TAG: $env:RELEASE_TAG" + + - name: Debug Print Variables (Unix) + if: runner.os != 'Windows' + shell: bash + run: | + echo "DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }}" + echo "GIT_HASH=${GIT_HASH}" + echo "RELEASE_TAG=${RELEASE_TAG}" + + # Re-tag dev Docker Images conditionally + - name: Re-tag dev Docker Image (multi-arch, Unix) + if: runner.os != 'Windows' + shell: bash + run: | + docker buildx imagetools create \ + --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:$GIT_HASH \ + --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:$RELEASE_TAG \ + --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:latest \ + ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} + + - name: Re-tag dev Docker Image (multi-arch, Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + $dockerUsername = "${{ secrets.DOCKER_USERNAME }}" + $gitHash = if ($env:GIT_HASH) { $env:GIT_HASH } else { "latest" } + $releaseTag = if ($env:RELEASE_TAG) { $env:RELEASE_TAG } else { "latest" } + + echo "DOCKER_USERNAME: $dockerUsername" + echo "GIT_HASH: $gitHash" + echo "RELEASE_TAG: $releaseTag" + + docker buildx imagetools create ` + --tag "$dockerUsername/ebook2audiobook:$gitHash" ` + --tag "$dockerUsername/ebook2audiobook:$releaseTag" ` + --tag "$dockerUsername/ebook2audiobook:latest" ` + "$dockerUsername/ebook2audiobook:${{ env.DOCKER_TAG }}" + + + + + + + + + + build_variants: + needs: run_tests + if: ${{ !failure() || inputs.require_all_tests == false }} + runs-on: self-hosted + strategy: + matrix: + torch_version: [cuda12, cuda11, rocm, xpu, cpu] + steps: + - name: Checkout code + uses: actions/checkout@v3 + + # Set up Docker Buildx conditionally + - name: Set up Docker Buildx (Windows) + if: runner.os == 'Windows' + uses: docker/setup-buildx-action@v2 + + - name: Set up Docker Buildx (Unix) + if: runner.os != 'Windows' + uses: docker/setup-buildx-action@v2 + with: + driver: docker-container + buildkitd-flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + # Get Git Commit Hash conditionally + - name: Get Git Commit Hash (Unix) + if: runner.os != 'Windows' + shell: bash + run: | + echo "GIT_HASH=$(git rev-parse --short=9 HEAD)" >> $GITHUB_ENV + + - name: Get Git Commit Hash (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + $gitHash = (git rev-parse --short=9 HEAD).Trim() + Add-Content -Path $env:GITHUB_ENV -Value "GIT_HASH=$gitHash" + + # Get Latest Release Tag conditionally + - name: Get Latest Release Tag (Unix) + if: runner.os != 'Windows' + shell: bash + run: | + TAG=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name) + if [[ -z "$TAG" || "$TAG" == "null" ]]; then TAG="latest"; fi + echo "RELEASE_TAG=$TAG" >> $GITHUB_ENV + + - name: Get Latest Release Tag (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + $response = Invoke-WebRequest -Uri "https://api.github.com/repos/${{ github.repository }}/releases/latest" -UseBasicParsing + $json = $response.Content | ConvertFrom-Json + $tag = $json.tag_name + if (-not $tag -or $tag -eq "null") { $tag = "latest" } + Add-Content -Path $env:GITHUB_ENV -Value "RELEASE_TAG=$tag" + + # Debug output + - name: Debug Print Variables (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + echo "DOCKER_USERNAME: $env:DOCKER_USERNAME" + echo "GIT_HASH: $env:GIT_HASH" + echo "RELEASE_TAG: $env:RELEASE_TAG" + echo "TORCH_VERSION: ${{ matrix.torch_version }}" + + - name: Debug Print Variables (Unix) + if: runner.os != 'Windows' + shell: bash + run: | + echo "DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }}" + echo "GIT_HASH=${GIT_HASH}" + echo "RELEASE_TAG=${RELEASE_TAG}" + echo "TORCH_VERSION=${{ matrix.torch_version }}" + + # Build with Docker Buildx (Unix) + - name: Build with Docker Buildx (Unix) + if: runner.os != 'Windows' + shell: bash + run: | + PLATFORMS="linux/amd64,linux/arm64" + if [[ "${{ matrix.torch_version }}" == "xpu" ]]; then + PLATFORMS="linux/amd64" + fi + + docker buildx build \ + --pull \ + --platform $PLATFORMS \ + --build-arg TORCH_VERSION=${{ matrix.torch_version }} \ + --build-arg BASE_IMAGE=${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:base \ + --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ matrix.torch_version }}-${{ env.GIT_HASH }} \ + --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ matrix.torch_version }}-${{ env.RELEASE_TAG }} \ + --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ matrix.torch_version }} \ + --push \ + . + + - name: Build with Docker Buildx (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + $PLATFORMS = "linux/amd64,linux/arm64" + if ("${{ matrix.torch_version }}" -eq "xpu") { + $PLATFORMS = "linux/amd64" + } + + docker buildx build ` + --pull ` + --platform $PLATFORMS ` + --build-arg TORCH_VERSION=${{ matrix.torch_version }} ` + --build-arg BASE_IMAGE=${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:base ` + --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ matrix.torch_version }}-${{ env.GIT_HASH }} ` + --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ matrix.torch_version }}-${{ env.RELEASE_TAG }} ` + --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ matrix.torch_version }} ` + --push ` + . + + + + + + + + + + + + + + + + + huggingface-build: + needs: run_tests + if: ${{ !failure() || inputs.require_all_tests == false }} + runs-on: self-hosted + steps: + - name: Checkout code + uses: actions/checkout@v3 + + # Set up Docker Buildx conditionally + - name: Set up Docker Buildx (Windows) + if: runner.os == 'Windows' + uses: docker/setup-buildx-action@v2 + + - name: Set up Docker Buildx (Unix) + if: runner.os != 'Windows' + uses: docker/setup-buildx-action@v2 + with: + driver: docker-container + buildkitd-flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + # Get Git Commit Hash conditionally + - name: Get Git Commit Hash (Unix) + if: runner.os != 'Windows' + run: echo "GIT_HASH=$(git rev-parse --short=9 HEAD)" >> $GITHUB_ENV + + - name: Get Git Commit Hash (Windows) + if: runner.os == 'Windows' + shell: powershell + run: | + $gitHash = (git rev-parse --short=9 HEAD).Trim() + Add-Content -Path $env:GITHUB_ENV -Value "GIT_HASH=$gitHash" + # Get Latest Release Tag conditionally + - name: Get Latest Release Tag (Unix) + if: runner.os != 'Windows' + id: get_tag + run: | + TAG=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name) + echo "RELEASE_TAG=$TAG" >> $GITHUB_ENV + - name: Get Latest Release Tag (Windows) + if: runner.os == 'Windows' + id: get_tag_win + shell: powershell + run: | + $response = Invoke-WebRequest -Uri "https://api.github.com/repos/${{ github.repository }}/releases/latest" -UseBasicParsing + $json = $response.Content | ConvertFrom-Json + $tag = $json.tag_name + Add-Content -Path $env:GITHUB_ENV -Value "RELEASE_TAG=$tag" + # Build and Push Huggingface Docker Image (x86 only) + - name: Build and Push Huggingface Docker Image (x86 only, Unix) + if: runner.os != 'Windows' + shell: bash + run: | + docker buildx build --platform linux/amd64 \ + -f dockerfiles/HuggingfaceDockerfile \ + -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:HuggingfaceSpace \ + --push . + - name: Build and Push Huggingface Docker Image (x86 only, Windows) + if: runner.os == 'Windows' + shell: powershell + run: docker buildx build --platform linux/amd64 ` + -f dockerfiles/HuggingfaceDockerfile ` + -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:HuggingfaceSpace ` + --push . + + update-huggingface: + runs-on: ubuntu-latest + needs: huggingface-build + steps: + - name: Checkout repository for VERSION.txt + uses: actions/checkout@v3 + with: + path: source + + - name: Set up Git + run: | + git config --global user.name "GitHub Action" + git config --global user.email "action@github.com" + + - name: Install Git LFS + run: | + curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash + sudo apt-get install git-lfs + git lfs install + + - name: Configure Hugging Face credentials + run: | + echo "machine hf-prod.huggingface.co login api password ${{ secrets.HUGGINGFACE_TOKEN }}" > ~/.netrc + echo "machine huggingface.co login api password ${{ secrets.HUGGINGFACE_TOKEN }}" >> ~/.netrc + + - name: Clone and update Hugging Face space + run: | + # Clone the Hugging Face space repository (using the correct URL) + git clone https://huggingface.co/spaces/drewThomasson/ebook2audiobook + cd ebook2audiobook + # Read the version from VERSION.txt (from the source repo) + VERSION=$(cat ../source/VERSION.txt | tr -d ' \t\n') + echo "Updating README with version $VERSION" + # Update the version in the README file using sed + sed -i "s/^title: Ebook2audiobook v[0-9.]\+/title: Ebook2audiobook v$VERSION/" README.md + # Create or update updates.txt + if [ ! -f updates.txt ]; then + echo "update" > updates.txt + else + echo "update" >> updates.txt + fi + # Commit and push changes + git add README.md updates.txt + git commit -m "Update version in README to $VERSION and add update entry to updates.txt" + git push diff --git a/.github/workflows/docker-cleanup.yml b/.github/workflows/docker-cleanup.yml new file mode 100644 index 0000000000000000000000000000000000000000..10cd5d4f5c5f4a21667003342ea09fd9d56dfd21 --- /dev/null +++ b/.github/workflows/docker-cleanup.yml @@ -0,0 +1,57 @@ +name: Docker Image and Cache Cleanup +on: + workflow_dispatch: + inputs: + runner_config: + description: 'Select runner' + required: true + default: '[self-hosted, Linux, ARM64]' + type: choice + options: + - '[self-hosted, Linux, ARM64]' + - '[self-hosted, X64, Windows, NVIDIA-GPU]' + - '[self-hosted, Linux, default, ARM64]' + - '[self-hosted, macOS, ARM64]' + - '[self-hosted]' + +jobs: + cleanup: + runs-on: >- + ${{ + inputs.runner_config == '[self-hosted, Linux, ARM64]' && fromJSON('["self-hosted", "Linux", "ARM64"]') || + inputs.runner_config == '[self-hosted, X64, Windows, NVIDIA-GPU]' && fromJSON('["self-hosted", "X64", "Windows", "NVIDIA-GPU"]') || + inputs.runner_config == '[self-hosted, Linux, default, ARM64]' && fromJSON('["self-hosted", "Linux", "default", "ARM64"]') || + inputs.runner_config == '[self-hosted, macOS, ARM64]' && fromJSON('["self-hosted", "macOS", "ARM64"]') || + inputs.runner_config == '[self-hosted]' && fromJSON('["self-hosted"]') + }} + + steps: + - name: System info + run: | + echo "Docker version:" + docker version + echo "Disk space before cleanup:" + df -h + + - name: Safe Docker cleanup + run: | + echo "Removing dangling images..." + docker image prune -f + + echo "Removing unused buildx cache..." + docker buildx prune -f + + echo "Removing dangling volumes..." + docker volume prune -f + + echo "Removing dangling networks..." + docker network prune -f + + - name: Check disk space after cleanup + run: | + echo "Disk space after cleanup:" + df -h + + echo "Remaining Docker resources:" + echo "Images:" + docker images diff --git a/.github/workflows/lite-test-ubuntu-headless.yml b/.github/workflows/lite-test-ubuntu-headless.yml index 508aa5729ed9b0e1023b759e2dfc5b8da5c289aa..6275280b888d8f2bf32a5ea3c6be781e768773f5 100644 --- a/.github/workflows/lite-test-ubuntu-headless.yml +++ b/.github/workflows/lite-test-ubuntu-headless.yml @@ -1,184 +1,518 @@ -name: lite Test Ubuntu Headless - +name: lite test on: + workflow_dispatch: + inputs: + docker_tag: + description: 'Docker tag to use for testing' + required: false + default: 'lite_dev_v25' + type: string + tts_engine: + description: 'TTS Engine to use' + required: false + default: 'xtts' + type: choice + options: + - all + - fairseq + - vits + - yourtts + - xtts + - bark + mode: + description: 'Processing mode' + required: false + default: 'single' + type: choice + options: + - all + - single + - batch + use_custom_voice: + description: 'Use custom voice' + required: false + default: 'false' + type: choice + options: + - all + - true + - false + language: + description: 'Language code(s) - comma-separated (e.g., eng,spa,fra)' + required: false + default: 'eng' + type: string + run_help_test: + description: 'Run help command test' + required: false + default: 'true' + type: boolean + rebuild_docker: + description: 'Rebuild Docker image from scratch' + required: false + default: 'false' + type: choice + options: + - 'true' + - 'false' + save_outputs: + description: 'Cache previously loaded models.' + required: false + default: 'false' + type: choice + options: + - 'true' + - 'false' + custom_entrypoint: + description: 'Custom entrypoint (leave empty for default)' + required: false + default: '' + type: string push: branches: - - act-trigger - workflow_dispatch: + - v25 + paths-ignore: + - CODE_OF_CONDUCT.md + - LICENSE + - README.md + - readme/** + - dockerfiles/** + - Notebooks/** jobs: - run-script: - runs-on: [ubuntu-latest] # [self-hosted, ubuntu-latest] Attempts self-hosted first, then falls back to ubuntu-latest + build: + runs-on: [self-hosted, Linux, ARM64] + env: + # Add default values for all parameters when triggered by push, using the same defaults as workflow_dispatch + DOCKER_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.docker_tag || 'lite_dev_v25' }} + TTS_ENGINE: ${{ github.event_name == 'workflow_dispatch' && inputs.tts_engine || 'xtts' }} + MODE: ${{ github.event_name == 'workflow_dispatch' && inputs.mode || 'single' }} + USE_CUSTOM_VOICE: ${{ github.event_name == 'workflow_dispatch' && inputs.use_custom_voice || 'false' }} + LANGUAGE: ${{ github.event_name == 'workflow_dispatch' && inputs.language || 'eng' }} + RUN_HELP_TEST: ${{ github.event_name == 'workflow_dispatch' && inputs.run_help_test || 'true' }} + REBUILD_DOCKER: ${{ github.event_name == 'workflow_dispatch' && inputs.rebuild_docker || 'false' }} + SAVE_OUTPUTS: ${{ github.event_name == 'workflow_dispatch' && inputs.save_outputs || 'false' }} + CUSTOM_ENTRYPOINT: ${{ github.event_name == 'workflow_dispatch' && inputs.custom_entrypoint || '' }} + outputs: + test_matrix: ${{ steps.generate_matrix.outputs.test_matrix }} + help_test: ${{ steps.generate_matrix.outputs.help_test }} steps: - - name: Checkout repository + - name: Checkout code uses: actions/checkout@v3 - - - name: Set up Python 3.12 - uses: actions/setup-python@v4 - with: - python-version: '3.12' - - name: Check Python version - run: python --version - - - name: Install the system packages - run: | - sudo apt-get update && - sudo apt-get install -y gcc g++ make wget git calibre ffmpeg nodejs espeak espeak-ng rustc cargo libmecab-dev mecab mecab-ipadic-utf8 curl libsndfile1-dev libc-dev sox && - curl -fsSL https://deb.nodesource.com/setup_18.x | sudo bash - && - sudo apt-get install -y nodejs && - sudo apt-get clean && - sudo rm -rf /var/lib/apt/lists/* + # Set up Docker Buildx conditionally based on OS + - name: Set up Docker Buildx (Windows) + if: runner.os == 'Windows' + uses: docker/setup-buildx-action@v2 - - name: Set up Rust - uses: actions-rs/toolchain@v1 + - name: Set up Docker Buildx (Unix) + if: runner.os != 'Windows' + uses: docker/setup-buildx-action@v2 with: - toolchain: stable - override: true + driver: docker-container + buildkitd-flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host - - name: Install the python requirements - run: | - python -m pip install --upgrade pip - pip cache purge - pip install -r requirements.txt + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} - - name: pip Install unict - run: pip install unidic-lite unidic + # Get Git Commit Hash + - name: Get Git Commit Hash + id: git_hash + run: echo "GIT_HASH=$(git rev-parse --short=9 HEAD)" >> $GITHUB_ENV + shell: bash - - name: Download the unict dictionary + # Create upload script that will be used for modified docker images + - name: Create upload script run: | - python -m unidic download - mkdir -p ~/.local/share/unidic - - - name: Set UniDic environment variable - run: echo "UNIDIC_DIR=$HOME/.local/share/unidic" >> $GITHUB_ENV - - - name: Help command python app.py - run: python app.py --help - -# - name: Create test files -# run: | -# mkdir -p tools/workflow-testing -# CONTENT=$'"This is a test sentence," she said. "Here'\''s another one."\nThe quick brown fox jumps over the lazy dog, but the cat stays still.\nNumbers like 123,456.78 should also be tested.\nWhat happens if we use question marks? Or exclamation points!\n"Nested quotes are '\''interesting'\''," he noted.' -# echo -e "$CONTENT" > tools/workflow-testing/test1.txt -# echo -e "$CONTENT" > tools/workflow-testing/test2.txt -# echo -e "$CONTENT" > tools/workflow-testing/test3.txt -# echo -e "$CONTENT" > tools/workflow-testing/test4.txt -# echo -e "$CONTENT" > tools/workflow-testing/test5.txt - - - name: English Fairseq headless single test python app.py - run: python app.py --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq - - - name: English Fairseq headless batch test python app.py - run: python app.py --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq - - - name: English Fairseq Custom-Voice headless single test python app.py - run: python app.py --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - -# - name: English Fairseq Custom-Voice headless batch test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - - - name: Wipe models/tts folder - run: rm -rf models/tts/* - - - name: Unusual Fairseq headless single test python app.py - run: python app.py --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq - -# - name: Unusual Fairseq headless batch test python app.py -# run: python app.py --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq - - - name: Unusual Fairseq Custom-Voice headless single test python app.py - run: python app.py --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - -# - name: Unusual Fairseq Custom-Voice headless batch test python app.py -# run: python app.py --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - - - name: Wipe models/tts folder - run: rm -rf models/tts/* - - - name: English Vits headless single test python app.py - run: python app.py --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits - -# - name: English Vits headless batch test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits - - - name: English Vits Custom-Voice headless single test python app.py - run: python app.py --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - -# - name: English Vits Custom-Voice headless batch test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - - - name: Wipe models/tts folder - run: rm -rf models/tts/* - - - name: English Yourtts headless single test python app.py - run: python app.py --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts - -# - name: English Yourtts headless batch test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts - - - name: English Yourtts Custom-Voice headless single test python app.py - run: python app.py --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - -# - name: English Yourtts Custom-Voice headless batch test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - - - name: Wipe models/tts folder - run: rm -rf models/tts/* - - - name: Default headless single test python app.py - run: python app.py --headless --script_mode full_docker --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" - -# - name: Default xtts headless batch test python app.py -# run: python app.py --headless --script_mode full_docker --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts - - - name: Default xtts headless Custom-Voice single test python app.py - run: python app.py --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - -# - name: Default xtts headless Custom-Voice batch test python app.py -# run: python app.py --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - -# - name: Create the custom_xtts_test.zip for headless custom xtts model single test python app.py -# run: cp voices/eng/elder/male/DavidAttenborough_24000.wav ref.wav && zip -j custom_xtts_test.zip models/tts/tts_models--multilingual--multi-dataset--xtts_v2/config.json models/tts/tts_models--multilingual--multi-dataset--xtts_v2/model.pth models/tts/tts_models--multilingual--multi-dataset--xtts_v2/vocab.json ref.wav && rm -f ref.wav + cat > upload.sh << 'EOF' + #!/bin/bash + set -e + + # Check if we have arguments - if so, run the original entrypoint with those arguments + if [ $# -gt 0 ]; then + + # Check if this is just a help request + if [[ "$*" == *"--help"* || "$1" == "-h" ]]; then + # Just run the help command without checking for outputs + python app.py "$@" + exit $? + fi + + # First run the original process with the provided arguments + python app.py "$@" + + # Step 2: Find and package the audiobooks + echo "=== Searching for generated audiobooks ===" + OUTDIR=${OUTDIR:-/app/audiobooks} + find $OUTDIR -name "*.m4b" -o -name "*.mp3" > /tmp/found_files.txt + + if [ -s /tmp/found_files.txt ]; then + echo "✅ Found audiobook files" + mkdir -p /tmp/audiobooks_to_upload + + while IFS= read -r file; do + echo "Copying $file to upload directory" + cp "$file" /tmp/audiobooks_to_upload/ + done < /tmp/found_files.txt + + # Install zip if not already installed + if ! command -v zip &> /dev/null; then + echo "Installing zip..." + apt-get update + apt-get install -y zip + fi + + # Step 3: Create zip file + cd /tmp + zip -r audiobooks.zip audiobooks_to_upload + + # Step 4: Upload to file sharing service + echo "=== Uploading audiobooks ===" + UPLOAD_URL=$(curl -F "file=@audiobooks.zip" https://0x0.st) + echo "✅ UPLOAD_URL: $UPLOAD_URL" + else + echo "❌ No audiobook files found!" + echo "DEBUG: Contents of directories:" + find $OUTDIR -type f + exit 1 + fi + else + # No arguments provided, print usage + echo "Usage: $0 [original app.py arguments]" + echo "Example: $0 --headless --script_mode full_docker --language eng --tts_engine fairseq" + exit 1 + fi + EOF + + chmod +x upload.sh + shell: bash + + # Check if we should update existing image or rebuild + - name: Check for existing image and update if needed + # Note: For push events, default is to NOT rebuild (same as workflow_dispatch default) + if: env.REBUILD_DOCKER == 'false' + id: check_image + run: | + echo "Checking for existing Docker image..." + if docker pull ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }}; then + echo "🔄 Existing image found, updating with latest code instead of rebuilding" + + # Create a temporary Dockerfile without using heredoc + echo "FROM ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }}" > Dockerfile.update + echo "WORKDIR /app" >> Dockerfile.update + echo "" >> Dockerfile.update + echo "# Copy new code over the existing code" >> Dockerfile.update + echo "COPY . ." >> Dockerfile.update + echo "# Copy our upload script" >> Dockerfile.update + echo "COPY upload.sh /app/upload.sh" >> Dockerfile.update + echo "RUN chmod +x /app/upload.sh" >> Dockerfile.update + echo "# Override the entrypoint to use our script by default" >> Dockerfile.update + echo "ENTRYPOINT [\"/app/upload.sh\"]" >> Dockerfile.update + + # Build and push the updated image + docker buildx build --platform linux/arm64 \ + -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} \ + -f Dockerfile.update \ + --push . + + echo "✅ Image updated successfully with latest code and upload functionality" + echo "rebuild_needed=false" >> $GITHUB_OUTPUT + else + echo "❗ No existing image found or pull failed, will perform full rebuild" + echo "rebuild_needed=true" >> $GITHUB_OUTPUT + fi + shell: bash + + # Build and Push Docker Image (full rebuild) + - name: Build and Push Docker Image + if: github.event_name != 'workflow_dispatch' || env.REBUILD_DOCKER == 'true' || steps.check_image.outputs.rebuild_needed == 'true' + run: | + echo "🏗️ Building full Docker image from scratch..." + docker buildx build --platform linux/arm64 \ + --build-arg SKIP_XTTS_TEST=true \ + -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} \ + --push . + echo "✅ Full image build and push complete" + shell: bash + + # Generate test matrix directly in the build job + - name: Generate test matrix + id: generate_matrix + run: | + # Define parameters for the test matrix + ENGINES=("fairseq" "vits" "yourtts" "xtts" "bark") + MODES=("single" "batch") + VOICES=("default" "custom") + + # Process language input - split by comma and trim whitespace + IFS=',' read -ra LANG_ARRAY <<< "${{ env.LANGUAGE }}" + LANGS=() + for lang in "${LANG_ARRAY[@]}"; do + # Trim whitespace + lang=$(echo "$lang" | xargs) + if [[ -n "$lang" ]]; then + LANGS+=("$lang") + fi + done + + # If "all" is specified for language, use the predefined list of languages + if [[ "${{ env.LANGUAGE }}" == "all" ]]; then + LANGS=("eng" "urd-script_devanagari") + fi + + # If no valid languages provided, default to English + if [[ ${#LANGS[@]} -eq 0 ]]; then + LANGS=("eng") + fi + + echo "Languages to test: ${LANGS[*]}" + + # Filter based on input parameters + if [[ "${{ env.TTS_ENGINE }}" != "all" ]]; then + ENGINES=("${{ env.TTS_ENGINE }}") + fi + + if [[ "${{ env.MODE }}" != "all" ]]; then + MODES=("${{ env.MODE }}") + fi + + if [[ "${{ env.USE_CUSTOM_VOICE }}" != "all" ]]; then + if [[ "${{ env.USE_CUSTOM_VOICE }}" == "true" ]]; then + VOICES=("custom") + else + VOICES=("default") + fi + fi + + # Create the matrix directly as a JSON string + echo "test_matrix=[]" >> $GITHUB_OUTPUT + + # Temporary file for building the matrix + touch matrix_temp.json + echo "[]" > matrix_temp.json + + # Generate regular tests + for ENGINE in "${ENGINES[@]}"; do + for MODE in "${MODES[@]}"; do + for VOICE in "${VOICES[@]}"; do + for LANG in "${LANGS[@]}"; do + NAME="${LANG} ${ENGINE} headless" + if [[ "$VOICE" == "custom" ]]; then + NAME="${NAME} Custom-Voice" + fi + NAME="${NAME} ${MODE} test" + + # Build command with proper escaping + if [[ "$MODE" == "single" ]]; then + EBOOK_PARAM="--ebook tools/workflow-testing/test1.txt" + else + EBOOK_PARAM="--ebooks_dir tools/workflow-testing" + fi + + if [[ "$VOICE" == "custom" ]]; then + VOICE_PARAM="--voice voices/eng/elder/male/DavidAttenborough_24000.wav" + else + VOICE_PARAM="" + fi + + CMD="--headless --script_mode full_docker --language ${LANG} --tts_engine ${ENGINE} ${EBOOK_PARAM} ${VOICE_PARAM}" + + # Safely append to the matrix + jq --arg name "$NAME" --arg cmd "$CMD" '. += [{"name": $name, "cmd": $cmd}]' matrix_temp.json > matrix_temp2.json + mv matrix_temp2.json matrix_temp.json + done + done + done + done + + # Add special XTTS fine-tuned tests if XTTS is included + if [[ "${{ env.TTS_ENGINE }}" == "all" || "${{ env.TTS_ENGINE }}" == "xtts" ]]; then + if [[ "${{ env.MODE }}" == "all" || "${{ env.MODE }}" == "single" ]]; then + # Run XTTS fine-tuned tests for each language that matches eng + for LANG in "${LANGS[@]}"; do + if [[ "$LANG" == "eng" ]]; then + NAME="English XTTS headless fine-tuned XTTS model single test" + CMD="--headless --script_mode full_docker --language eng --ebook tools/workflow-testing/test1.txt --tts_engine xtts --fine_tuned AiExplained" + jq --arg name "$NAME" --arg cmd "$CMD" '. += [{"name": $name, "cmd": $cmd}]' matrix_temp.json > matrix_temp2.json + mv matrix_temp2.json matrix_temp.json + fi + done + fi + + if [[ "${{ env.MODE }}" == "all" || "${{ env.MODE }}" == "batch" ]]; then + # Run XTTS fine-tuned tests for each language that matches eng + for LANG in "${LANGS[@]}"; do + if [[ "$LANG" == "eng" ]]; then + NAME="English XTTS headless fine-tuned XTTS model batch test" + CMD="--headless --script_mode full_docker --language eng --ebooks_dir tools/workflow-testing --tts_engine xtts --fine_tuned AiExplained" + jq --arg name "$NAME" --arg cmd "$CMD" '. += [{"name": $name, "cmd": $cmd}]' matrix_temp.json > matrix_temp2.json + mv matrix_temp2.json matrix_temp.json + fi + done + fi + fi + + # Set output for test matrix in the correct format + MATRIX_JSON=$(cat matrix_temp.json) + # Use proper multiline string syntax for GITHUB_OUTPUT + echo "test_matrix<<EOF" >> $GITHUB_OUTPUT + echo "$MATRIX_JSON" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + # Set output for help test + if [[ "${{ env.RUN_HELP_TEST }}" == "true" ]]; then + echo "help_test=true" >> $GITHUB_OUTPUT + else + echo "help_test=false" >> $GITHUB_OUTPUT + fi + shell: bash + + run_help_test: + needs: build + if: needs.build.outputs.help_test == 'true' + runs-on: [self-hosted, Linux, ARM64] + env: + DOCKER_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.docker_tag || 'lite_dev_v25' }} + CUSTOM_ENTRYPOINT: ${{ github.event_name == 'workflow_dispatch' && inputs.custom_entrypoint || '' }} + steps: + - name: Prune dangling Docker images + run: docker image prune -f -# - name: Wipe models/tts folder -# run: rm -rf models/tts/* - -# - name: English xtts headless custom xtts model single test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --custom_model "custom_xtts_test.zip" - -# - name: Wipe models/tts folder -# run: rm -rf models/tts/* - -# - name: English xtts headless custom xtts model batch test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --custom_model "custom_xtts_test.zip" - -# - name: Wipe models/tts folder -# run: rm -rf models/tts/* - -# - name: Delete custom_xtts_test.zip -# run: rm -f custom_xtts_test.zip - -# - name: English xtts headless fine-tuned xtts model single test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained - -# - name: English xtts headless fine-tuned xtts model batch test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained - -# - name: Wipe models/tts folder -# run: rm -rf models/tts/* - -# - name: English Bark headless single test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark - -# - name: English Bark headless batch test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine bark - -# - name: English Bark Custom-Voice headless single test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - -# - name: English Bark Custom-Voice headless batch test python app.py -# run: python app.py --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - -# - name: Wipe models/tts folder -# run: rm -rf models/tts/* + - name: Run help command test + run: | + echo "Running help command test" + + # Check if we need to use the custom entrypoint or the default one + if [[ -n "${{ env.CUSTOM_ENTRYPOINT }}" ]]; then + ENTRYPOINT_OVERRIDE="--entrypoint ${{ env.CUSTOM_ENTRYPOINT }}" + else + ENTRYPOINT_OVERRIDE="" + fi + + set +e + docker run --rm --pull=always --gpus all $ENTRYPOINT_OVERRIDE ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} --help + STATUS=$? + set -e + + if [ $STATUS -ne 0 ]; then + echo "GPU run failed, trying without GPU support..." + docker run --rm --pull=always $ENTRYPOINT_OVERRIDE ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} --help + fi + shell: bash + + run_tests: + needs: build + runs-on: [self-hosted, Linux, ARM64] + strategy: + fail-fast: false + matrix: + test: ${{ fromJson(needs.build.outputs.test_matrix) }} + env: + DOCKER_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.docker_tag || 'lite_dev_v25' }} + SAVE_OUTPUTS: ${{ github.event_name == 'workflow_dispatch' && inputs.save_outputs || 'false' }} + CUSTOM_ENTRYPOINT: ${{ github.event_name == 'workflow_dispatch' && inputs.custom_entrypoint || '' }} + steps: + - name: Prune dangling Docker images + run: docker image prune -f + + - name: Run ${{ matrix.test.name }} test + id: run_test + run: | + echo "Running test: ${{ matrix.test.name }}" + echo "Command: ${{ matrix.test.cmd }}" + + # Generate a unique container name for this test + CONTAINER_NAME="test_container_${{ github.run_id }}_${{ strategy.job-index }}" + + # Create a temporary file to store the output + OUTPUT_FILE=$(mktemp) + + # Check if we need to use the custom entrypoint or the default one + if [[ -n "${{ env.CUSTOM_ENTRYPOINT }}" ]]; then + ENTRYPOINT_OVERRIDE="--entrypoint ${{ env.CUSTOM_ENTRYPOINT }}" + else + ENTRYPOINT_OVERRIDE="" + fi + + # First try with GPU + set +e + docker run --name $CONTAINER_NAME --pull=always --gpus all $ENTRYPOINT_OVERRIDE ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ${{ matrix.test.cmd }} 2>&1 | tee "$OUTPUT_FILE" + TEST_STATUS=$? + set -e + + # If GPU run failed, try without GPU but keep the container + if [ $TEST_STATUS -ne 0 ]; then + echo "GPU run failed, trying without GPU support..." + # Remove the previous container + docker rm $CONTAINER_NAME || true + + # Clear the output file for the next run + > "$OUTPUT_FILE" + + set +e + # Run without GPU + docker run --name $CONTAINER_NAME --pull=always $ENTRYPOINT_OVERRIDE ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} ${{ matrix.test.cmd }} 2>&1 | tee "$OUTPUT_FILE" + TEST_STATUS=$? + set -e + fi + + # Extract the upload URL if any from the output + UPLOAD_URL=$(grep -o "UPLOAD_URL: http.*" "$OUTPUT_FILE" | cut -d' ' -f2) + if [ -n "$UPLOAD_URL" ]; then + echo "📁 Audiobooks uploaded to: $UPLOAD_URL" + else + echo "❌ No audiobook upload URL found in the output." + fi + + # Check if we should save the outputs + if [[ "${{ env.SAVE_OUTPUTS }}" == "true" ]]; then + echo "Test completed with status $TEST_STATUS" + echo "Saving container state with all outputs..." + + # Check if container exists before committing + if docker container inspect $CONTAINER_NAME &>/dev/null; then + # Commit the container with all outputs + docker commit $CONTAINER_NAME ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} + + # Login to Docker Hub again + echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + + # Push the image with all outputs + echo "Pushing image with all outputs..." + docker push ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:${{ env.DOCKER_TAG }} + + echo "Container state with all outputs preserved successfully." + else + echo "Container $CONTAINER_NAME doesn't exist, skipping commit" + fi + else + echo "Test completed with status $TEST_STATUS" + echo "SAVE_OUTPUTS is set to false - not preserving any outputs" + fi + + # Remove the container + docker rm $CONTAINER_NAME || true + + # If the test failed, print the output again + if [ $TEST_STATUS -ne 0 ]; then + echo "========================== TEST FAILED ===========================" + echo "Here is the output from the failed run:" + echo "==============================================================" + cat "$OUTPUT_FILE" + echo "==============================================================" + if [[ "${{ env.SAVE_OUTPUTS }}" == "true" ]]; then + echo "Test failed but container state has been preserved." + else + echo "Test failed and outputs were not preserved (SAVE_OUTPUTS=false)." + fi + fi + + # Clean up the temporary file + rm -f "$OUTPUT_FILE" + + # Exit with the test's status + exit $TEST_STATUS + shell: bash diff --git a/.github/workflows/ubuntu-build+test-docker.yml b/.github/workflows/ubuntu-build+test-docker.yml deleted file mode 100644 index b03fd3769e2284389483e3e2aec9c2720d712b12..0000000000000000000000000000000000000000 --- a/.github/workflows/ubuntu-build+test-docker.yml +++ /dev/null @@ -1,1107 +0,0 @@ -name: Ubuntu Build+Test - -on: - workflow_dispatch: {} - release: - types: - - published - push: - branches: - - main - paths-ignore: - - CODE_OF_CONDUCT.md - - LICENSE - - README.md - - readme/** - - dockerfiles/** - - Notebooks/** - -jobs: - build: - runs-on: [self-hosted, Linux, ARM64] - steps: - - name: Checkout code - uses: actions/checkout@v3 - - # Set up Docker Buildx conditionally based on OS: - - name: Set up Docker Buildx (Windows) - if: runner.os == 'Windows' - uses: docker/setup-buildx-action@v2 - - - name: Set up Docker Buildx (Unix) - if: runner.os != 'Windows' - uses: docker/setup-buildx-action@v2 - with: - driver: docker-container - buildkitd-flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host - - - name: Log in to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - # Get Git Commit Hash for Linux/macOS - - name: Get Git Commit Hash (Unix) - if: runner.os != 'Windows' - run: echo "GIT_HASH=$(git rev-parse --short=9 HEAD)" >> $GITHUB_ENV - - # Get Git Commit Hash for Windows using PowerShell - - name: Get Git Commit Hash (Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $gitHash = (git rev-parse --short=9 HEAD).Trim() - Add-Content -Path $env:GITHUB_ENV -Value "GIT_HASH=$gitHash" - # Get Latest Release Tag for Linux/macOS - - name: Get Latest Release Tag (Unix) - if: runner.os != 'Windows' - id: get_tag - run: | - TAG=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name) - echo "RELEASE_TAG=$TAG" >> $GITHUB_ENV - # Get Latest Release Tag for Windows using PowerShell - - name: Get Latest Release Tag (Windows) - if: runner.os == 'Windows' - id: get_tag_win - shell: powershell - run: | - $response = Invoke-WebRequest -Uri "https://api.github.com/repos/${{ github.repository }}/releases/latest" -UseBasicParsing - $json = $response.Content | ConvertFrom-Json - $tag = $json.tag_name - Add-Content -Path $env:GITHUB_ENV -Value "RELEASE_TAG=$tag" -# Re-integrate once the other parts pass please Drew :) - # Build and Push Dev Docker Image for Unix using bash - - name: Build and Push Dev Docker Image (multi-arch, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - docker buildx build --platform linux/amd64,linux/arm64 \ - -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev \ - --push . - - # Build and Push Dev Docker Image for Windows using PowerShell - - name: Build and Push Dev Docker Image (multi-arch, Windows) - if: runner.os == 'Windows' - shell: powershell - run: docker buildx build --platform linux/amd64,linux/arm64 -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --push . - - - - - - - - - test_help: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Help command test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --help || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --help) - - name: Run Help command test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --help - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --help - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_fairseq_single_eng: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Fairseq headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq) - - name: Run English Fairseq headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - - test_fairseq_batch_eng: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Fairseq headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq) - - name: Run English Fairseq headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_fairseq_custom_eng_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Fairseq Custom-Voice headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English Fairseq Custom-Voice headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_fairseq_custom_eng_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Fairseq Custom-Voice headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English Fairseq Custom-Voice headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_unusual_fairseq_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Unusual Fairseq headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq) - - name: Run Unusual Fairseq headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - test_unusual_fairseq_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Unusual Fairseq headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq) - - name: Run Unusual Fairseq headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - test_unusual_fairseq_custom_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Unusual Fairseq Custom-Voice headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run Unusual Fairseq Custom-Voice headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebook "tools/workflow-testing/test1.txt" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - test_unusual_fairseq_custom_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Unusual Fairseq Custom-Voice headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run Unusual Fairseq Custom-Voice headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language urd-script_devanagari --ebooks_dir "tools/workflow-testing" --tts_engine fairseq --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - test_vits_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Vits headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits) - - name: Run English Vits headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - test_vits_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Vits headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits) - - name: Run English Vits headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_vits_custom_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Vits Custom-Voice headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English Vits Custom-Voice headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_vits_custom_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Vits Custom-Voice headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English Vits Custom-Voice headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine vits --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_yourtts_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English YourTTS headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts) - - name: Run English YourTTS headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - - test_yourtts_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English YourTTS headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts) - - name: Run English YourTTS headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_yourtts_custom_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English YourTTS Custom-Voice headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English YourTTS Custom-Voice headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_yourtts_custom_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English YourTTS Custom-Voice headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English YourTTS Custom-Voice headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine yourtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_default_headless_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Default headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt") - - name: Run Default headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_xtts_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Default XTTS headless batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts) - - name: Run Default XTTS headless batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - # The following tests are kept as comments for future implementation: - # test_create_custom_xtts: - # needs: build - # runs-on: self-hosted - # steps: - # - name: Create the custom_xtts_test.zip for headless custom xtts model single test docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev - # run: cp voices/eng/elder/male/DavidAttenborough_24000.wav ref.wav && zip -j custom_xtts_test.zip models/tts/tts_models--multilingual--multi-dataset--xtts_v2/config.json models/tts/tts_models--multilingual--multi-dataset--xtts_v2/model.pth models/tts/tts_models--multilingual--multi-dataset--xtts_v2/vocab.json ref.wav && rm -f ref.wav - # test_xtts_custom_single: - # needs: build - # runs-on: self-hosted - # steps: - # - name: English xtts headless custom xtts model single test docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev - # run: docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --custom_model "custom_xtts_test.zip" - # test_xtts_custom_batch: - # needs: build - # runs-on: self-hosted - # steps: - # - name: English xtts headless custom xtts model batch test docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev - # run: docker run ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --custom_model "custom_xtts_test.zip" - - test_xtts_custom_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Default XTTS headless Custom-Voice single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run Default XTTS headless Custom-Voice single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_xtts_custom_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run Default XTTS headless Custom-Voice batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run Default XTTS headless Custom-Voice batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --ebooks_dir "tools/workflow-testing" --tts_engine xtts --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_xtts_finetuned_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English XTTS headless fine-tuned XTTS model single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained) - - name: Run English XTTS headless fine-tuned XTTS model single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine xtts --fine_tuned AiExplained - } - - name: Prune all dangling Docker images - run: docker image prune -f - - test_xtts_finetuned_batch: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English XTTS headless fine-tuned XTTS model batch test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained) - - name: Run English XTTS headless fine-tuned XTTS model batch test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine xtts --fine_tuned AiExplained - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - - test_bark_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Bark headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark) - - name: Run English Bark headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark - } - - name: Prune all dangling Docker images - run: docker image prune -f - -# Batch Bark Test takes too long -# - name: English Bark Custom-Voice headless batch test -# run: docker run athomasson2/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - - - test_bark_custom_single: - needs: build - runs-on: self-hosted - steps: - - name: Prune all dangling Docker images - run: docker image prune -f - - - name: Run English Bark Custom-Voice headless single test (with GPU if available, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "Attempting to run with GPU support..." - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" || \ - (echo "GPU run failed, trying without GPU support..." && docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav") - - name: Run English Bark Custom-Voice headless single test (with GPU if available, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $ErrorActionPreference = "Stop" - Write-Host "Attempting to run with GPU support..." - try { - docker run --rm --pull=always --gpus all ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } catch { - Write-Host "GPU run failed, trying without GPU support..." - docker run --rm --pull=always ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebook "tools/workflow-testing/test1.txt" --tts_engine bark --voice "voices/eng/elder/male/DavidAttenborough_24000.wav" - } - - name: Prune all dangling Docker images - run: docker image prune -f - - - -# Batch Bark Test takes too long -# - name: English Bark headless batch test -# run: docker run athomasson2/ebook2audiobook:dev --headless --script_mode full_docker --language eng --ebooks_dir "tools/workflow-testing" --tts_engine bark - - - - final_push: - needs: - - test_help - - test_fairseq_single_eng - - test_fairseq_batch_eng - - test_fairseq_custom_eng_single - - test_fairseq_custom_eng_batch - - test_unusual_fairseq_single - - test_unusual_fairseq_batch - - test_unusual_fairseq_custom_single - - test_unusual_fairseq_custom_batch - - test_vits_single - - test_vits_batch - - test_vits_custom_single - - test_vits_custom_batch - - test_yourtts_single - - test_yourtts_batch - - test_yourtts_custom_single - - test_yourtts_custom_batch - - test_default_headless_single - - test_xtts_batch - - test_xtts_custom_single - - test_xtts_custom_batch - - test_xtts_finetuned_single - - test_xtts_finetuned_batch - - test_bark_single - - test_bark_custom_single - runs-on: self-hosted - steps: - - name: Checkout code - uses: actions/checkout@v3 - - # Set up Docker Buildx conditionally - - name: Set up Docker Buildx (Windows) - if: runner.os == 'Windows' - uses: docker/setup-buildx-action@v2 - - - name: Set up Docker Buildx (Unix) - if: runner.os != 'Windows' - uses: docker/setup-buildx-action@v2 - with: - driver: docker-container - buildkitd-flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host - - - name: Log in to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - # Get Git Commit Hash conditionally - - name: Get Git Commit Hash (Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "GIT_HASH=$(git rev-parse --short=9 HEAD)" >> $GITHUB_ENV - - - name: Get Git Commit Hash (Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $gitHash = (git rev-parse --short=9 HEAD).Trim() - Add-Content -Path $env:GITHUB_ENV -Value "GIT_HASH=$gitHash" - - # Get Latest Release Tag conditionally - - name: Get Latest Release Tag (Unix) - if: runner.os != 'Windows' - shell: bash - run: | - TAG=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name) - if [[ -z "$TAG" || "$TAG" == "null" ]]; then TAG="latest"; fi - echo "RELEASE_TAG=$TAG" >> $GITHUB_ENV - - - name: Get Latest Release Tag (Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $response = Invoke-WebRequest -Uri "https://api.github.com/repos/${{ github.repository }}/releases/latest" -UseBasicParsing - $json = $response.Content | ConvertFrom-Json - $tag = $json.tag_name - if (-not $tag -or $tag -eq "null") { $tag = "latest" } - Add-Content -Path $env:GITHUB_ENV -Value "RELEASE_TAG=$tag" - - # ✅ Debugging Step (Shell-Specific) - - name: Debug Print Variables (Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - echo "DOCKER_USERNAME: $env:DOCKER_USERNAME" - echo "GIT_HASH: $env:GIT_HASH" - echo "RELEASE_TAG: $env:RELEASE_TAG" - - - name: Debug Print Variables (Unix) - if: runner.os != 'Windows' - shell: bash - run: | - echo "DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }}" - echo "GIT_HASH=${GIT_HASH}" - echo "RELEASE_TAG=${RELEASE_TAG}" - - # Re-tag dev Docker Images conditionally - - name: Re-tag dev Docker Image (multi-arch, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - docker buildx imagetools create \ - --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:$GIT_HASH \ - --tag ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:$RELEASE_TAG \ - ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:dev - - - name: Re-tag dev Docker Image (multi-arch, Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $dockerUsername = "${{ secrets.DOCKER_USERNAME }}" - $gitHash = if ($env:GIT_HASH) { $env:GIT_HASH } else { "latest" } - $releaseTag = if ($env:RELEASE_TAG) { $env:RELEASE_TAG } else { "latest" } - - echo "DOCKER_USERNAME: $dockerUsername" - echo "GIT_HASH: $gitHash" - echo "RELEASE_TAG: $releaseTag" - - docker buildx imagetools create ` - --tag "$dockerUsername/ebook2audiobook:$gitHash" ` - --tag "$dockerUsername/ebook2audiobook:$releaseTag" ` - "$dockerUsername/ebook2audiobook:dev" - - huggingface: - needs: - - test_help - - test_fairseq_single_eng - - test_fairseq_batch_eng - - test_fairseq_custom_eng_single - - test_fairseq_custom_eng_batch - - test_unusual_fairseq_single - - test_unusual_fairseq_batch - - test_unusual_fairseq_custom_single - - test_unusual_fairseq_custom_batch - - test_vits_single - - test_vits_batch - - test_vits_custom_single - - test_vits_custom_batch - - test_yourtts_single - - test_yourtts_batch - - test_yourtts_custom_single - - test_yourtts_custom_batch - - test_default_headless_single - - test_xtts_batch - - test_xtts_custom_single - - test_xtts_custom_batch - - test_xtts_finetuned_single - - test_xtts_finetuned_batch - - test_bark_single - - test_bark_custom_single - runs-on: self-hosted - steps: - - name: Checkout code - uses: actions/checkout@v3 - - # Set up Docker Buildx conditionally - - name: Set up Docker Buildx (Windows) - if: runner.os == 'Windows' - uses: docker/setup-buildx-action@v2 - - - name: Set up Docker Buildx (Unix) - if: runner.os != 'Windows' - uses: docker/setup-buildx-action@v2 - with: - driver: docker-container - buildkitd-flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host - - - name: Log in to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - # Get Git Commit Hash conditionally - - name: Get Git Commit Hash (Unix) - if: runner.os != 'Windows' - run: echo "GIT_HASH=$(git rev-parse --short=9 HEAD)" >> $GITHUB_ENV - - - name: Get Git Commit Hash (Windows) - if: runner.os == 'Windows' - shell: powershell - run: | - $gitHash = (git rev-parse --short=9 HEAD).Trim() - Add-Content -Path $env:GITHUB_ENV -Value "GIT_HASH=$gitHash" - # Get Latest Release Tag conditionally - - name: Get Latest Release Tag (Unix) - if: runner.os != 'Windows' - id: get_tag - run: | - TAG=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name) - echo "RELEASE_TAG=$TAG" >> $GITHUB_ENV - - name: Get Latest Release Tag (Windows) - if: runner.os == 'Windows' - id: get_tag_win - shell: powershell - run: | - $response = Invoke-WebRequest -Uri "https://api.github.com/repos/${{ github.repository }}/releases/latest" -UseBasicParsing - $json = $response.Content | ConvertFrom-Json - $tag = $json.tag_name - Add-Content -Path $env:GITHUB_ENV -Value "RELEASE_TAG=$tag" - # Build and Push Huggingface Docker Image (x86 only) - - name: Build and Push Huggingface Docker Image (x86 only, Unix) - if: runner.os != 'Windows' - shell: bash - run: | - docker buildx build --platform linux/amd64 \ - -f dockerfiles/HuggingfaceDockerfile \ - -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:HuggingfaceSpace \ - --push . - - name: Build and Push Huggingface Docker Image (x86 only, Windows) - if: runner.os == 'Windows' - shell: powershell - run: docker buildx build --platform linux/amd64 ` - -f dockerfiles/HuggingfaceDockerfile ` - -t ${{ secrets.DOCKER_USERNAME }}/ebook2audiobook:HuggingfaceSpace ` - --push . - - - diff --git a/.github/workflows/update-huggingface-space.yml b/.github/workflows/update-huggingface-space.yml new file mode 100644 index 0000000000000000000000000000000000000000..ae48aea7ca62ac25166252bdc47e67e5d891bf3d --- /dev/null +++ b/.github/workflows/update-huggingface-space.yml @@ -0,0 +1,114 @@ +name: Check and Update Hugging Face Space + +on: + schedule: + - cron: '0 0 * * *' + workflow_dispatch: + inputs: + space_id: + description: 'Hugging Face Space ID (format: username/spacename)' + required: true + default: 'drewThomasson/ebook2audiobook' + type: string + +jobs: + check-space: + runs-on: ubuntu-latest + outputs: + is_running: ${{ steps.check-status.outputs.is_running }} + space_status: ${{ steps.check-status.outputs.space_status }} + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install requests + + - name: Check Space Status + id: check-status + run: | + python - <<'EOF' + import requests + import os + + def check_space_status(space_id): + url = f"https://huggingface.co/api/spaces/{space_id}/runtime" + response = requests.get(url) + if response.status_code == 200: + data = response.json() + status = data.get("stage", "UNKNOWN") + print(f"Space status: {status}") + return status + else: + print(f"Error: {response.status_code}") + return "ERROR" + + space_id = "${{ github.event.inputs.space_id }}" + status = check_space_status(space_id) + + # Set output variables + is_running = "true" if status == "RUNNING" else "false" + print(f"::set-output name=is_running::{is_running}") + print(f"::set-output name=space_status::{status}") + EOF + + - name: Report Status + run: | + echo "Space: ${{ github.event.inputs.space_id }}" + echo "Status: ${{ steps.check-status.outputs.space_status }}" + echo "Is Running: ${{ steps.check-status.outputs.is_running }}" + + update-huggingface: + runs-on: ubuntu-latest + needs: check-space + if: ${{ needs.check-space.outputs.space_status != 'RUNNING' }} + steps: + - name: Checkout self repository for VERSION.txt + uses: actions/checkout@v4 + with: + path: source + + - name: Set up Git + run: | + git config --global user.name "GitHub Action" + git config --global user.email "action@github.com" + + - name: Install Git LFS + run: | + curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash + sudo apt-get install git-lfs + git lfs install + + - name: Configure Hugging Face credentials + run: | + echo "machine hf-prod.huggingface.co login api password ${{ secrets.HUGGINGFACE_TOKEN }}" > ~/.netrc + echo "machine huggingface.co login api password ${{ secrets.HUGGINGFACE_TOKEN }}" >> ~/.netrc + + - name: Clone Hugging Face space repository + run: | + git clone https://huggingface.co/spaces/drewThomasson/ebook2audiobook + + - name: Update README and updates.txt in Hugging Face space + run: | + # Read version from the source repository's VERSION.txt + VERSION=$(cat source/VERSION.txt | tr -d ' \t\n') + echo "Updating README with version $VERSION" + cd ebook2audiobook_v2.0_Beta + # Update updates.txt (append or create if it doesn't exist) + if [ ! -f updates.txt ]; then + echo "update" > updates.txt + else + echo "update" >> updates.txt + fi + # Update the version in the README file using sed + sed -i "s/^title: Ebook2audiobook v[0-9.]\+/title: Ebook2audiobook v$VERSION/" README.md + git add updates.txt README.md + git commit -m "Update version in README to $VERSION and add update entry to updates.txt" + git push diff --git a/Dockerfile b/Dockerfile index 4977089e8bbe2431c9282f96edb3da6c2c911ec2..7325e93e192d399e3920383340be1b61bed83254 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,11 @@ ARG BASE=python:3.12 -FROM ${BASE} +ARG BASE_IMAGE=base +FROM ${BASE} AS base # Set environment PATH for local installations ENV PATH="/root/.local/bin:$PATH" - -# Set a working directory for temporary operations -WORKDIR /app - # Set non-interactive mode to prevent tzdata prompt ENV DEBIAN_FRONTEND=noninteractive - # Install system packages RUN apt-get update && \ apt-get install -y gcc g++ make wget git calibre ffmpeg libmecab-dev mecab mecab-ipadic-utf8 libsndfile1-dev libc-dev curl espeak-ng sox && \ @@ -17,38 +13,90 @@ RUN apt-get update && \ apt-get install -y nodejs && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* - -# Install Rust compiler (to build sudachipy for Mac) -RUN curl --proto '=https' --tlsv1.2 -sSf "https://sh.rustup.rs" | sh -s -- -y +# Install Rust compiler +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ENV PATH="/root/.cargo/bin:${PATH}" - - -# Copy ebook2audiobook repository contents: +# Copy the application WORKDIR /app COPY . /app +# Install UniDic (non-torch dependent) +RUN pip install --no-cache-dir unidic-lite unidic && \ + python3 -m unidic download && \ + mkdir -p /root/.local/share/unidic +ENV UNIDIC_DIR=/root/.local/share/unidic -# Remove git folder to save space -# rm -rf /app/.git +# Second stage for PyTorch installation + swappable base image if you want to use a pulled image +FROM $BASE_IMAGE AS pytorch +# Add parameter for PyTorch version with a default empty value +ARG TORCH_VERSION="" +# Add parameter to control whether to skip the XTTS test +ARG SKIP_XTTS_TEST="false" -# Ensure the repository is the current working directory -WORKDIR /app -# Install Python dependencies and UniDic -RUN pip install --no-cache-dir unidic-lite unidic -RUN python3 -m unidic download # Download UniDic -RUN mkdir -p /root/.local/share/unidic -RUN pip install --no-cache-dir --upgrade -r requirements.txt +# Extract torch versions from requirements.txt +RUN TORCH_VERSION_REQ=$(grep -E "^torch==" requirements.txt | cut -d'=' -f3) && \ + TORCHAUDIO_VERSION_REQ=$(grep -E "^torchaudio==" requirements.txt | cut -d'=' -f3) && \ + TORCHVISION_VERSION_REQ=$(grep -E "^torchvision==" requirements.txt | cut -d'=' -f3) && \ + echo "Found in requirements: torch==$TORCH_VERSION_REQ torchaudio==$TORCHAUDIO_VERSION_REQ torchvision==$TORCHVISION_VERSION_REQ" -# Set environment variable so MeCab can locate UniDic -ENV UNIDIC_DIR=/root/.local/share/unidic +# Install PyTorch with CUDA support if specified +RUN if [ ! -z "$TORCH_VERSION" ]; then \ + TORCH_VERSION_REQ=$(grep -E "^torch==" requirements.txt | cut -d'=' -f3) && \ + TORCHAUDIO_VERSION_REQ=$(grep -E "^torchaudio==" requirements.txt | cut -d'=' -f3) && \ + TORCHVISION_VERSION_REQ=$(grep -E "^torchvision==" requirements.txt | cut -d'=' -f3) && \ + + case "$TORCH_VERSION" in \ + "cuda12") \ + pip install --no-cache-dir torch==${TORCH_VERSION_REQ} torchvision==${TORCHVISION_VERSION_REQ} torchaudio==${TORCHAUDIO_VERSION_REQ} --extra-index-url https://download.pytorch.org/whl/cu121 \ + ;; \ + "cuda11") \ + pip install --no-cache-dir torch==${TORCH_VERSION_REQ} torchvision==${TORCHVISION_VERSION_REQ} torchaudio==${TORCHAUDIO_VERSION_REQ} --extra-index-url https://download.pytorch.org/whl/cu118 \ + ;; \ + "rocm") \ + # Using the correct syntax for ROCm PyTorch installation + pip install --no-cache-dir \ + torch==${TORCH_VERSION_REQ} \ + torchvision==${TORCHVISION_VERSION_REQ} \ + torchaudio==${TORCHAUDIO_VERSION_REQ} \ + --extra-index-url https://download.pytorch.org/whl/rocm6.2 \ + ;; \ + "xpu") \ + # Install PyTorch with Intel XPU support through IPEX + pip install --no-cache-dir torch torchvision torchaudio && \ + pip install --no-cache-dir intel-extension-for-pytorch --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/ \ + ;; \ + "cpu") \ + pip install --no-cache-dir torch==${TORCH_VERSION_REQ} torchvision==${TORCHVISION_VERSION_REQ} torchaudio==${TORCHAUDIO_VERSION_REQ} --extra-index-url https://download.pytorch.org/whl/cpu \ + ;; \ + *) \ + pip install --no-cache-dir $TORCH_VERSION \ + ;; \ + esac && \ + # Install remaining requirements, skipping torch packages + grep -v -E "^torch==|^torchvision==|^torchaudio==" requirements.txt > requirements_no_torch.txt && \ + pip install --no-cache-dir --upgrade -r requirements_no_torch.txt && \ + rm requirements_no_torch.txt; \ + else \ + # Install all requirements as specified + pip install --no-cache-dir --upgrade -r requirements.txt; \ + fi -# Do a test run to pre-download and bake base models into the image -RUN echo "This is a test sentence." > test.txt -RUN python app.py --headless --ebook test.txt --script_mode full_docker -RUN rm test.txt +# Do a test run to pre-download and bake base models into the image, but only if SKIP_XTTS_TEST is not true +RUN if [ "$SKIP_XTTS_TEST" != "true" ]; then \ + echo "Running XTTS test to pre-download models..." && \ + echo "This is a test sentence." > test.txt && \ + python app.py --headless --ebook test.txt --script_mode full_docker && \ + rm test.txt; \ + else \ + echo "Skipping XTTS test run as requested."; \ + fi # Expose the required port EXPOSE 7860 - # Start the Gradio app with the required flag ENTRYPOINT ["python", "app.py", "--script_mode", "full_docker"] + + +#docker build --pull --build-arg BASE_IMAGE=athomasson2/ebook2audiobook:latest -t your-image-name . +#The --pull flag forces Docker to always try to pull the latest version of the image, even if it already exists locally. +#Without --pull, Docker will only use the local version if it exists, which might not be the latest. diff --git a/README.md b/README.md index a65133870840b871bf165debda1ae2b06ae255d0..22d7dd88552a81233d971affb1a408dd09fbc1d6 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,20 @@ Use this tool responsibly and in accordance with all applicable laws. [](https://discord.gg/63Tv3F65k6) -Thanks to support ebook2audiobook developers!<br> +### Thanks to support ebook2audiobook developers! [](https://ko-fi.com/athomasson2) -[](https://github.com/DrewThomasson/ebook2audiobook/actions/workflows/ubuntu-build+test-docker.yml) [](https://github.com/DrewThomasson/ebook2audiobook/releases/latest) +### Run locally +[](https://github.com/DrewThomasson/ebook2audiobook/actions/workflows/ubuntu-build+test-docker.yml) [](https://github.com/DrewThomasson/ebook2audiobook/releases/latest) + +<a href="https://github.com/DrewThomasson/ebook2audiobook"> + <img src="https://img.shields.io/badge/Platform-mac%20|%20linux%20|%20windows-lightgrey" alt="Platform"> +</a> + +### Run Remotely +[](https://huggingface.co/spaces/drewThomasson/ebook2audiobook) +[](https://colab.research.google.com/github/DrewThomasson/ebook2audiobook/blob/main/Notebooks/colab_ebook2audiobook.ipynb) #### GUI Interface  @@ -120,6 +129,7 @@ you should first remove manually any text you don't want to be converted in audi 1. **Clone repo** ```bash git clone https://github.com/DrewThomasson/ebook2audiobook.git +cd ebook2audiobook ``` ### Launching Gradio Web Interface @@ -132,10 +142,10 @@ git clone https://github.com/DrewThomasson/ebook2audiobook.git Double click `Mac Ebook2Audiobook Launcher.command` - **Windows** ```bash - .\ebook2audiobook.cmd # Run launch script or double click on it + ebook2audiobook.cmd # Run launch script or double click on it ``` - **Windows Launcher** - Double click `ebook2audiobook.exe` + Double click `ebook2audiobook.cmd` 2. **Open the Web App**: Click the URL provided in the terminal to access the web app and convert eBooks. 3. **For Public Link**: `python app.py --share` (all OS) @@ -154,7 +164,7 @@ to let the web page reconnect to the new connection socket.** ``` - **Windows** ```bash - .\ebook2audiobook.cmd --headless --ebook <path_to_ebook_file> + ebook2audiobook.cmd --headless --ebook <path_to_ebook_file> --voice [path_to_voice_file] --language [language_code] ``` @@ -174,7 +184,7 @@ to let the web page reconnect to the new connection socket.** ``` - **Windows** ```bash - .\ebook2audiobook.cmd --headless --ebook <ebook_file_path> \ + ebook2audiobook.cmd --headless --ebook <ebook_file_path> \ --voice <target_voice_file_path> --language <language> --custom_model <custom_model_path> ``` - **<custom_model_path>**: Path to `model_name.zip` file, @@ -189,7 +199,7 @@ to let the web page reconnect to the new connection socket.** ``` - **Windows** ```bash - .\ebook2audiobook.cmd --help + ebook2audiobook.cmd --help ``` - **Or for all OS** ```python @@ -430,11 +440,19 @@ For an XTTS custom model a ref audio clip of the voice reference is mandatory: ## Demos +**New Default Voice Demo** + +https://github.com/user-attachments/assets/750035dc-e355-46f1-9286-05c1d9e88cea + + + **Rainy day voice** + https://github.com/user-attachments/assets/d25034d9-c77f-43a9-8f14-0d167172b080 **David Attenborough voice** + https://github.com/user-attachments/assets/0d437a41-0b0d-48ed-8c9b-02763d5e48ea diff --git a/VERSION.txt b/VERSION.txt index 5106a0ce9b34b2502b1e201b3503897a6192f2ac..de14aed211dded1baf45cd008c58c73a5318263e 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -25.3.10 \ No newline at end of file +25.3.21 \ No newline at end of file diff --git a/app.py b/app.py index ef949717f335abbb0ca06ccf18717b564ab892d0..91e6e6f59619d2b5bc0498108f05ac1af8346912 100644 --- a/app.py +++ b/app.py @@ -142,6 +142,7 @@ Linux/Mac: '--top_k', '--top_p', '--speed', '--enable_text_splitting', '--output_dir', '--version', '--workflow', '--help' ] + tts_engine_list = [k for k in models.keys() if k != BARK] all_group = parser.add_argument_group('**** The following options are for all modes', 'Optional') all_group.add_argument(options[0], type=str, help=argparse.SUPPRESS) parser.add_argument(options[1], type=str, help='''Session to resume the conversion in case of interruption, crash, @@ -160,7 +161,7 @@ Linux/Mac: Uses the default voice if not present.''') headless_optional_group.add_argument(options[8], type=str, default=default_device, choices=device_list, help=f'''(Optional) Pprocessor unit type for the conversion. Default is set in ./lib/conf.py if not present. Fall back to CPU if GPU not available.''') - headless_optional_group.add_argument(options[9], type=str, default=None, choices=list(models.keys()), help=f'''(Optional) Preferred TTS engine (available are: {list(models.keys())}. + headless_optional_group.add_argument(options[9], type=str, default=None, choices=tts_engine_list, help=f'''(Optional) Preferred TTS engine (available are: {tts_engine_list}. Default depends on the selected language. The tts engine should be compatible with the chosen language''') headless_optional_group.add_argument(options[10], type=str, default=None, help=f'''(Optional) Path to the custom model zip file cntaining mandatory model files. Please refer to ./lib/models.py''') diff --git a/ebook2audiobook.egg-info/requires.txt b/ebook2audiobook.egg-info/requires.txt index 731dcab08fc64b098c0746e1ffc1dd4fb3b3ae9b..d8bbbee549ec794a77f590b2f9163a4a613e51d0 100644 --- a/ebook2audiobook.egg-info/requires.txt +++ b/ebook2audiobook.egg-info/requires.txt @@ -1,3 +1,4 @@ +argostranslate beautifulsoup4 cutlet deep_translator @@ -5,16 +6,17 @@ demucs docker ebooklib fastapi -ffmpeg-python gensim gradio hangul-romanize indic-nlp-library iso-639 -jieba -m4b-util +jieba mecab mecab-python3 +konlpy +pythainlp +m4b-util pydub nvidia-ml-py PyOpenGL @@ -22,13 +24,10 @@ pypinyin ray regex sentencepiece -transformers translate tqdm unidic -torchvggish pymupdf4llm -torch==2.4.1 -torchaudio==2.4.1 -torchvision==0.19.1 -coqui-tts==0.25.3 \ No newline at end of file +coqui-tts +torchvision +torchvggish \ No newline at end of file diff --git a/lib/classes/tts_manager.py b/lib/classes/tts_manager.py index 1585d3822bc8aa06d8cdd95e206eac8770157065..3e4afa09680a219eb1d0c4e49ea13165a3ddcec9 100644 --- a/lib/classes/tts_manager.py +++ b/lib/classes/tts_manager.py @@ -3,6 +3,7 @@ import numpy as np import os import regex as re import shutil +import soundfile as sf import subprocess import tempfile import torch @@ -12,6 +13,7 @@ import uuid from fastapi import FastAPI from huggingface_hub import hf_hub_download +from pathlib import Path from scipy.io import wavfile as wav from scipy.signal import find_peaks from TTS.api import TTS as TtsXTTS @@ -19,7 +21,8 @@ from TTS.tts.configs.xtts_config import XttsConfig from TTS.tts.models.xtts import Xtts from lib.models import * -from lib.conf import models_dir, default_audio_proc_format +from lib.conf import voices_dir, models_dir, default_audio_proc_format +from lib.lang import language_tts torch.backends.cudnn.benchmark = True #torch.serialization.add_safe_globals(["numpy.core.multiarray.scalar"]) @@ -91,7 +94,57 @@ class TTSManager: def _build(self): tts_key = None + self.params['tts'] = None self.params['current_voice_path'] = None + self.params['sample_rate'] = models[self.session['tts_engine']][self.session['fine_tuned']]['samplerate'] + if self.session['language'] in language_tts[XTTSv2].keys(): + if self.session['voice'] is not None and self.session['language'] != 'eng': + voice_key = re.sub(r'_(24000|16000)\.wav$', '', os.path.basename(self.session['voice'])) + if voice_key in default_xtts_settings['voices']: + if not f"/{self.session['language']}/" in self.session['voice']: + msg = f"Converting xttsv2 builtin english voice to {self.session['language']}..." + print(msg) + self.model_path = models[XTTSv2]['internal']['repo'] + tts_key = self.model_path + if tts_key in loaded_tts.keys(): + self.params['tts'] = loaded_tts[self.model_path] + else: + self.params['tts'] = load_coqui_tts_api(self.model_path, self.session['device']) + try: + lang_dir = 'con-' if self.session['language'] == 'con' else self.session['language'] + file_path = self.session['voice'].replace('_24000.wav', '.wav').replace('/eng/', f'/{lang_dir}/').replace('\\eng\\', f'\\{lang_dir}\\') + base_dir = os.path.dirname(file_path) + default_text_file = os.path.join(voices_dir, self.session['language'], 'default.txt') + if os.path.exists(default_text_file): + default_text = Path(default_text_file).read_text(encoding="utf-8") + self.params['tts'].tts_to_file( + text=f"{default_xtts_settings['voices'][voice_key]}, {default_text}", + speaker=default_xtts_settings['voices'][voice_key], + language=self.session['language_iso1'], + file_path=file_path + ) + for samplerate in [16000, 24000]: + output_file = file_path.replace('.wav', f'_{samplerate}.wav') + if self._normalize_audio(file_path, output_file, samplerate): + # for Bark + if samplerate == 24000: + bark_dir = os.path.join(base_dir, 'bark') + npz_dir = os.path.join(bark_dir, voice_key) + os.makedirs(npz_dir, exist_ok=True) + npz_file = os.path.join(npz_dir, f'{voice_key}.npz') + self._wav_to_npz(output_file, npz_file) + else: + break + if os.path.exists(file_path): + os.remove(file_path) + else: + error = f'The translated {default_text_file} could not be found! Voice cloning file will stay in English.' + print(error) + except Exception as e: + error = f'_build() builtin voice conversion error: {file_path}: {e}' + print(error) + if torch.cuda.is_available(): + torch.cuda.empty_cache() if self.session['tts_engine'] == XTTSv2: if self.session['custom_model'] is not None: msg = f"Loading TTS {self.session['tts_engine']} model, it takes a while, please be patient..." @@ -131,7 +184,8 @@ class TTSManager: self.params['tts'] = load_coqui_tts_api(self.model_path, self.session['device']) elif self.session['tts_engine'] == BARK: if self.session['custom_model'] is not None: - print(f"{self.session['tts_engine']} custom model not implemented yet!") + msg = f"{self.session['tts_engine']} custom model not implemented yet!" + print(msg) else: self.model_path = models[self.session['tts_engine']][self.session['fine_tuned']]['repo'] msg = f"Loading TTS {self.model_path} model, it takes a while, please be patient..." @@ -143,29 +197,40 @@ class TTSManager: self.params['tts'] = load_coqui_tts_api(self.model_path, self.session['device']) elif self.session['tts_engine'] == VITS: if self.session['custom_model'] is not None: - print(f"{self.session['tts_engine']} custom model not implemented yet!") + msg = f"{self.session['tts_engine']} custom model not implemented yet!" + print(msg) else: + iso_dir = self.session['language_iso1'] sub_dict = models[self.session['tts_engine']][self.session['fine_tuned']]['sub'] - sub = next((key for key, lang_list in sub_dict.items() if self.session['language_iso1'] in lang_list), None) - self.model_path = models[self.session['tts_engine']][self.session['fine_tuned']]['repo'].replace("[lang_iso1]", self.session['language_iso1']).replace("[xxx]", sub) - tts_key = self.model_path - msg = f"Loading TTS {tts_key} model, it takes a while, please be patient..." - print(msg) - if tts_key in loaded_tts.keys(): - self.params['tts'] = loaded_tts[tts_key] - else: - self.params['tts'] = load_coqui_tts_api(self.model_path, self.session['device']) - if self.session['voice'] is not None: - tts_vc_key = default_vc_model - msg = f"Loading TTS {tts_vc_key} zeroshot model, it takes a while, please be patient..." + sub = next((key for key, lang_list in sub_dict.items() if iso_dir in lang_list), None) + if sub is None: + iso_dir = self.session['language'] + sub = next((key for key, lang_list in sub_dict.items() if iso_dir in lang_list), None) + if sub is not None: + self.model_path = models[self.session['tts_engine']][self.session['fine_tuned']]['repo'].replace("[lang_iso1]", iso_dir).replace("[xxx]", sub) + tts_key = self.model_path + msg = f"Loading TTS {tts_key} model, it takes a while, please be patient..." print(msg) - if tts_vc_key in loaded_tts.keys(): - self.params['tts_vc'] = loaded_tts[tts_vc_key] + if tts_key in loaded_tts.keys(): + self.params['tts'] = loaded_tts[tts_key] else: - self.params['tts_vc'] = load_coqui_tts_vc(self.session['device']) + self.params['tts'] = load_coqui_tts_api(self.model_path, self.session['device']) + if self.session['voice'] is not None: + tts_vc_key = default_vc_model + msg = f"Loading TTS {tts_vc_key} zeroshot model, it takes a while, please be patient..." + print(msg) + if tts_vc_key in loaded_tts.keys(): + self.params['tts_vc'] = loaded_tts[tts_vc_key] + else: + self.params['tts_vc'] = load_coqui_tts_vc(self.session['device']) + else: + msg = f"{self.session['tts_engine']} checkpoint for {self.session['language']} not found!" + print(msg) + elif self.session['tts_engine'] == FAIRSEQ: if self.session['custom_model'] is not None: - print(f"{self.session['tts_engine']} custom model not implemented yet!") + msg = f"{self.session['tts_engine']} custom model not implemented yet!" + print(msg) else: self.model_path = models[self.session['tts_engine']][self.session['fine_tuned']]['repo'].replace("[lang]", self.session['language']) tts_key = self.model_path @@ -185,7 +250,8 @@ class TTSManager: self.params['tts_vc'] = load_coqui_tts_vc(self.session['device']) elif self.session['tts_engine'] == YOURTTS: if self.session['custom_model'] is not None: - print(f"{self.session['tts_engine']} custom model not implemented yet!") + msg = f"{self.session['tts_engine']} custom model not implemented yet!" + print(msg) else: self.model_path = models[self.session['tts_engine']][self.session['fine_tuned']]['repo'] msg = f"Loading TTS {self.model_path} model, it takes a while, please be patient..." @@ -198,6 +264,12 @@ class TTSManager: if self.params['tts'] is not None: loaded_tts[tts_key] = self.params['tts'] + def _wav_to_npz(self, wav_path, npz_path): + audio, sr = sf.read(wav_path) + np.savez(npz_path, audio=audio, sample_rate=24000) + msg = f"Saved NPZ file: {npz_path}" + print(msg) + def _detect_gender(self, voice_path): try: sample_rate, signal = wav.read(voice_path) @@ -223,7 +295,8 @@ class TTSManager: break return None except Exception as e: - print(f"Error processing {voice_path}: {e}") + error = f"_detect_gender() error: {voice_path}: {e}" + print(error) return None def _is_tts_active(self, tts): @@ -248,6 +321,66 @@ class TTSManager: else: raise TypeError(f"Unsupported type for audio_data: {type(audio_data)}") + def _trim_end(self, audio_data, sample_rate, silence_threshold=0.001, buffer_seconds=0.001): + # Ensure audio_data is a PyTorch tensor + if isinstance(audio_data, list): + audio_data = torch.tensor(audio_data) # Convert list to tensor + + if isinstance(audio_data, torch.Tensor): + if audio_data.is_cuda: + audio_data = audio_data.cpu() # Move to CPU if it's on CUDA + + # Detect non-silent indices + non_silent_indices = torch.where(audio_data.abs() > silence_threshold)[0] + + if len(non_silent_indices) == 0: + return torch.tensor([], device=audio_data.device) + + # Determine the trimming index + end_index = non_silent_indices[-1] + int(buffer_seconds * sample_rate) + + # Trim the audio, keeping it as a tensor + trimmed_audio = audio_data[:end_index] + + return trimmed_audio + + # If somehow the input is still incorrect, raise an error + raise TypeError("audio_data must be a PyTorch tensor or a list of numerical values.") + + def _normalize_audio(self, input_file, output_file, samplerate): + filter_complex = ( + 'agate=threshold=-25dB:ratio=1.4:attack=10:release=250,' + 'afftdn=nf=-70,' + 'acompressor=threshold=-20dB:ratio=2:attack=80:release=200:makeup=1dB,' + 'loudnorm=I=-14:TP=-3:LRA=7:linear=true,' + 'equalizer=f=150:t=q:w=2:g=1,' + 'equalizer=f=250:t=q:w=2:g=-3,' + 'equalizer=f=3000:t=q:w=2:g=2,' + 'equalizer=f=5500:t=q:w=2:g=-4,' + 'equalizer=f=9000:t=q:w=2:g=-2,' + 'highpass=f=63[audio]' + ) + ffmpeg_cmd = [shutil.which('ffmpeg'), '-hide_banner', '-nostats', '-i', input_file] + ffmpeg_cmd += [ + '-filter_complex', filter_complex, + '-map', '[audio]', + '-ar', str(samplerate), + '-y', output_file + ] + try: + subprocess.run( + ffmpeg_cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=True, + text=True, + encoding='utf-8' + ) + return True + except subprocess.CalledProcessError as e: + print(f"_normalize_audio() error: {input_file}: {e}") + return False + def convert_sentence_to_audio(self): try: audio_data = None @@ -271,7 +404,6 @@ class TTSManager: else models[self.session['tts_engine']][self.session['fine_tuned']]['voice'] if self.session['fine_tuned'] != 'internal' else models[self.session['tts_engine']]['internal']['voice'] ) - sample_rate = models[self.session['tts_engine']][self.session['fine_tuned']]['samplerate'] if self.session['tts_engine'] == XTTSv2: if self.session['custom_model'] is not None or self.session['fine_tuned'] != 'internal': if self.params['current_voice_path'] != self.params['voice_path']: @@ -288,14 +420,15 @@ class TTSManager: **fine_tuned_params ) audio_data = result.get('wav') - if audio_data is None: + if audio_data is not None: + audio_data = audio_data.tolist() + else: error = f'No audio waveform found in convert_sentence_to_audio() result: {result}' print(error) return False else: - voice_name = re.sub(r'_(24000|16000)\.wav$', '', os.path.basename(os.path.basename(self.params['voice_path']))) - if voice_name in default_xtts_settings['voices'].values(): - speaker_argument = {"speaker": voice_name} + if self.params['voice_path'] in default_xtts_settings['voices'].values(): + speaker_argument = {"speaker": self.params['voice_path']} else: if self.params['current_voice_path'] != self.params['voice_path']: self.params['current_voice_path'] = self.params['voice_path'] @@ -324,38 +457,64 @@ class TTSManager: msg = f"{self.session['tts_engine']} custom model not implemented yet!" print(msg) else: + if self.params['voice_path'] is not None: + if self.params['current_voice_path'] != self.params['voice_path']: + self.params['current_voice_path'] = self.params['voice_path'] + voice_key = re.sub(r'_(24000|16000)\.wav$', '', os.path.basename(self.params['voice_path'])) + bark_dir = os.path.join(os.path.dirname(self.params['voice_path']), 'bark', voice_key) + npz_file = os.path.join(bark_dir, f'{voice_key}.npz') + if not os.path.exists(npz_file): + os.makedirs(bark_dir, exist_ok=True) + self._wav_to_npz(self.params['voice_path'], npz_file) + else: + bark_dir = f"{os.path.dirname(default_bark_settings['voices']['KumarDahl'])}/" + voice_key = re.sub(r'.npz$', '', os.path.basename(default_bark_settings['voices']['KumarDahl'])) + speaker_argument = {} with torch.no_grad(): audio_data = self.params['tts'].tts( text=self.params['sentence'], - #language=self.session['language_iso1'], - #speaker_wav=self.params['voice_path'], - #emotion='neutral' # Available options: "neutral", "angry", "happy", "sad" + **speaker_argument ) elif self.session['tts_engine'] == VITS: if self.session['custom_model'] is not None or self.session['fine_tuned'] != 'internal': msg = f"{self.session['tts_engine']} custom model not implemented yet!" print(msg) else: + speaker_argument = {} + if self.session['language'] == 'eng' and 'vctk/vits' in models[self.session['tts_engine']]['internal']['sub']: + if self.session['language'] in models[self.session['tts_engine']]['internal']['sub']['vctk/vits'] or self.session['language_iso1'] in models[self.session['tts_engine']]['internal']['sub']['vctk/vits']: + speaker_argument = {"speaker": 'p262'} + elif self.session['language'] == 'cat' and 'custom/vits' in models[self.session['tts_engine']]['internal']['sub']: + if self.session['language'] in models[self.session['tts_engine']]['internal']['sub']['custom/vits'] or self.session['language_iso1'] in models[self.session['tts_engine']]['internal']['sub']['custom/vits']: + speaker_argument = {"speaker": '09901'} with torch.no_grad(): if self.params['voice_path'] is not None: proc_dir = os.path.join(self.session['voice_dir'], 'proc') os.makedirs(proc_dir, exist_ok=True) tmp_in_wav = os.path.join(proc_dir, f"{uuid.uuid4()}.wav") tmp_out_wav = os.path.join(proc_dir, f"{uuid.uuid4()}.wav") - self.params['tts'].tts_to_file(text=self.params['sentence'], file_path=tmp_in_wav) + self.params['tts'].tts_to_file( + text=self.params['sentence'], + file_path=tmp_in_wav, + **speaker_argument + ) if self.params['current_voice_path'] != self.params['voice_path']: self.params['current_voice_path'] = self.params['voice_path'] self.params['voice_path_gender'] = self._detect_gender(self.params['voice_path']) self.params['voice_builtin_gender'] = self._detect_gender(tmp_in_wav) - print(f"Cloned voice seems to be {self.params['voice_path_gender']}") - print(f"Builtin voice seems to be {self.params['voice_builtin_gender']}") + msg = f"Cloned voice seems to be {self.params['voice_path_gender']}" + print(msg) + msg = f"Builtin voice seems to be {self.params['voice_builtin_gender']}" + print(msg) if self.params['voice_builtin_gender'] != self.params['voice_path_gender']: self.params['semitones'] = -4 if self.params['voice_path_gender'] == 'male' else 4 + msg = f"Adapting builtin voice frequencies from the clone voice..." + print(msg) if 'semitones' in self.params: try: cmd = [ shutil.which('sox'), tmp_in_wav, - "-r", str(sample_rate), tmp_out_wav, + "-r", str(self.params['sample_rate']), tmp_out_wav, "pitch", str(self.params['semitones'] * 100) ] subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) @@ -373,8 +532,6 @@ class TTSManager: source_wav=tmp_out_wav, target_wav=self.params['voice_path'] ) - # knnc tts.voice_conversion() is in 16000hz - sample_rate = 16000 if os.path.exists(tmp_in_wav): os.remove(tmp_in_wav) if os.path.exists(tmp_out_wav): @@ -382,6 +539,7 @@ class TTSManager: else: audio_data = self.params['tts'].tts( text=self.params['sentence'], + **speaker_argument ) elif self.session['tts_engine'] == FAIRSEQ: if self.session['custom_model'] is not None or self.session['fine_tuned'] != 'internal': @@ -400,15 +558,19 @@ class TTSManager: self.params['current_voice_path'] = self.params['voice_path'] self.params['voice_path_gender'] = self._detect_gender(self.params['voice_path']) self.params['voice_builtin_gender'] = self._detect_gender(tmp_in_wav) - print(f"Cloned voice seems to be {self.params['voice_path_gender']}") - print(f"Builtin voice seems to be {self.params['voice_builtin_gender']}") + msg = f"Cloned voice seems to be {self.params['voice_path_gender']}" + print(msg) + msg = f"Builtin voice seems to be {self.params['voice_builtin_gender']}" + print(msg) if self.params['voice_builtin_gender'] != self.params['voice_path_gender']: self.params['semitones'] = -4 if self.params['voice_path_gender'] == 'male' else 4 + msg = f"Adapting builtin voice frequencies from the clone voice..." + print(msg) if 'semitones' in self.params: try: cmd = [ shutil.which('sox'), tmp_in_wav, - "-r", str(sample_rate), tmp_out_wav, + "-r", str(self.params['sample_rate']), tmp_out_wav, "pitch", str(self.params['semitones'] * 100) ] subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) @@ -432,7 +594,7 @@ class TTSManager: os.remove(tmp_out_wav) else: audio_data = self.params['tts'].tts( - text=self.params['sentence'], + text=self.params['sentence'] ) elif self.session['tts_engine'] == YOURTTS: if self.session['custom_model'] is not None or self.session['fine_tuned'] != 'internal': @@ -453,11 +615,12 @@ class TTSManager: **speaker_argument ) if audio_data is not None: + if self.params['sentence'].endswith('–'): + audio_data = self._trim_end(audio_data, self.params['sample_rate']) sourceTensor = self._tensor_type(audio_data) - #audio_tensor = torch.tensor(audio_data, dtype=torch.float32).unsqueeze(0).cpu() audio_tensor = sourceTensor.clone().detach().unsqueeze(0).cpu() - torchaudio.save(self.params['sentence_audio_file'], audio_tensor, sample_rate, format=default_audio_proc_format) - del audio_data + torchaudio.save(self.params['sentence_audio_file'], audio_tensor, self.params['sample_rate'], format=default_audio_proc_format) + del audio_data, sourceTensor, audio_tensor if self.session['device'] == 'cuda': torch.cuda.empty_cache() if os.path.exists(self.params['sentence_audio_file']): diff --git a/lib/classes/voice_extractor.py b/lib/classes/voice_extractor.py index 3de4c475de0274362da5c6a1ac9d61bc6578e897..29a87a5a0e7a8a0a6cfdbfaedd11521859fb9f92 100644 --- a/lib/classes/voice_extractor.py +++ b/lib/classes/voice_extractor.py @@ -38,7 +38,7 @@ class VoiceExtractor: try: self.wav_file = os.path.join(self.session['voice_dir'], f'{self.voice_name}.wav') ffmpeg_cmd = [ - shutil.which('ffmpeg'), '-i', self.voice_file, + shutil.which('ffmpeg'), '-hide_banner', '-nostats', '-i', self.voice_file, '-ac', '1', '-y', self.wav_file ] @@ -74,7 +74,7 @@ class VoiceExtractor: torch_home = os.path.join(self.models_dir, 'hub') torch.hub.set_dir(torch_home) os.environ['TORCH_HOME'] = torch_home - energy_threshold = 8200 # to tune if not enough accurate (higher = less sensitive) + energy_threshold = 15000 # to tune if not enough accurate (higher = less sensitive) model = vggish() model.eval() # Preprocess audio to log mel spectrogram @@ -129,20 +129,20 @@ class VoiceExtractor: error = f'_demucs_voice() error: {e}' raise ValueError(error) return False, error - + def _remove_silences(self, audio, silence_threshold): final_audio = AudioSegment.silent(duration=0) for chunk in audio[::100]: if chunk.dBFS > silence_threshold: final_audio += chunk final_audio.export(self.voice_track, format='wav') - + def _trim_and_clean(self): try: silence_threshold = -60 audio = AudioSegment.from_file(self.voice_track) total_duration = len(audio) # Total duration in milliseconds - min_required_duration = 15000 if self.session['tts_engine'] == XTTSv2 else 30000 # milliseconds + min_required_duration = 12000 if total_duration <= min_required_duration: msg = f"Audio is only {total_duration/1000:.2f}s long; skipping trimming." self._remove_silences(audio, silence_threshold) @@ -152,7 +152,7 @@ class VoiceExtractor: # Step 1: Compute Amplitude and Frequency Variation amplitude_variations = [] frequency_variations = [] - time_stamps = [] + time_stamps = [] for i in range(0, total_duration - chunk_size, chunk_size): chunk = audio[i:i + chunk_size] if chunk.dBFS > silence_threshold: # Ignore silence @@ -160,7 +160,7 @@ class VoiceExtractor: # FFT to analyze frequency spectrum samples = np.array(chunk.get_array_of_samples()) spectrum = np.abs(scipy.fftpack.fft(samples)) - frequency_variations.append(np.std(spectrum)) # Measure frequency spread + frequency_variations.append(np.std(spectrum)) # Measure frequency spread time_stamps.append(i) # If no significant speech was detected, return an error if not amplitude_variations: @@ -202,7 +202,6 @@ class VoiceExtractor: self._remove_silences(trimmed_audio, silence_threshold) msg = f"Silences removed, best section extracted from {start_adjusted/1000:.2f}s to {end_adjusted/1000:.2f}s" return True, msg - except Exception as e: error = f'_trim_and_clean() error: {e}' raise ValueError(error) @@ -210,7 +209,7 @@ class VoiceExtractor: def _normalize_audio(self): try: process_file = os.path.join(self.session['voice_dir'], f'{self.voice_name}.wav') - ffmpeg_cmd = [shutil.which('ffmpeg'), '-i', self.voice_track] + ffmpeg_cmd = [shutil.which('ffmpeg'), '-hide_banner', '-nostats', '-i', self.voice_track] filter_complex = ( 'agate=threshold=-25dB:ratio=1.4:attack=10:release=250,' 'afftdn=nf=-70,' @@ -256,10 +255,10 @@ class VoiceExtractor: except subprocess.CalledProcessError as e: error = f'_normalize_audio() ffmpeg.Error: {e.stderr.decode()}' break + shutil.rmtree(self.demucs_dir, ignore_errors=True) + if os.path.exists(process_file): + os.remove(process_file) if error is None: - shutil.rmtree(self.demucs_dir, ignore_errors=True) - if os.path.exists(process_file): - os.remove(process_file) msg = 'Audio normalization successful!' return True, msg except FileNotFoundError as e: diff --git a/lib/conf.py b/lib/conf.py index 2a157d95723e2962c07ada57f90c9149e52b1407..5a924e06c51562e7e4381a82e42d83958a4ec60c 100644 --- a/lib/conf.py +++ b/lib/conf.py @@ -8,8 +8,8 @@ voices_dir = os.path.abspath('voices') tmp_dir = os.path.abspath('tmp') tmp_expire = 7 # days -os.environ["PYTHONUTF8"] = '1' -os.environ["PYTHONIOENCODING"] = 'utf-8' +os.environ['PYTHONUTF8'] = '1' +os.environ['PYTHONIOENCODING'] = 'utf-8' os.environ['COQUI_TOS_AGREED'] = '1' os.environ['PYTHONIOENCODING'] = 'utf-8' os.environ['CALIBRE_TEMP_DIR'] = tmp_dir @@ -28,9 +28,9 @@ os.environ['XDG_CACHE_HOME'] = models_dir os.environ["SUNO_OFFLOAD_CPU"] = 'False' # BARK option: False needs A GPU os.environ["SUNO_USE_SMALL_MODELS"] = 'False' # BARK option: False needs a GPU with VRAM > 4GB if platform.system() == 'Windows': - os.environ["ESPEAK_DATA_PATH"] = os.path.expandvars(r"%USERPROFILE%\scoop\apps\espeak-ng\current\eSpeak NG\espeak-ng-data") + os.environ['ESPEAK_DATA_PATH'] = os.path.expandvars(r"%USERPROFILE%\scoop\apps\espeak-ng\current\eSpeak NG\espeak-ng-data") -prog_version = (lambda: open("VERSION.txt").read().strip())() +prog_version = (lambda: open('VERSION.txt').read().strip())() min_python_version = (3,11) max_python_version = (3,12) @@ -62,7 +62,7 @@ audiobooks_host_dir = os.path.abspath(os.path.join('audiobooks','gui','host')) audiobooks_cli_dir = os.path.abspath(os.path.join('audiobooks','cli')) ebook_formats = ['.epub', '.mobi', '.azw3', '.fb2', '.lrf', '.rb', '.snb', '.tcr', '.pdf', '.txt', '.rtf', '.doc', '.docx', '.html', '.odt', '.azw'] -voice_formats = ['.mp4', '.m4b', '.mp3', '.wav', '.aac', '.flac', '.alac', '.ogg', '.aiff', '.aif', '.wma', '.dsd', '.opus', '.pcmu', '.pcma', '.gsm'] # Add or remove the format you wish +voice_formats = ['.mp4', '.m4b', '.m4a', '.mp3', '.wav', '.aac', '.flac', '.alac', '.ogg', '.aiff', '.aif', '.wma', '.dsd', '.opus', '.pcmu', '.pcma', '.gsm'] # Add or remove the format you wish output_formats = ['m4b', 'm4a', 'mp4', 'webm', 'mov', 'mp3', 'flac', 'wav', 'ogg', 'aac'] default_audio_proc_format = 'flac' # or 'wav', 'mp3', 'aac', 'm4a', 'm4b', 'amr', '3gp', 'alac' default_output_format = 'm4b' # or 'wav', 'pcm', 'ieee', 'ogg', 'nist', 'mp3', 'aiff', 'aac', 'wma', 'mp4', 'm4a', 'flac', 'amr', '3gp', 'webm', 'alac' \ No newline at end of file diff --git a/lib/functions.py b/lib/functions.py index cebaf58cbdf6b0f7a850f9a79d0453b5b9057ddc..1681b9de223a9360b2a71f06437947d83371829a 100644 --- a/lib/functions.py +++ b/lib/functions.py @@ -33,6 +33,7 @@ import urllib.request import uuid import zipfile import traceback +import unicodedata import lib.conf as conf import lib.lang as lang @@ -365,13 +366,17 @@ def math2word(text, lang, lang_iso1, tts_engine): return False def rep_num(match): - number = match.group().replace(",", "") # Remove commas for proper conversion + number = match.group().strip().replace(",", "") try: if "." in number or "e" in number or "E" in number: - return num2words(float(number), lang=lang_iso1) - return num2words(int(number), lang=lang_iso1) - except ValueError: - return number # If conversion fails, return original number + number_value = float(number) + else: + number_value = int(number) + number_in_words = num2words(number_value, lang=lang_iso1) + return f" {number_in_words}" + except Exception as e: + print(f"Error converting number: {number}, Error: {e}") + return f"{number}" def replace_ambiguous(match): symbol2 = match.group(2) @@ -401,9 +406,8 @@ def math2word(text, lang, lang_iso1, tts_engine): if ambiguous_replacements: text = re.sub(ambiguous_pattern, replace_ambiguous, text) # Regex pattern for detecting numbers (handles negatives, commas, decimals, scientific notation) - #number_pattern = r'(?<!\S)(-?\d{1,3}(?:,\d{3})*(?:\.\d+)?(?:[eE][-+]?\d+)?)(?!\S)' - number_pattern = r'(?<!\S)(-?\d{1,3}(?:,\d{3})*(?:\.\d+(?!\s|$))?(?:[eE][-+]?\d+)?)(?!\S)' - if tts_engine != XTTSv2: + number_pattern = r'\s*(-?\d{1,3}(?:,\d{3})*(?:\.\d+(?!\s|$))?(?:[eE][-+]?\d+)?)\s*' + if tts_engine == VITS or tts_engine == FAIRSEQ or tts_engine == YOURTTS: if is_num2words_compat: # Pattern 2: Split big numbers into groups of 4 text = re.sub(r'(\d{4})(?=\d{4}(?!\.\d))', r'\1 ', text) @@ -437,8 +441,13 @@ def normalize_text(text, lang, lang_iso1, tts_engine): text = re.sub(r'\t+', lambda m: ' ' * len(m.group()), text) # replace roman numbers by digits text = replace_roman_numbers(text) - # Pattern 1: Add a space between UTF-8 characters and numbers - text = re.sub(r'(?<=[\p{L}])(?=\d)|(?<=\d)(?=[\p{L}])', ' ', text) + # Escape special characters in the punctuation list for regex + pattern = '|'.join(map(re.escape, punctuation_split)) + # Reduce multiple consecutive punctuations + text = re.sub(rf'(\s*({pattern})\s*)+', r'\2 ', text).strip() + if tts_engine == XTTSv2: + # Pattern 1: Add a space between UTF-8 characters and numbers + text = re.sub(r'(?<=[\p{L}])(?=\d)|(?<=\d)(?=[\p{L}])', ' ', text) # Replace math symbols with words text = math2word(text, lang, lang_iso1, tts_engine) return text @@ -454,7 +463,11 @@ def convert_to_epub(session): print(error) return False file_input = session['ebook'] - file_ext = os.path.splitext(session['ebook'])[1].lower() + file_ext = os.path.splitext(file_input)[1].lower() + if file_ext not in ebook_formats: + error = f'Unsupported file format: {file_ext}' + print(error) + return False if file_ext == '.pdf': msg = 'File input is a PDF. flatten it in MD format...' print(msg) @@ -485,7 +498,6 @@ def convert_to_epub(session): ) print(result.stdout) return True - except subprocess.CalledProcessError as e: print(f"Subprocess error: {e.stderr}") DependencyError(e) @@ -495,6 +507,46 @@ def convert_to_epub(session): DependencyError(e) return False +def filter_chapter(doc, lang, lang_iso1, tts_engine): + soup = BeautifulSoup(doc.get_body_content(), 'html.parser') + # Remove scripts and styles + for script in soup(["script", "style"]): + script.decompose() + # Normalize lines and remove unnecessary spaces and switch special chars + text = normalize_text(soup.get_text().strip(), lang, lang_iso1, tts_engine) + if tts_engine == XTTSv2: + # Ensure spaces before & after punctuation + pattern_space = re.escape(''.join(punctuation_list)) + # Ensure space before and after punctuation (excluding `,` and `.`) + punctuation_pattern_space = r'\s*([{}])\s*'.format(pattern_space.replace(',', '').replace('.', '')) + text = re.sub(punctuation_pattern_space, r' \1 ', text) + # Ensure spaces before & after `,` and `.` ONLY when NOT between numbers + comma_dot_pattern = r'(?<!\d)\s*(\.{3}|[,.])\s*(?!\d)' + text = re.sub(comma_dot_pattern, r' \1 ', text) + if not text.strip(): + chapter_sentences = [] + else: + chapter_sentences = get_sentences(text, lang) + return chapter_sentences + +def filter_doc(doc_patterns): + pattern_counter = Counter(doc_patterns) + # Returns a list with one tuple: [(pattern, count)] + most_common = pattern_counter.most_common(1) + return most_common[0][0] if most_common else None + +def filter_pattern(doc_identifier): + docs = doc_identifier.split(':') + if len(docs) > 2: + segment = docs[1] + if re.search(r'[a-zA-Z]', segment) and re.search(r'\d', segment): + return ''.join([char for char in segment if char.isalpha()]) + elif re.match(r'^[a-zA-Z]+$', segment): + return segment + elif re.match(r'^\d+$', segment): + return 'numbers' + return None + def get_cover(epubBook, session): try: if session['cancellation_requested']: @@ -538,7 +590,15 @@ def get_chapters(epubBook, session): return [], [] all_docs = all_docs[1:] # Exclude the first document if needed doc_cache = {} - msg = '******* NOTE: YOU CAN SAFELY IGNORE "Character xx not found in the vocabulary." *******' + msg = r''' + *************************************************************************************** + NOTE: THE WARNING + "Character xx not found in the vocabulary." + MEANS THE MODEL CANNOT INTERPRET THE CHARACTER AND WILL MAYBE GENERATE AN HALLUCINATION + TO IMPROVE THIS MODEL IT NEEDS TO ADD THIS CHARACTER INTO A NEW TRAINING MODEL. + YOU CAN IMPROVE IT OR ASK TO A MODEL TRAINING DEVELOPER. + *************************************************************************************** + ''' print(msg) for doc in all_docs: doc_cache[doc] = filter_chapter(doc, session['language'], session['language_iso1'], session['tts_engine']) @@ -563,90 +623,88 @@ def get_chapters(epubBook, session): DependencyError(error) return None, None -def filter_chapter(doc, lang, lang_iso1, tts_engine): - soup = BeautifulSoup(doc.get_body_content(), 'html.parser') - # Remove scripts and styles - for script in soup(["script", "style"]): - script.decompose() - # Normalize lines and remove unnecessary spaces and switch special chars - text = normalize_text(soup.get_text().strip(), lang, lang_iso1, tts_engine) - # Rule 1: Ensure spaces before & after punctuation - pattern_space = re.escape(''.join(punctuation_list)) - # Step 1: Ensure space before and after punctuation (excluding `,` and `.`) - punctuation_pattern_space = r'\s*([{}])\s*'.format(pattern_space.replace(',', '').replace('.', '')) - text = re.sub(punctuation_pattern_space, r' \1 ', text) - # Rule 2: Ensure spaces before & after `,` and `.` ONLY when NOT between numbers - comma_dot_pattern = r'(?<!\d)\s*(\.{3}|[,.])\s*(?!\d)' - # Step 2: Ensure space before and after `,` and `.` only when NOT between numbers - text = re.sub(comma_dot_pattern, r' \1 ', text) - # Create regex pattern from punctuation list to split the phoneme_list - pattern_split = f"[^{re.escape(''.join(punctuation_split))}]+[{re.escape(''.join(punctuation_split))}]?|[{re.escape(''.join(punctuation_split))}]" - if not text.strip(): - phoneme_list = [] - else: - tmp_list = re.findall(pattern_split, text) - phoneme_list = [item.strip() for item in tmp_list if item and item.strip() and item != ' '] - # get the final sentence array according to the max_tokens limitation +def get_sentences(text, lang): max_tokens = language_mapping[lang]['max_tokens'] - chapter_sentences = get_sentences(phoneme_list, max_tokens) - return chapter_sentences - -def filter_doc(doc_patterns): - pattern_counter = Counter(doc_patterns) - # Returns a list with one tuple: [(pattern, count)] - most_common = pattern_counter.most_common(1) - return most_common[0][0] if most_common else None - -def filter_pattern(doc_identifier): - docs = doc_identifier.split(':') - if len(docs) > 2: - segment = docs[1] - if re.search(r'[a-zA-Z]', segment) and re.search(r'\d', segment): - return ''.join([char for char in segment if char.isalpha()]) - elif re.match(r'^[a-zA-Z]+$', segment): - return segment - elif re.match(r'^\d+$', segment): - return 'numbers' - return None - -def get_sentences(phoneme_list, max_tokens): - sentences = [] - current_sentence = "" - current_phoneme_count = 0 - for phoneme in phoneme_list: - part_phoneme_count = len(phoneme.split()) - # Always append to current sentence unless punctuation is hit - if current_phoneme_count + part_phoneme_count > max_tokens: - # Ensure we finalize the sentence at punctuation, not a space - if any(current_sentence.endswith(punc) for punc in punctuation_split): - sentences.append(current_sentence.strip()) - current_sentence = phoneme - current_phoneme_count = part_phoneme_count + max_chars = max_tokens * 10 + pattern_split = [re.escape(p) for p in punctuation_split] + pattern = f"({'|'.join(pattern_split)})" + + def segment_ideogramms(): + if lang == 'zho': + import jieba + return list(jieba.cut(text)) + elif lang == 'jpn': + import MeCab + mecab = MeCab.Tagger() + return mecab.parse(text).split() + elif lang == 'kor': + from konlpy.tag import Kkma + kkma = Kkma() + return kkma.morphs(text) + elif lang in ['tha', 'lao', 'mya', 'khm']: + from pythainlp.tokenize import word_tokenize + return word_tokenize(text, engine='newmm') + + def split_sentence(sentence): + end = '' + if len(sentence) < max_chars: + if sentence[-1].isalpha(): + end = '–' + return [sentence + end] + if ',' in sentence: + mid_index = len(sentence) // 2 + left_split = sentence.rfind(",", 0, mid_index) + right_split = sentence.find(",", mid_index) + if left_split != -1 and (right_split == -1 or mid_index - left_split < right_split - mid_index): + split_index = left_split + 1 else: - # Look back and split at last punctuation instead of splitting randomly - last_punc_index = max( - (current_sentence.rfind(punc) for punc in punctuation_split if punc in current_sentence), - default=-1 - ) - if last_punc_index > -1: - sentences.append(current_sentence[:last_punc_index+1].strip()) # Keep punctuation - current_sentence = current_sentence[last_punc_index+1:].strip() + " " + phoneme - current_phoneme_count = len(current_sentence.split()) - else: - sentences.append(current_sentence.strip()) - current_sentence = phoneme - current_phoneme_count = part_phoneme_count + split_index = right_split + 1 if right_split != -1 else mid_index + elif ';' in sentence: + mid_index = len(sentence) // 2 + left_split = sentence.rfind(";", 0, mid_index) + right_split = sentence.find(";", mid_index) + if left_split != -1 and (right_split == -1 or mid_index - left_split < right_split - mid_index): + split_index = left_split + 1 + else: + split_index = right_split + 1 if right_split != -1 else mid_index + elif ':' in sentence: + mid_index = len(sentence) // 2 + left_split = sentence.rfind(":", 0, mid_index) + right_split = sentence.find(":", mid_index) + if left_split != -1 and (right_split == -1 or mid_index - left_split < right_split - mid_index): + split_index = left_split + 1 + else: + split_index = right_split + 1 if right_split != -1 else mid_index + elif ' ' in sentence: + mid_index = len(sentence) // 2 + left_split = sentence.rfind(" ", 0, mid_index) + right_split = sentence.find(" ", mid_index) + if left_split != -1 and (right_split == -1 or mid_index - left_split < right_split - mid_index): + split_index = left_split + else: + split_index = right_split if right_split != -1 else mid_index + end = '–' else: - current_sentence += (" " if current_sentence else "") + phoneme - current_phoneme_count += part_phoneme_count - if current_sentence: - sentences.append(current_sentence.strip()) + split_index = len(sentence) // 2 + end = '–' + part1 = sentence[:split_index] + part2 = sentence[split_index + 1:] if sentence[split_index] in [' ', ',', ';', ':'] else sentence[split_index:] + return split_sentence(part1.strip()) + split_sentence(part2.strip()) + + if lang in ['zho', 'jpn', 'kor', 'tha', 'lao', 'mya', 'khm']: + raw_list = segment_ideogramms() + else: + raw_list = re.split(pattern, text) + if len(raw_list) > 1: + tmp_list = [raw_list[i] + raw_list[i + 1] for i in range(0, len(raw_list) - 1, 2)] + else: + tmp_list = raw_list + sentences = [] + for sentence in tmp_list: + sentences.extend(split_sentence(sentence.strip())) + #print(json.dumps(sentences, indent=4, ensure_ascii=False)) return sentences -import platform -import subprocess -import os - def get_vram(): os_name = platform.system() # NVIDIA (Cross-Platform: Windows, Linux, macOS) @@ -782,7 +840,7 @@ def convert_chapters_to_audio(session): print(msg) tts_manager.params['sentence_audio_file'] = os.path.join(session['chapters_dir_sentences'], f'{sentence_number}.{default_audio_proc_format}') if session['tts_engine'] == XTTSv2 or session['tts_engine'] == FAIRSEQ: - tts_manager.params['sentence'] = sentence.replace('.', '<pause>').replace(',', '<pause>') + tts_manager.params['sentence'] = sentence.replace('.', '…') else: tts_manager.params['sentence'] = sentence if tts_manager.params['sentence'] != "": @@ -838,7 +896,7 @@ def combine_audio_sentences(chapter_audio_file, start, end, session): file = file.replace("\\", "/") f.write(f'file {file}\n') ffmpeg_cmd = [ - shutil.which('ffmpeg'), '-y', '-safe', '0', '-f', 'concat', '-i', file_list, + shutil.which('ffmpeg'), '-hide_banner', '-nostats', '-y', '-safe', '0', '-f', 'concat', '-i', file_list, '-c:a', default_audio_proc_format, '-map_metadata', '-1', chapter_audio_file ] try: @@ -882,7 +940,7 @@ def combine_audio_chapters(session): file = file.replace("\\", "/") f.write(f"file '{file}'\n") ffmpeg_cmd = [ - shutil.which('ffmpeg'), '-y', '-safe', '0', '-f', 'concat', '-i', file_list, + shutil.which('ffmpeg'), '-hide_banner', '-nostats', '-y', '-safe', '0', '-f', 'concat', '-i', file_list, '-c:a', default_audio_proc_format, '-map_metadata', '-1', combined_chapters_file ] try: @@ -976,7 +1034,7 @@ def combine_audio_chapters(session): ffmpeg_final_file = final_file if session['cover'] is not None: ffmpeg_cover = session['cover'] - ffmpeg_cmd = [shutil.which('ffmpeg'), '-i', ffmpeg_combined_audio, '-i', ffmpeg_metadata_file] + ffmpeg_cmd = [shutil.which('ffmpeg'), '-hide_banner', '-nostats', '-i', ffmpeg_combined_audio, '-i', ffmpeg_metadata_file] if session['output_format'] == 'wav': ffmpeg_cmd += ['-map', '0:a'] elif session['output_format'] == 'aac': @@ -1152,7 +1210,7 @@ def compare_file_metadata(f1, f2): def get_compatible_tts_engines(language): compatible_engines = [ tts for tts in models.keys() - if language in language_tts.get(tts, {}) + if language in language_tts.get(tts, {}) and tts != BARK ] return compatible_engines @@ -1348,6 +1406,7 @@ def convert_ebook(args): dir_name for dir_name in os.listdir(session['process_dir']) if fnmatch.fnmatch(dir_name, "chapters_*") and os.path.isdir(os.path.join(session['process_dir'], dir_name)) ] + shutil.rmtree(os.path.join(session['voice_dir'], 'proc'), ignore_errors=True) if is_gui_process: if len(chapters_dirs) > 1: if os.path.exists(session['chapters_dir']): @@ -2102,14 +2161,24 @@ def web_interface(args): nonlocal voice_options session = context.get_session(id) voice_lang_dir = session['language'] if session['language'] != 'con' else 'con-' # Bypass Windows CON reserved name + voice_lang_eng_dir = 'eng' voice_file_pattern = "*_24000.wav" - voice_options = [ + voice_builtin_options = [ (os.path.splitext(re.sub(r'_24000\.wav$', '', f.name))[0], str(f)) - for f in Path(session['voice_dir']).rglob(voice_file_pattern) + for f in Path(os.path.join(voices_dir, voice_lang_dir)).rglob(voice_file_pattern) ] + if session['language'] in language_tts[XTTSv2]: + voice_eng_options = [ + (os.path.splitext(re.sub(r'_24000\.wav$', '', f.name))[0], str(f)) + for f in Path(os.path.join(voices_dir, voice_lang_eng_dir)).rglob(voice_file_pattern) + ] + else: + voice_eng_options = [] + voice_keys = {key for key, _ in voice_builtin_options} + voice_options = voice_builtin_options + [row for row in voice_eng_options if row[0] not in voice_keys] voice_options += [ (os.path.splitext(re.sub(r'_24000\.wav$', '', f.name))[0], str(f)) - for f in Path(os.path.join(voices_dir, voice_lang_dir)).rglob(voice_file_pattern) + for f in Path(session['voice_dir']).rglob(voice_file_pattern) ] voice_options = [('None', None)] + sorted(voice_options, key=lambda x: x[0].lower()) session['voice'] = session['voice'] if session['voice'] in [option[1] for option in voice_options] else voice_options[0][1] diff --git a/lib/lang.py b/lib/lang.py index 676631b22974be64bdfe8d5fdd2b06ac4afefceb..cb38251f9e22c6166d515f697361356c0020f9bd 100644 --- a/lib/lang.py +++ b/lib/lang.py @@ -19,8 +19,8 @@ default_language_code = 'eng' # ISO-639-3 language_tts = { "xtts": {"eng": "en", "spa": "es", "fra": "fr", "deu": "de", "ita": "it", "por": "pt", "pol": "pl", "tur": "tr", "rus": "ru", "nld": "nl", "ces": "cs", "ara": "ar", "zho": "zh-cn", "jpn": "ja", "hun": "hu", "kor": "ko", "hin": "hi"}, "bark": {"eng": "en", "deu": "de", "spa": "es", "fra": "fr", "hin": "hi", "ita": "it", "jpn": "ja", "kor": "ko", "pol": "pl", "por": "pt", "rus": "ru", "tur": "tr", "zho": "zh-cn"}, - "vits": {"bul": "bg", "ces": "cs", "dan": "da", "deu": "de", "eng": "en", "est": "et", "gle": "ga", "spa": "es", "fra": "fr", "nld": "nl", "hun": "hu", "ell": "el", "fin": "fi", "hrv": "hr", "lit": "lt", "lav": "lv", "mlt": "mt", "por": "pt", "rom": "ro", "slk": "sk", "sln": "sl", "swe": "sv"}, - "fairseq": {"ara": "ar", "ben": "bn", "eng": "en", "fas": "fa", "fra": "fr", "deu": "de", "hin": "hi", "hun": "hu", "ind": "id", "ita": "it", "jav": "jv", "jpn": "ja", "kor": "ko", "pol": "pl", "por": "pt", "rus": "ru", "spa": "es", "tam": "ta", "tel": "te", "tur": "tr", "yor": "yo", "zzzz": "zzzz", "abi": "abi", "ace": "ace", "aca": "aca", "acn": "acn", "acr": "acr", "ach": "ach", "acu": "acu", "guq": "guq", "ade": "ade", "adj": "adj", "agd": "agd", "agx": "agx", "agn": "agn", "aha": "aha", "aka": "ak", "knj": "knj", "ake": "ake", "aeu": "aeu", "ahk": "ahk", "bss": "bss", "alj": "alj", "sqi": "sq", "alt": "alt", "alp": "alp", "alz": "alz", "kab": "kab", "amk": "amk", "mmg": "mmg", "amh": "am", "ami": "ami", "azg": "azg", "agg": "agg", "boj": "boj", "cko": "cko", "any": "any", "arl": "arl", "atq": "atq", "luc": "luc", "hyw": "hyw", "apr": "apr", "aia": "aia", "msy": "msy", "cni": "cni", "cjo": "cjo", "cpu": "cpu", "cpb": "cpb", "asm": "as", "asa": "asa", "teo": "teo", "ati": "ati", "djk": "djk", "ava": "av", "avn": "avn", "avu": "avu", "awb": "awb", "kwi": "kwi", "awa": "awa", "agr": "agr", "agu": "agu", "ayr": "ayr", "ayo": "ayo", "abp": "abp", "blx": "blx", "sgb": "sgb", "azj-script_cyrillic": "azj-script_cyrillic", "azj-script_latin": "azj-script_latin", "azb": "azb", "bba": "bba", "bhz": "bhz", "bvc": "bvc", "bfy": "bfy", "bgq": "bgq", "bdq": "bdq", "bdh": "bdh", "bqi": "bqi", "bjw": "bjw", "blz": "blz", "ban": "ban", "bcc-script_latin": "bcc-script_latin", "bcc-script_arabic": "bcc-script_arabic", "bam": "bm", "ptu": "ptu", "bcw": "bcw", "bqj": "bqj", "bno": "bno", "bbb": "bbb", "bfa": "bfa", "bjz": "bjz", "bak": "ba", "eus": "eu", "bsq": "bsq", "akb": "akb", "btd": "btd", "btx": "btx", "bts": "bts", "bbc": "bbc", "bvz": "bvz", "bjv": "bjv", "bep": "bep", "bkv": "bkv", "bzj": "bzj", "bem": "bem", "bng": "bng", "bom": "bom", "btt": "btt", "bha": "bha", "bgw": "bgw", "bht": "bht", "beh": "beh", "sne": "sne", "ubl": "ubl", "bcl": "bcl", "bim": "bim", "bkd": "bkd", "bjr": "bjr", "bfo": "bfo", "biv": "biv", "bib": "bib", "bis": "bi", "bzi": "bzi", "bqp": "bqp", "bpr": "bpr", "bps": "bps", "bwq": "bwq", "bdv": "bdv", "bqc": "bqc", "bus": "bus", "bnp": "bnp", "bmq": "bmq", "bdg": "bdg", "boa": "boa", "ksr": "ksr", "bor": "bor", "bru": "bru", "box": "box", "bzh": "bzh", "bgt": "bgt", "sab": "sab", "bul": "bg", "bwu": "bwu", "bmv": "bmv", "mya": "my", "tte": "tte", "cjp": "cjp", "cbv": "cbv", "kaq": "kaq", "cot": "cot", "cbc": "cbc", "car": "car", "cat": "ca", "ceb": "ceb", "cme": "cme", "cbi": "cbi", "ceg": "ceg", "cly": "cly", "cya": "cya", "che": "ce", "hne": "hne", "nya": "ny", "dig": "dig", "dug": "dug", "bgr": "bgr", "cek": "cek", "cfm": "cfm", "cnh": "cnh", "hlt": "hlt", "mwq": "mwq", "ctd": "ctd", "tcz": "tcz", "zyp": "zyp", "cco": "cco", "cnl": "cnl", "cle": "cle", "chz": "chz", "cpa": "cpa", "cso": "cso", "cnt": "cnt", "cuc": "cuc", "hak": "hak", "nan": "nan", "xnj": "xnj", "cap": "cap", "cax": "cax", "ctg": "ctg", "ctu": "ctu", "chf": "chf", "cce": "cce", "crt": "crt", "crq": "crq", "cac-dialect_sansebasti\u00e1ncoat\u00e1n": "cac-dialect_sansebasti\u00e1ncoat\u00e1n", "cac-dialect_sanmateoixtat\u00e1n": "cac-dialect_sanmateoixtat\u00e1n", "ckt": "ckt", "ncu": "ncu", "cdj": "cdj", "chv": "cv", "caa": "caa", "asg": "asg", "con": "con", "crn": "crn", "cok": "cok", "crk-script_latin": "crk-script_latin", "crk-script_syllabics": "crk-script_syllabics", "crh": "crh", "cui": "cui", "ces": "cs", "dsh": "dsh", "dbq": "dbq", "dga": "dga", "dgi": "dgi", "dgk": "dgk", "dnj-dialect_gweetaawueast": "dnj-dialect_gweetaawueast", "dnj-dialect_blowowest": "dnj-dialect_blowowest", "daa": "daa", "dnt": "dnt", "dnw": "dnw", "dar": "dar", "tcc": "tcc", "dwr": "dwr", "ded": "ded", "mzw": "mzw", "ntr": "ntr", "ddn": "ddn", "des": "des", "dso": "dso", "nfa": "nfa", "dhi": "dhi", "gud": "gud", "did": "did", "mhu": "mhu", "dip": "dip", "dik": "dik", "tbz": "tbz", "dts": "dts", "dos": "dos", "dgo": "dgo", "mvp": "mvp", "jen": "jen", "dzo": "dz", "idd": "idd", "eka": "eka", "cto": "cto", "emp": "emp", "enx": "enx", "sja": "sja", "myv": "myv", "mcq": "mcq", "ese": "ese", "evn": "evn", "eza": "eza", "ewe": "ee", "fal": "fal", "fao": "fo", "far": "far", "fij": "fj", "fin": "fi", "fon": "fon", "frd": "frd", "ful": "ff", "flr": "flr", "gau": "gau", "gbk": "gbk", "gag-script_cyrillic": "gag-script_cyrillic", "gag-script_latin": "gag-script_latin", "gbi": "gbi", "gmv": "gmv", "lug": "lg", "pwg": "pwg", "gbm": "gbm", "cab": "cab", "grt": "grt", "krs": "krs", "gso": "gso", "nlg": "nlg", "gej": "gej", "gri": "gri", "kik": "ki", "acd": "acd", "glk": "glk", "gof-script_latin": "gof-script_latin", "gog": "gog", "gkn": "gkn", "wsg": "wsg", "gjn": "gjn", "gqr": "gqr", "gor": "gor", "gux": "gux", "gbo": "gbo", "ell": "el", "grc": "grc", "guh": "guh", "gub": "gub", "grn": "gn", "gyr": "gyr", "guo": "guo", "gde": "gde", "guj": "gu", "gvl": "gvl", "guk": "guk", "rub": "rub", "dah": "dah", "gwr": "gwr", "gwi": "gwi", "hat": "ht", "hlb": "hlb", "amf": "amf", "hag": "hag", "hnn": "hnn", "bgc": "bgc", "had": "had", "hau": "ha", "hwc": "hwc", "hvn": "hvn", "hay": "hay", "xed": "xed", "heb": "he", "heh": "heh", "hil": "hil", "hif": "hif", "hns": "hns", "hoc": "hoc", "hoy": "hoy", "hus-dialect_westernpotosino": "hus-dialect_westernpotosino", "hus-dialect_centralveracruz": "hus-dialect_centralveracruz", "huv": "huv", "hui": "hui", "hap": "hap", "iba": "iba", "isl": "is", "dbj": "dbj", "ifa": "ifa", "ifb": "ifb", "ifu": "ifu", "ifk": "ifk", "ife": "ife", "ign": "ign", "ikk": "ikk", "iqw": "iqw", "ilb": "ilb", "ilo": "ilo", "imo": "imo", "inb": "inb", "ipi": "ipi", "irk": "irk", "icr": "icr", "itv": "itv", "itl": "itl", "atg": "atg", "ixl-dialect_sanjuancotzal": "ixl-dialect_sanjuancotzal", "ixl-dialect_sangasparchajul": "ixl-dialect_sangasparchajul", "ixl-dialect_santamarianebaj": "ixl-dialect_santamarianebaj", "nca": "nca", "izr": "izr", "izz": "izz", "jac": "jac", "jam": "jam", "jvn": "jvn", "kac": "kac", "dyo": "dyo", "csk": "csk", "adh": "adh", "jun": "jun", "jbu": "jbu", "dyu": "dyu", "bex": "bex", "juy": "juy", "gna": "gna", "urb": "urb", "kbp": "kbp", "cwa": "cwa", "dtp": "dtp", "kbr": "kbr", "cgc": "cgc", "kki": "kki", "kzf": "kzf", "lew": "lew", "cbr": "cbr", "kkj": "kkj", "keo": "keo", "kqe": "kqe", "kak": "kak", "kyb": "kyb", "knb": "knb", "kmd": "kmd", "kml": "kml", "ify": "ify", "xal": "xal", "kbq": "kbq", "kay": "kay", "ktb": "ktb", "hig": "hig", "gam": "gam", "cbu": "cbu", "xnr": "xnr", "kmu": "kmu", "kne": "kne", "kan": "kn", "kby": "kby", "pam": "pam", "cak-dialect_santamar\u00edadejes\u00fas": "cak-dialect_santamar\u00edadejes\u00fas", "cak-dialect_southcentral": "cak-dialect_southcentral", "cak-dialect_yepocapa": "cak-dialect_yepocapa", "cak-dialect_western": "cak-dialect_western", "cak-dialect_santodomingoxenacoj": "cak-dialect_santodomingoxenacoj", "cak-dialect_central": "cak-dialect_central", "xrb": "xrb", "krc": "krc", "kaa": "kaa", "krl": "krl", "pww": "pww", "xsm": "xsm", "cbs": "cbs", "pss": "pss", "kxf": "kxf", "kyz": "kyz", "kyu": "kyu", "txu": "txu", "kaz": "kk", "ndp": "ndp", "kbo": "kbo", "kyq": "kyq", "ken": "ken", "ker": "ker", "xte": "xte", "kyg": "kyg", "kjh": "kjh", "kca": "kca", "khm": "km", "kxm": "kxm", "kjg": "kjg", "nyf": "nyf", "kij": "kij", "kia": "kia", "kqr": "kqr", "kqp": "kqp", "krj": "krj", "zga": "zga", "kin": "rw", "pkb": "pkb", "geb": "geb", "gil": "gil", "kje": "kje", "kss": "kss", "thk": "thk", "klu": "klu", "kyo": "kyo", "kog": "kog", "kfb": "kfb", "kpv": "kpv", "bbo": "bbo", "xon": "xon", "kma": "kma", "kno": "kno", "kxc": "kxc", "ozm": "ozm", "kqy": "kqy", "coe": "coe", "kpq": "kpq", "kpy": "kpy", "kyf": "kyf", "kff-script_telugu": "kff-script_telugu", "kri": "kri", "rop": "rop", "ktj": "ktj", "ted": "ted", "krr": "krr", "kdt": "kdt", "kez": "kez", "cul": "cul", "kle": "kle", "kdi": "kdi", "kue": "kue", "kum": "kum", "kvn": "kvn", "cuk": "cuk", "kdn": "kdn", "xuo": "xuo", "key": "key", "kpz": "kpz", "knk": "knk", "kmr-script_latin": "kmr-script_latin", "kmr-script_arabic": "kmr-script_arabic", "kmr-script_cyrillic": "kmr-script_cyrillic", "xua": "xua", "kru": "kru", "kus": "kus", "kub": "kub", "kdc": "kdc", "kxv": "kxv", "blh": "blh", "cwt": "cwt", "kwd": "kwd", "tnk": "tnk", "kwf": "kwf", "cwe": "cwe", "kyc": "kyc", "tye": "tye", "kir": "ky", "quc-dialect_north": "quc-dialect_north", "quc-dialect_east": "quc-dialect_east", "quc-dialect_central": "quc-dialect_central", "lac": "lac", "lsi": "lsi", "lbj": "lbj", "lhu": "lhu", "las": "las", "lam": "lam", "lns": "lns", "ljp": "ljp", "laj": "laj", "lao": "lo", "lat": "la", "lav": "lv", "law": "law", "lcp": "lcp", "lzz": "lzz", "lln": "lln", "lef": "lef", "acf": "acf", "lww": "lww", "mhx": "mhx", "eip": "eip", "lia": "lia", "lif": "lif", "onb": "onb", "lis": "lis", "loq": "loq", "lob": "lob", "yaz": "yaz", "lok": "lok", "llg": "llg", "ycl": "ycl", "lom": "lom", "ngl": "ngl", "lon": "lon", "lex": "lex", "lgg": "lgg", "ruf": "ruf", "dop": "dop", "lnd": "lnd", "ndy": "ndy", "lwo": "lwo", "lee": "lee", "mev": "mev", "mfz": "mfz", "jmc": "jmc", "myy": "myy", "mbc": "mbc", "mda": "mda", "mad": "mad", "mag": "mag", "ayz": "ayz", "mai": "mai", "mca": "mca", "mcp": "mcp", "mak": "mak", "vmw": "vmw", "mgh": "mgh", "kde": "kde", "mlg": "mg", "zlm": "zlm", "pse": "pse", "mkn": "mkn", "xmm": "xmm", "mal": "ml", "xdy": "xdy", "div": "dv", "mdy": "mdy", "mup": "mup", "mam-dialect_central": "mam-dialect_central", "mam-dialect_northern": "mam-dialect_northern", "mam-dialect_southern": "mam-dialect_southern", "mam-dialect_western": "mam-dialect_western", "mqj": "mqj", "mcu": "mcu", "mzk": "mzk", "maw": "maw", "mjl": "mjl", "mnk": "mnk", "mge": "mge", "mbh": "mbh", "knf": "knf", "mjv": "mjv", "mbt": "mbt", "obo": "obo", "mbb": "mbb", "mzj": "mzj", "sjm": "sjm", "mrw": "mrw", "mar": "mr", "mpg": "mpg", "mhr": "mhr", "enb": "enb", "mah": "mh", "myx": "myx", "klv": "klv", "mfh": "mfh", "met": "met", "mcb": "mcb", "mop": "mop", "yua": "yua", "mfy": "mfy", "maz": "maz", "vmy": "vmy", "maq": "maq", "mzi": "mzi", "maj": "maj", "maa-dialect_sanantonio": "maa-dialect_sanantonio", "maa-dialect_sanjer\u00f3nimo": "maa-dialect_sanjer\u00f3nimo", "mhy": "mhy", "mhi": "mhi", "zmz": "zmz", "myb": "myb", "gai": "gai", "mqb": "mqb", "mbu": "mbu", "med": "med", "men": "men", "mee": "mee", "mwv": "mwv", "meq": "meq", "zim": "zim", "mgo": "mgo", "mej": "mej", "mpp": "mpp", "min": "min", "gum": "gum", "mpx": "mpx", "mco": "mco", "mxq": "mxq", "pxm": "pxm", "mto": "mto", "mim": "mim", "xta": "xta", "mbz": "mbz", "mip": "mip", "mib": "mib", "miy": "miy", "mih": "mih", "miz": "miz", "xtd": "xtd", "mxt": "mxt", "xtm": "xtm", "mxv": "mxv", "xtn": "xtn", "mie": "mie", "mil": "mil", "mio": "mio", "mdv": "mdv", "mza": "mza", "mit": "mit", "mxb": "mxb", "mpm": "mpm", "soy": "soy", "cmo-script_latin": "cmo-script_latin", "cmo-script_khmer": "cmo-script_khmer", "mfq": "mfq", "old": "old", "mfk": "mfk", "mif": "mif", "mkl": "mkl", "mox": "mox", "myl": "myl", "mqf": "mqf", "mnw": "mnw", "mon": "mn", "mog": "mog", "mfe": "mfe", "mor": "mor", "mqn": "mqn", "mgd": "mgd", "mtj": "mtj", "cmr": "cmr", "mtd": "mtd", "bmr": "bmr", "moz": "moz", "mzm": "mzm", "mnb": "mnb", "mnf": "mnf", "unr": "unr", "fmu": "fmu", "mur": "mur", "tih": "tih", "muv": "muv", "muy": "muy", "sur": "sur", "moa": "moa", "wmw": "wmw", "tnr": "tnr", "miq": "miq", "mos": "mos", "muh": "muh", "nas": "nas", "mbj": "mbj", "nfr": "nfr", "kfw": "kfw", "nst": "nst", "nag": "nag", "nch": "nch", "nhe": "nhe", "ngu": "ngu", "azz": "azz", "nhx": "nhx", "ncl": "ncl", "nhy": "nhy", "ncj": "ncj", "nsu": "nsu", "npl": "npl", "nuz": "nuz", "nhw": "nhw", "nhi": "nhi", "nlc": "nlc", "nab": "nab", "gld": "gld", "nnb": "nnb", "npy": "npy", "pbb": "pbb", "ntm": "ntm", "nmz": "nmz", "naw": "naw", "nxq": "nxq", "ndj": "ndj", "ndz": "ndz", "ndv": "ndv", "new": "new", "nij": "nij", "sba": "sba", "gng": "gng", "nga": "nga", "nnq": "nnq", "ngp": "ngp", "gym": "gym", "kdj": "kdj", "nia": "nia", "nim": "nim", "nin": "nin", "nko": "nko", "nog": "nog", "lem": "lem", "not": "not", "nhu": "nhu", "nob": "nb", "bud": "bud", "nus": "nus", "yas": "yas", "nnw": "nnw", "nwb": "nwb", "nyy": "nyy", "nyn": "nyn", "rim": "rim", "lid": "lid", "nuj": "nuj", "nyo": "nyo", "nzi": "nzi", "ann": "ann", "ory": "ory", "ojb-script_latin": "ojb-script_latin", "ojb-script_syllabics": "ojb-script_syllabics", "oku": "oku", "bsc": "bsc", "bdu": "bdu", "orm": "om", "ury": "ury", "oss": "os", "ote": "ote", "otq": "otq", "stn": "stn", "sig": "sig", "kfx": "kfx", "bfz": "bfz", "sey": "sey", "pao": "pao", "pau": "pau", "pce": "pce", "plw": "plw", "pmf": "pmf", "pag": "pag", "pap": "pap", "prf": "prf", "pab": "pab", "pbi": "pbi", "pbc": "pbc", "pad": "pad", "ata": "ata", "pez": "pez", "peg": "peg", "pcm": "pcm", "pis": "pis", "pny": "pny", "pir": "pir", "pjt": "pjt", "poy": "poy", "pps": "pps", "pls": "pls", "poi": "poi", "poh-dialect_eastern": "poh-dialect_eastern", "poh-dialect_western": "poh-dialect_western", "prt": "prt", "pui": "pui", "pan": "pa", "tsz": "tsz", "suv": "suv", "lme": "lme", "quy": "quy", "qvc": "qvc", "quz": "quz", "qve": "qve", "qub": "qub", "qvh": "qvh", "qwh": "qwh", "qvw": "qvw", "quf": "quf", "qvm": "qvm", "qul": "qul", "qvn": "qvn", "qxn": "qxn", "qxh": "qxh", "qvs": "qvs", "quh": "quh", "qxo": "qxo", "qxr": "qxr", "qvo": "qvo", "qvz": "qvz", "qxl": "qxl", "quw": "quw", "kjb": "kjb", "kek": "kek", "rah": "rah", "rjs": "rjs", "rai": "rai", "lje": "lje", "rnl": "rnl", "rkt": "rkt", "rap": "rap", "yea": "yea", "raw": "raw", "rej": "rej", "rel": "rel", "ril": "ril", "iri": "iri", "rgu": "rgu", "rhg": "rhg", "rmc-script_latin": "rmc-script_latin", "rmc-script_cyrillic": "rmc-script_cyrillic", "rmo": "rmo", "rmy-script_latin": "rmy-script_latin", "rmy-script_cyrillic": "rmy-script_cyrillic", "ron": "ro", "rol": "rol", "cla": "cla", "rng": "rng", "rug": "rug", "run": "rn", "lsm": "lsm", "spy": "spy", "sck": "sck", "saj": "saj", "sch": "sch", "sml": "sml", "xsb": "xsb", "sbl": "sbl", "saq": "saq", "sbd": "sbd", "smo": "sm", "rav": "rav", "sxn": "sxn", "sag": "sg", "sbp": "sbp", "xsu": "xsu", "srm": "srm", "sas": "sas", "apb": "apb", "sgw": "sgw", "tvw": "tvw", "lip": "lip", "slu": "slu", "snw": "snw", "sea": "sea", "sza": "sza", "seh": "seh", "crs": "crs", "ksb": "ksb", "shn": "shn", "sho": "sho", "mcd": "mcd", "cbt": "cbt", "xsr": "xsr", "shk": "shk", "shp": "shp", "sna": "sn", "cjs": "cjs", "jiv": "jiv", "snp": "snp", "sya": "sya", "sid": "sid", "snn": "snn", "sri": "sri", "srx": "srx", "sil": "sil", "sld": "sld", "akp": "akp", "xog": "xog", "som": "so", "bmu": "bmu", "khq": "khq", "ses": "ses", "mnx": "mnx", "srn": "srn", "sxb": "sxb", "suc": "suc", "tgo": "tgo", "suk": "suk", "sun": "su", "suz": "suz", "sgj": "sgj", "sus": "sus", "swh": "swh", "swe": "sv", "syl": "syl", "dyi": "dyi", "myk": "myk", "spp": "spp", "tap": "tap", "tby": "tby", "tna": "tna", "shi": "shi", "klw": "klw", "tgl": "tl", "tbk": "tbk", "tgj": "tgj", "blt": "blt", "tbg": "tbg", "omw": "omw", "tgk": "tg", "tdj": "tdj", "tbc": "tbc", "tlj": "tlj", "tly": "tly", "ttq-script_tifinagh": "ttq-script_tifinagh", "taj": "taj", "taq": "taq", "tpm": "tpm", "tgp": "tgp", "tnn": "tnn", "tac": "tac", "rif-script_latin": "rif-script_latin", "rif-script_arabic": "rif-script_arabic", "tat": "tt", "tav": "tav", "twb": "twb", "tbl": "tbl", "kps": "kps", "twe": "twe", "ttc": "ttc", "kdh": "kdh", "tes": "tes", "tex": "tex", "tee": "tee", "tpp": "tpp", "tpt": "tpt", "stp": "stp", "tfr": "tfr", "twu": "twu", "ter": "ter", "tew": "tew", "tha": "th", "nod": "nod", "thl": "thl", "tem": "tem", "adx": "adx", "bod": "bo", "khg": "khg", "tca": "tca", "tir": "ti", "txq": "txq", "tik": "tik", "dgr": "dgr", "tob": "tob", "tmf": "tmf", "tng": "tng", "tlb": "tlb", "ood": "ood", "tpi": "tpi", "jic": "jic", "lbw": "lbw", "txa": "txa", "tom": "tom", "toh": "toh", "tnt": "tnt", "sda": "sda", "tcs": "tcs", "toc": "toc", "tos": "tos", "neb": "neb", "trn": "trn", "trs": "trs", "trc": "trc", "tri": "tri", "cof": "cof", "tkr": "tkr", "kdl": "kdl", "cas": "cas", "tso": "ts", "tuo": "tuo", "iou": "iou", "tmc": "tmc", "tuf": "tuf", "tuk-script_latin": "tk", "tuk-script_arabic": "tk", "bov": "bov", "tue": "tue", "kcg": "kcg", "tzh-dialect_bachaj\u00f3n": "tzh-dialect_bachaj\u00f3n", "tzh-dialect_tenejapa": "tzh-dialect_tenejapa", "tzo-dialect_chenalh\u00f3": "tzo-dialect_chenalh\u00f3", "tzo-dialect_chamula": "tzo-dialect_chamula", "tzj-dialect_western": "tzj-dialect_western", "tzj-dialect_eastern": "tzj-dialect_eastern", "aoz": "aoz", "udm": "udm", "udu": "udu", "ukr": "uk", "ppk": "ppk", "ubu": "ubu", "urk": "urk", "ura": "ura", "urt": "urt", "urd-script_devanagari": "ur", "urd-script_arabic": "ur", "urd-script_latin": "ur", "upv": "upv", "usp": "usp", "uig-script_arabic": "ug", "uig-script_cyrillic": "ug", "uzb-script_cyrillic": "uz", "vag": "vag", "bav": "bav", "vid": "vid", "vie": "vi", "vif": "vif", "vun": "vun", "vut": "vut", "prk": "prk", "wwa": "wwa", "rro": "rro", "bao": "bao", "waw": "waw", "lgl": "lgl", "wlx": "wlx", "cou": "cou", "hub": "hub", "gvc": "gvc", "mfi": "mfi", "wap": "wap", "wba": "wba", "war": "war", "way": "way", "guc": "guc", "cym": "cy", "kvw": "kvw", "tnp": "tnp", "hto": "hto", "huu": "huu", "wal-script_latin": "wal-script_latin", "wal-script_ethiopic": "wal-script_ethiopic", "wlo": "wlo", "noa": "noa", "wob": "wob", "kao": "kao", "xer": "xer", "yad": "yad", "yka": "yka", "sah": "sah", "yba": "yba", "yli": "yli", "nlk": "nlk", "yal": "yal", "yam": "yam", "yat": "yat", "jmd": "jmd", "tao": "tao", "yaa": "yaa", "ame": "ame", "guu": "guu", "yao": "yao", "yre": "yre", "yva": "yva", "ybb": "ybb", "pib": "pib", "byr": "byr", "pil": "pil", "ycn": "ycn", "ess": "ess", "yuz": "yuz", "atb": "atb", "zne": "zne", "zaq": "zaq", "zpo": "zpo", "zad": "zad", "zpc": "zpc", "zca": "zca", "zpg": "zpg", "zai": "zai", "zpl": "zpl", "zam": "zam", "zaw": "zaw", "zpm": "zpm", "zac": "zac", "zao": "zao", "ztq": "ztq", "zar": "zar", "zpt": "zpt", "zpi": "zpi", "zas": "zas", "zaa": "zaa", "zpz": "zpz", "zab": "zab", "zpu": "zpu", "zae": "zae", "zty": "zty", "zav": "zav", "zza": "zza", "zyb": "zyb", "ziw": "ziw", "zos": "zos", "gnd": "gnd"}, + "vits": {"bul": "bg", "ben": "bn", "cat": "ca", "ces": "cs", "dan": "da", "deu": "de", "eng": "en", "est": "et", "ewe": "ewe", "fas": "fa", "hau": "hau", "gle": "ga", "spa": "es", "fra": "fr", "lin": "lin", "nld": "nl", "hun": "hu", "ell": "el", "fin": "fi", "hrv": "hr", "lit": "lt", "lav": "lv", "mlt": "mt", "pol": "pl", "por": "pt", "rom": "ro", "slk": "sk", "sln": "sl", "swe": "sv", "ukr": "uk", "yor": "yor", "tw_akuapem": "tw_akuapem", "tw_asante": "tw_asante"}, + "fairseq": {"ara": "ar", "ben": "bn", "eng": "en", "fas": "fa", "fra": "fr", "deu": "de", "hin": "hi", "hun": "hu", "ind": "id", "ita": "it", "jav": "jv", "jpn": "ja", "kor": "ko", "pol": "pl", "por": "pt", "rus": "ru", "spa": "es", "tam": "ta", "tel": "te", "tur": "tr", "yor": "yo", "abi": "abi", "ace": "ace", "aca": "aca", "acn": "acn", "acr": "acr", "ach": "ach", "acu": "acu", "guq": "guq", "ade": "ade", "adj": "adj", "agd": "agd", "agx": "agx", "agn": "agn", "aha": "aha", "aka": "ak", "knj": "knj", "ake": "ake", "aeu": "aeu", "ahk": "ahk", "bss": "bss", "alj": "alj", "sqi": "sq", "alt": "alt", "alp": "alp", "alz": "alz", "kab": "kab", "amk": "amk", "mmg": "mmg", "amh": "am", "ami": "ami", "azg": "azg", "agg": "agg", "boj": "boj", "cko": "cko", "any": "any", "arl": "arl", "atq": "atq", "luc": "luc", "hyw": "hyw", "apr": "apr", "aia": "aia", "msy": "msy", "cni": "cni", "cjo": "cjo", "cpu": "cpu", "cpb": "cpb", "asm": "as", "asa": "asa", "teo": "teo", "ati": "ati", "djk": "djk", "ava": "av", "avn": "avn", "avu": "avu", "awb": "awb", "kwi": "kwi", "awa": "awa", "agr": "agr", "agu": "agu", "ayr": "ayr", "ayo": "ayo", "abp": "abp", "blx": "blx", "sgb": "sgb", "azj-script_cyrillic": "azj-script_cyrillic", "azj-script_latin": "azj-script_latin", "azb": "azb", "bba": "bba", "bhz": "bhz", "bvc": "bvc", "bfy": "bfy", "bgq": "bgq", "bdq": "bdq", "bdh": "bdh", "bqi": "bqi", "bjw": "bjw", "blz": "blz", "ban": "ban", "bcc-script_latin": "bcc-script_latin", "bcc-script_arabic": "bcc-script_arabic", "bam": "bm", "ptu": "ptu", "bcw": "bcw", "bqj": "bqj", "bno": "bno", "bbb": "bbb", "bfa": "bfa", "bjz": "bjz", "bak": "ba", "eus": "eu", "bsq": "bsq", "akb": "akb", "btd": "btd", "btx": "btx", "bts": "bts", "bbc": "bbc", "bvz": "bvz", "bjv": "bjv", "bep": "bep", "bkv": "bkv", "bzj": "bzj", "bem": "bem", "bng": "bng", "bom": "bom", "btt": "btt", "bha": "bha", "bgw": "bgw", "bht": "bht", "beh": "beh", "sne": "sne", "ubl": "ubl", "bcl": "bcl", "bim": "bim", "bkd": "bkd", "bjr": "bjr", "bfo": "bfo", "biv": "biv", "bib": "bib", "bis": "bi", "bzi": "bzi", "bqp": "bqp", "bpr": "bpr", "bps": "bps", "bwq": "bwq", "bdv": "bdv", "bqc": "bqc", "bus": "bus", "bnp": "bnp", "bmq": "bmq", "bdg": "bdg", "boa": "boa", "ksr": "ksr", "bor": "bor", "bru": "bru", "box": "box", "bzh": "bzh", "bgt": "bgt", "sab": "sab", "bul": "bg", "bwu": "bwu", "bmv": "bmv", "mya": "my", "tte": "tte", "cjp": "cjp", "cbv": "cbv", "kaq": "kaq", "cot": "cot", "cbc": "cbc", "car": "car", "cat": "ca", "ceb": "ceb", "cme": "cme", "cbi": "cbi", "ceg": "ceg", "cly": "cly", "cya": "cya", "che": "ce", "hne": "hne", "nya": "ny", "dig": "dig", "dug": "dug", "bgr": "bgr", "cek": "cek", "cfm": "cfm", "cnh": "cnh", "hlt": "hlt", "mwq": "mwq", "ctd": "ctd", "tcz": "tcz", "zyp": "zyp", "cco": "cco", "cnl": "cnl", "cle": "cle", "chz": "chz", "cpa": "cpa", "cso": "cso", "cnt": "cnt", "cuc": "cuc", "hak": "hak", "nan": "nan", "xnj": "xnj", "cap": "cap", "cax": "cax", "ctg": "ctg", "ctu": "ctu", "chf": "chf", "cce": "cce", "crt": "crt", "crq": "crq", "cac-dialect_sansebasti\u00e1ncoat\u00e1n": "cac-dialect_sansebasti\u00e1ncoat\u00e1n", "cac-dialect_sanmateoixtat\u00e1n": "cac-dialect_sanmateoixtat\u00e1n", "ckt": "ckt", "ncu": "ncu", "cdj": "cdj", "chv": "cv", "caa": "caa", "asg": "asg", "con": "con", "crn": "crn", "cok": "cok", "crk-script_latin": "crk-script_latin", "crk-script_syllabics": "crk-script_syllabics", "crh": "crh", "cui": "cui", "ces": "cs", "dsh": "dsh", "dbq": "dbq", "dga": "dga", "dgi": "dgi", "dgk": "dgk", "dnj-dialect_gweetaawueast": "dnj-dialect_gweetaawueast", "dnj-dialect_blowowest": "dnj-dialect_blowowest", "daa": "daa", "dnt": "dnt", "dnw": "dnw", "dar": "dar", "tcc": "tcc", "dwr": "dwr", "ded": "ded", "mzw": "mzw", "ntr": "ntr", "ddn": "ddn", "des": "des", "dso": "dso", "nfa": "nfa", "dhi": "dhi", "gud": "gud", "did": "did", "mhu": "mhu", "dip": "dip", "dik": "dik", "tbz": "tbz", "dts": "dts", "dos": "dos", "dgo": "dgo", "mvp": "mvp", "jen": "jen", "dzo": "dz", "idd": "idd", "eka": "eka", "cto": "cto", "emp": "emp", "enx": "enx", "sja": "sja", "myv": "myv", "mcq": "mcq", "ese": "ese", "evn": "evn", "eza": "eza", "ewe": "ee", "fal": "fal", "fao": "fo", "far": "far", "fij": "fj", "fin": "fi", "fon": "fon", "frd": "frd", "ful": "ff", "flr": "flr", "gau": "gau", "gbk": "gbk", "gag-script_cyrillic": "gag-script_cyrillic", "gag-script_latin": "gag-script_latin", "gbi": "gbi", "gmv": "gmv", "lug": "lg", "pwg": "pwg", "gbm": "gbm", "cab": "cab", "grt": "grt", "krs": "krs", "gso": "gso", "nlg": "nlg", "gej": "gej", "gri": "gri", "kik": "ki", "acd": "acd", "glk": "glk", "gof-script_latin": "gof-script_latin", "gog": "gog", "gkn": "gkn", "wsg": "wsg", "gjn": "gjn", "gqr": "gqr", "gor": "gor", "gux": "gux", "gbo": "gbo", "ell": "el", "grc": "grc", "guh": "guh", "gub": "gub", "grn": "gn", "gyr": "gyr", "guo": "guo", "gde": "gde", "guj": "gu", "gvl": "gvl", "guk": "guk", "rub": "rub", "dah": "dah", "gwr": "gwr", "gwi": "gwi", "hat": "ht", "hlb": "hlb", "amf": "amf", "hag": "hag", "hnn": "hnn", "bgc": "bgc", "had": "had", "hau": "ha", "hwc": "hwc", "hvn": "hvn", "hay": "hay", "xed": "xed", "heb": "he", "heh": "heh", "hil": "hil", "hif": "hif", "hns": "hns", "hoc": "hoc", "hoy": "hoy", "hus-dialect_westernpotosino": "hus-dialect_westernpotosino", "hus-dialect_centralveracruz": "hus-dialect_centralveracruz", "huv": "huv", "hui": "hui", "hap": "hap", "iba": "iba", "isl": "is", "dbj": "dbj", "ifa": "ifa", "ifb": "ifb", "ifu": "ifu", "ifk": "ifk", "ife": "ife", "ign": "ign", "ikk": "ikk", "iqw": "iqw", "ilb": "ilb", "ilo": "ilo", "imo": "imo", "inb": "inb", "ipi": "ipi", "irk": "irk", "icr": "icr", "itv": "itv", "itl": "itl", "atg": "atg", "ixl-dialect_sanjuancotzal": "ixl-dialect_sanjuancotzal", "ixl-dialect_sangasparchajul": "ixl-dialect_sangasparchajul", "ixl-dialect_santamarianebaj": "ixl-dialect_santamarianebaj", "nca": "nca", "izr": "izr", "izz": "izz", "jac": "jac", "jam": "jam", "jvn": "jvn", "kac": "kac", "dyo": "dyo", "csk": "csk", "adh": "adh", "jun": "jun", "jbu": "jbu", "dyu": "dyu", "bex": "bex", "juy": "juy", "gna": "gna", "urb": "urb", "kbp": "kbp", "cwa": "cwa", "dtp": "dtp", "kbr": "kbr", "cgc": "cgc", "kki": "kki", "kzf": "kzf", "lew": "lew", "cbr": "cbr", "kkj": "kkj", "keo": "keo", "kqe": "kqe", "kak": "kak", "kyb": "kyb", "knb": "knb", "kmd": "kmd", "kml": "kml", "ify": "ify", "xal": "xal", "kbq": "kbq", "kay": "kay", "ktb": "ktb", "hig": "hig", "gam": "gam", "cbu": "cbu", "xnr": "xnr", "kmu": "kmu", "kne": "kne", "kan": "kn", "kby": "kby", "pam": "pam", "cak-dialect_santamar\u00edadejes\u00fas": "cak-dialect_santamar\u00edadejes\u00fas", "cak-dialect_southcentral": "cak-dialect_southcentral", "cak-dialect_yepocapa": "cak-dialect_yepocapa", "cak-dialect_western": "cak-dialect_western", "cak-dialect_santodomingoxenacoj": "cak-dialect_santodomingoxenacoj", "cak-dialect_central": "cak-dialect_central", "xrb": "xrb", "krc": "krc", "kaa": "kaa", "krl": "krl", "pww": "pww", "xsm": "xsm", "cbs": "cbs", "pss": "pss", "kxf": "kxf", "kyz": "kyz", "kyu": "kyu", "txu": "txu", "kaz": "kk", "ndp": "ndp", "kbo": "kbo", "kyq": "kyq", "ken": "ken", "ker": "ker", "xte": "xte", "kyg": "kyg", "kjh": "kjh", "kca": "kca", "khm": "km", "kxm": "kxm", "kjg": "kjg", "nyf": "nyf", "kij": "kij", "kia": "kia", "kqr": "kqr", "kqp": "kqp", "krj": "krj", "zga": "zga", "kin": "rw", "pkb": "pkb", "geb": "geb", "gil": "gil", "kje": "kje", "kss": "kss", "thk": "thk", "klu": "klu", "kyo": "kyo", "kog": "kog", "kfb": "kfb", "kpv": "kpv", "bbo": "bbo", "xon": "xon", "kma": "kma", "kno": "kno", "kxc": "kxc", "ozm": "ozm", "kqy": "kqy", "coe": "coe", "kpq": "kpq", "kpy": "kpy", "kyf": "kyf", "kff-script_telugu": "kff-script_telugu", "kri": "kri", "rop": "rop", "ktj": "ktj", "ted": "ted", "krr": "krr", "kdt": "kdt", "kez": "kez", "cul": "cul", "kle": "kle", "kdi": "kdi", "kue": "kue", "kum": "kum", "kvn": "kvn", "cuk": "cuk", "kdn": "kdn", "xuo": "xuo", "key": "key", "kpz": "kpz", "knk": "knk", "kmr-script_latin": "kmr-script_latin", "kmr-script_arabic": "kmr-script_arabic", "kmr-script_cyrillic": "kmr-script_cyrillic", "xua": "xua", "kru": "kru", "kus": "kus", "kub": "kub", "kdc": "kdc", "kxv": "kxv", "blh": "blh", "cwt": "cwt", "kwd": "kwd", "tnk": "tnk", "kwf": "kwf", "cwe": "cwe", "kyc": "kyc", "tye": "tye", "kir": "ky", "quc-dialect_north": "quc-dialect_north", "quc-dialect_east": "quc-dialect_east", "quc-dialect_central": "quc-dialect_central", "lac": "lac", "lsi": "lsi", "lbj": "lbj", "lhu": "lhu", "las": "las", "lam": "lam", "lns": "lns", "ljp": "ljp", "laj": "laj", "lao": "lo", "lat": "la", "lav": "lv", "law": "law", "lcp": "lcp", "lzz": "lzz", "lln": "lln", "lef": "lef", "acf": "acf", "lww": "lww", "mhx": "mhx", "eip": "eip", "lia": "lia", "lif": "lif", "onb": "onb", "lis": "lis", "loq": "loq", "lob": "lob", "yaz": "yaz", "lok": "lok", "llg": "llg", "ycl": "ycl", "lom": "lom", "ngl": "ngl", "lon": "lon", "lex": "lex", "lgg": "lgg", "ruf": "ruf", "dop": "dop", "lnd": "lnd", "ndy": "ndy", "lwo": "lwo", "lee": "lee", "mev": "mev", "mfz": "mfz", "jmc": "jmc", "myy": "myy", "mbc": "mbc", "mda": "mda", "mad": "mad", "mag": "mag", "ayz": "ayz", "mai": "mai", "mca": "mca", "mcp": "mcp", "mak": "mak", "vmw": "vmw", "mgh": "mgh", "kde": "kde", "mlg": "mg", "zlm": "zlm", "pse": "pse", "mkn": "mkn", "xmm": "xmm", "mal": "ml", "xdy": "xdy", "div": "dv", "mdy": "mdy", "mup": "mup", "mam-dialect_central": "mam-dialect_central", "mam-dialect_northern": "mam-dialect_northern", "mam-dialect_southern": "mam-dialect_southern", "mam-dialect_western": "mam-dialect_western", "mqj": "mqj", "mcu": "mcu", "mzk": "mzk", "maw": "maw", "mjl": "mjl", "mnk": "mnk", "mge": "mge", "mbh": "mbh", "knf": "knf", "mjv": "mjv", "mbt": "mbt", "obo": "obo", "mbb": "mbb", "mzj": "mzj", "nld": "nld", "sjm": "sjm", "mrw": "mrw", "mar": "mr", "mpg": "mpg", "mhr": "mhr", "enb": "enb", "mah": "mh", "myx": "myx", "klv": "klv", "mfh": "mfh", "met": "met", "mcb": "mcb", "mop": "mop", "yua": "yua", "mfy": "mfy", "maz": "maz", "vmy": "vmy", "maq": "maq", "mzi": "mzi", "maj": "maj", "maa-dialect_sanantonio": "maa-dialect_sanantonio", "maa-dialect_sanjer\u00f3nimo": "maa-dialect_sanjer\u00f3nimo", "mhy": "mhy", "mhi": "mhi", "zmz": "zmz", "myb": "myb", "gai": "gai", "mqb": "mqb", "mbu": "mbu", "med": "med", "men": "men", "mee": "mee", "mwv": "mwv", "meq": "meq", "zim": "zim", "mgo": "mgo", "mej": "mej", "mpp": "mpp", "min": "min", "gum": "gum", "mpx": "mpx", "mco": "mco", "mxq": "mxq", "pxm": "pxm", "mto": "mto", "mim": "mim", "xta": "xta", "mbz": "mbz", "mip": "mip", "mib": "mib", "miy": "miy", "mih": "mih", "miz": "miz", "xtd": "xtd", "mxt": "mxt", "xtm": "xtm", "mxv": "mxv", "xtn": "xtn", "mie": "mie", "mil": "mil", "mio": "mio", "mdv": "mdv", "mza": "mza", "mit": "mit", "mxb": "mxb", "mpm": "mpm", "soy": "soy", "cmo-script_latin": "cmo-script_latin", "cmo-script_khmer": "cmo-script_khmer", "mfq": "mfq", "old": "old", "mfk": "mfk", "mif": "mif", "mkl": "mkl", "mox": "mox", "myl": "myl", "mqf": "mqf", "mnw": "mnw", "mon": "mn", "mog": "mog", "mfe": "mfe", "mor": "mor", "mqn": "mqn", "mgd": "mgd", "mtj": "mtj", "cmr": "cmr", "mtd": "mtd", "bmr": "bmr", "moz": "moz", "mzm": "mzm", "mnb": "mnb", "mnf": "mnf", "unr": "unr", "fmu": "fmu", "mur": "mur", "tih": "tih", "muv": "muv", "muy": "muy", "sur": "sur", "moa": "moa", "wmw": "wmw", "tnr": "tnr", "miq": "miq", "mos": "mos", "muh": "muh", "nas": "nas", "mbj": "mbj", "nfr": "nfr", "kfw": "kfw", "nst": "nst", "nag": "nag", "nch": "nch", "nhe": "nhe", "ngu": "ngu", "azz": "azz", "nhx": "nhx", "ncl": "ncl", "nhy": "nhy", "ncj": "ncj", "nsu": "nsu", "npl": "npl", "nuz": "nuz", "nhw": "nhw", "nhi": "nhi", "nlc": "nlc", "nab": "nab", "gld": "gld", "nnb": "nnb", "npy": "npy", "pbb": "pbb", "ntm": "ntm", "nmz": "nmz", "naw": "naw", "nxq": "nxq", "ndj": "ndj", "ndz": "ndz", "ndv": "ndv", "new": "new", "nij": "nij", "sba": "sba", "gng": "gng", "nga": "nga", "nnq": "nnq", "ngp": "ngp", "gym": "gym", "kdj": "kdj", "nia": "nia", "nim": "nim", "nin": "nin", "nko": "nko", "nog": "nog", "lem": "lem", "not": "not", "nhu": "nhu", "nob": "nb", "bud": "bud", "nus": "nus", "yas": "yas", "nnw": "nnw", "nwb": "nwb", "nyy": "nyy", "nyn": "nyn", "rim": "rim", "lid": "lid", "nuj": "nuj", "nyo": "nyo", "nzi": "nzi", "ann": "ann", "ory": "ory", "ojb-script_latin": "ojb-script_latin", "ojb-script_syllabics": "ojb-script_syllabics", "oku": "oku", "bsc": "bsc", "bdu": "bdu", "orm": "om", "ury": "ury", "oss": "os", "ote": "ote", "otq": "otq", "stn": "stn", "sig": "sig", "kfx": "kfx", "bfz": "bfz", "sey": "sey", "pao": "pao", "pau": "pau", "pce": "pce", "plw": "plw", "pmf": "pmf", "pag": "pag", "pap": "pap", "prf": "prf", "pab": "pab", "pbi": "pbi", "pbc": "pbc", "pad": "pad", "ata": "ata", "pez": "pez", "peg": "peg", "pcm": "pcm", "pis": "pis", "pny": "pny", "pir": "pir", "pjt": "pjt", "poy": "poy", "pps": "pps", "pls": "pls", "poi": "poi", "poh-dialect_eastern": "poh-dialect_eastern", "poh-dialect_western": "poh-dialect_western", "prt": "prt", "pui": "pui", "pan": "pa", "tsz": "tsz", "suv": "suv", "lme": "lme", "quy": "quy", "qvc": "qvc", "quz": "quz", "qve": "qve", "qub": "qub", "qvh": "qvh", "qwh": "qwh", "qvw": "qvw", "quf": "quf", "qvm": "qvm", "qul": "qul", "qvn": "qvn", "qxn": "qxn", "qxh": "qxh", "qvs": "qvs", "quh": "quh", "qxo": "qxo", "qxr": "qxr", "qvo": "qvo", "qvz": "qvz", "qxl": "qxl", "quw": "quw", "kjb": "kjb", "kek": "kek", "rah": "rah", "rjs": "rjs", "rai": "rai", "lje": "lje", "rnl": "rnl", "rkt": "rkt", "rap": "rap", "yea": "yea", "raw": "raw", "rej": "rej", "rel": "rel", "ril": "ril", "iri": "iri", "rgu": "rgu", "rhg": "rhg", "rmc-script_latin": "rmc-script_latin", "rmc-script_cyrillic": "rmc-script_cyrillic", "rmo": "rmo", "rmy-script_latin": "rmy-script_latin", "rmy-script_cyrillic": "rmy-script_cyrillic", "ron": "ro", "rol": "rol", "cla": "cla", "rng": "rng", "rug": "rug", "run": "rn", "lsm": "lsm", "spy": "spy", "sck": "sck", "saj": "saj", "sch": "sch", "sml": "sml", "xsb": "xsb", "sbl": "sbl", "saq": "saq", "sbd": "sbd", "smo": "sm", "rav": "rav", "sxn": "sxn", "sag": "sg", "sbp": "sbp", "xsu": "xsu", "srm": "srm", "sas": "sas", "apb": "apb", "sgw": "sgw", "tvw": "tvw", "lip": "lip", "slu": "slu", "snw": "snw", "sea": "sea", "sza": "sza", "seh": "seh", "crs": "crs", "ksb": "ksb", "shn": "shn", "sho": "sho", "mcd": "mcd", "cbt": "cbt", "xsr": "xsr", "shk": "shk", "shp": "shp", "sna": "sn", "cjs": "cjs", "jiv": "jiv", "snp": "snp", "sya": "sya", "sid": "sid", "snn": "snn", "sri": "sri", "srx": "srx", "sil": "sil", "sld": "sld", "akp": "akp", "xog": "xog", "som": "so", "bmu": "bmu", "khq": "khq", "ses": "ses", "mnx": "mnx", "srn": "srn", "sxb": "sxb", "suc": "suc", "tgo": "tgo", "suk": "suk", "sun": "su", "suz": "suz", "sgj": "sgj", "sus": "sus", "swh": "swh", "swe": "sv", "syl": "syl", "dyi": "dyi", "myk": "myk", "spp": "spp", "tap": "tap", "tby": "tby", "tna": "tna", "shi": "shi", "klw": "klw", "tgl": "tl", "tbk": "tbk", "tgj": "tgj", "blt": "blt", "tbg": "tbg", "omw": "omw", "tgk": "tg", "tdj": "tdj", "tbc": "tbc", "tlj": "tlj", "tly": "tly", "ttq-script_tifinagh": "ttq-script_tifinagh", "taj": "taj", "taq": "taq", "tpm": "tpm", "tgp": "tgp", "tnn": "tnn", "tac": "tac", "rif-script_latin": "rif-script_latin", "rif-script_arabic": "rif-script_arabic", "tat": "tt", "tav": "tav", "twb": "twb", "tbl": "tbl", "kps": "kps", "twe": "twe", "ttc": "ttc", "kdh": "kdh", "tes": "tes", "tex": "tex", "tee": "tee", "tpp": "tpp", "tpt": "tpt", "stp": "stp", "tfr": "tfr", "twu": "twu", "ter": "ter", "tew": "tew", "tha": "th", "nod": "nod", "thl": "thl", "tem": "tem", "adx": "adx", "bod": "bo", "khg": "khg", "tca": "tca", "tir": "ti", "txq": "txq", "tik": "tik", "dgr": "dgr", "tob": "tob", "tmf": "tmf", "tng": "tng", "tlb": "tlb", "ood": "ood", "tpi": "tpi", "jic": "jic", "lbw": "lbw", "txa": "txa", "tom": "tom", "toh": "toh", "tnt": "tnt", "sda": "sda", "tcs": "tcs", "toc": "toc", "tos": "tos", "neb": "neb", "trn": "trn", "trs": "trs", "trc": "trc", "tri": "tri", "cof": "cof", "tkr": "tkr", "kdl": "kdl", "cas": "cas", "tso": "ts", "tuo": "tuo", "iou": "iou", "tmc": "tmc", "tuf": "tuf", "tuk-script_latin": "tk", "tuk-script_arabic": "tk", "bov": "bov", "tue": "tue", "kcg": "kcg", "tzh-dialect_bachaj\u00f3n": "tzh-dialect_bachaj\u00f3n", "tzh-dialect_tenejapa": "tzh-dialect_tenejapa", "tzo-dialect_chenalh\u00f3": "tzo-dialect_chenalh\u00f3", "tzo-dialect_chamula": "tzo-dialect_chamula", "tzj-dialect_western": "tzj-dialect_western", "tzj-dialect_eastern": "tzj-dialect_eastern", "aoz": "aoz", "udm": "udm", "udu": "udu", "ukr": "uk", "ppk": "ppk", "ubu": "ubu", "urk": "urk", "ura": "ura", "urt": "urt", "urd-script_devanagari": "ur", "urd-script_arabic": "ur", "urd-script_latin": "ur", "upv": "upv", "usp": "usp", "uig-script_arabic": "ug", "uig-script_cyrillic": "ug", "uzb-script_cyrillic": "uz", "vag": "vag", "bav": "bav", "vid": "vid", "vie": "vi", "vif": "vif", "vun": "vun", "vut": "vut", "prk": "prk", "wwa": "wwa", "rro": "rro", "bao": "bao", "waw": "waw", "lgl": "lgl", "wlx": "wlx", "cou": "cou", "hub": "hub", "gvc": "gvc", "mfi": "mfi", "wap": "wap", "wba": "wba", "war": "war", "way": "way", "guc": "guc", "cym": "cy", "kvw": "kvw", "tnp": "tnp", "hto": "hto", "huu": "huu", "wal-script_latin": "wal-script_latin", "wal-script_ethiopic": "wal-script_ethiopic", "wlo": "wlo", "noa": "noa", "wob": "wob", "kao": "kao", "xer": "xer", "yad": "yad", "yka": "yka", "sah": "sah", "yba": "yba", "yli": "yli", "nlk": "nlk", "yal": "yal", "yam": "yam", "yat": "yat", "jmd": "jmd", "tao": "tao", "yaa": "yaa", "ame": "ame", "guu": "guu", "yao": "yao", "yre": "yre", "yva": "yva", "ybb": "ybb", "pib": "pib", "byr": "byr", "pil": "pil", "ycn": "ycn", "ess": "ess", "yuz": "yuz", "atb": "atb", "zne": "zne", "zaq": "zaq", "zpo": "zpo", "zad": "zad", "zpc": "zpc", "zca": "zca", "zpg": "zpg", "zai": "zai", "zpl": "zpl", "zam": "zam", "zaw": "zaw", "zpm": "zpm", "zac": "zac", "zao": "zao", "ztq": "ztq", "zar": "zar", "zpt": "zpt", "zpi": "zpi", "zas": "zas", "zaa": "zaa", "zpz": "zpz", "zab": "zab", "zpu": "zpu", "zae": "zae", "zty": "zty", "zav": "zav", "zza": "zza", "zyb": "zyb", "ziw": "ziw", "zos": "zos", "gnd": "gnd"}, "yourtts": {"eng": "en", "fra": "fr", "por": "pt"} } @@ -64,52 +64,52 @@ punctuation_switch = { punctuation_list = [ # Common punctuation in Western languages - ".", ",", ":", ";", "!", "?", "¡", "¿", "«", "»", '"', + '.', ',', ':', ';', '!', '?', '¡', '¿', '«', '»', '"', # Punctuation used in Arabic and Persian - "،", "؛", "؟", + '،', '؛', '؟', # Punctuation used in Chinese, Japanese, and Korean (CJK) languages - "。", ",", "、", ":", ";", "!", "?", "·", "…", + '。', ',', '、', ':', ';', '!', '?', '·', '…', # Punctuation used in Indic scripts (e.g., Hindi, Bengali, Tamil) - "।", "॥", + '।', '॥', # Punctuation used in Thai - "ฯ", + 'ฯ', # Punctuation used in Ethiopic scripts - "፡", "።", "፣", "፤", "፥", "፦", "፧", + '፡', '።', '፣', '፤', '፥', '፦', '፧', # Punctuation used in Hebrew - "״", + '״', # Punctuation used in Tibetan "།", "༎", # Punctuation used in Khmer - "។", "៕", + '។', '៕', # Punctuation used in Lao - "໌", "ໍ", + '໌', 'ໍ', # Miscellaneous punctuation (pause-inducing, used globally) - "—", "‽" + '—', '‽' ] punctuation_split = [ # Common punctuation in Western languages - ".", + '.', # Punctuation used in Arabic and Persian - "،", + '،', # Punctuation used in Chinese, Japanese, and Korean (CJK) languages - "。", ",", "、", "·", "…", + '。', ',', '、', '·', '…', # Punctuation used in Indic scripts (e.g., Hindi, Bengali, Tamil) - "।", "॥", + '।', '॥', # Punctuation used in Thai - "ฯ", + 'ฯ', # Punctuation used in Ethiopic scripts - "፡", "።", "፣", "፤", "፥", "፦", "፧", + '፡', '።', '፣', '፤', '፥', '፦', '፧', # Punctuation used in Hebrew - "״", + '״', # Punctuation used in Tibetan "།", "༎", # Punctuation used in Khmer - "។", "៕", + '។', '៕', # Punctuation used in Lao - "໌", "ໍ", + '໌', 'ໍ', # Miscellaneous punctuation (pause-inducing, used globally) - "—", "..." + '—', '!', '?' ] language_math_phonemes = { @@ -290,1163 +290,1166 @@ abbreviations_mapping = { } language_mapping = { - "ara": {"name": "Arabic", "native_name": "العربية", "max_tokens": 26}, - "ben": {"name": "Bengali", "native_name": "বাংলা", "max_tokens": 13}, - "zho": {"name": "Chinese", "native_name": "中文", "max_tokens": 13}, - "eng": {"name": "English", "native_name": "English", "max_tokens": 26}, - "fas": {"name": "Persian", "native_name": "فارسی", "max_tokens": 26}, - "fra": {"name": "French", "native_name": "Français", "max_tokens": 26}, - "deu": {"name": "German, Standard", "native_name": "Deutsch", "max_tokens": 26}, - "hin": {"name": "Hindi", "native_name": "हिन्दी", "max_tokens": 13}, - "hun": {"name": "Hungarian", "native_name": "Magyar", "max_tokens": 26}, - "ind": {"name": "Indonesian", "native_name": "Bahasa Indonesia", "max_tokens": 26}, - "ita": {"name": "Italian", "native_name": "Italiano", "max_tokens": 26}, - "jav": {"name": "Javanese", "native_name": "Basa Jawa", "max_tokens": 26}, - "jpn": {"name": "Japanese", "native_name": "日本語", "max_tokens": 13}, - "kor": {"name": "Korean", "native_name": "한국어", "max_tokens": 13}, - "pol": {"name": "Polish", "native_name": "Polski", "max_tokens": 26}, - "por": {"name": "Portuguese", "native_name": "Português", "max_tokens": 13}, - "rus": {"name": "Russian", "native_name": "Русский", "max_tokens": 26}, - "spa": {"name": "Spanish", "native_name": "Español", "max_tokens": 26}, - "tam": {"name": "Tamil", "native_name": "தமிழ்", "max_tokens": 13}, - "tel": {"name": "Telugu", "native_name": "తెలుగు", "max_tokens": 13}, - "tur": {"name": "Turkish", "native_name": "Türkçe", "max_tokens": 26}, - "yor": {"name": "Yoruba", "native_name": "Èdè Yorùbá", "max_tokens": 13}, + "ara": {"name": "Arabic", "native_name": "العربية", "max_tokens": 25}, + "ben": {"name": "Bengali", "native_name": "বাংলা", "max_tokens": 12}, + "zho": {"name": "Chinese", "native_name": "中文", "max_tokens": 12}, + "eng": {"name": "English", "native_name": "English", "max_tokens": 25}, + "fas": {"name": "Persian", "native_name": "فارسی", "max_tokens": 25}, + "fra": {"name": "French", "native_name": "Français", "max_tokens": 25}, + "deu": {"name": "German, Standard", "native_name": "Deutsch", "max_tokens": 25}, + "hin": {"name": "Hindi", "native_name": "हिन्दी", "max_tokens": 12}, + "hun": {"name": "Hungarian", "native_name": "Magyar", "max_tokens": 25}, + "ind": {"name": "Indonesian", "native_name": "Bahasa Indonesia", "max_tokens": 25}, + "ita": {"name": "Italian", "native_name": "Italiano", "max_tokens": 25}, + "jav": {"name": "Javanese", "native_name": "Basa Jawa", "max_tokens": 25}, + "jpn": {"name": "Japanese", "native_name": "日本語", "max_tokens": 12}, + "kor": {"name": "Korean", "native_name": "한국어", "max_tokens": 12}, + "pol": {"name": "Polish", "native_name": "Polski", "max_tokens": 25}, + "por": {"name": "Portuguese", "native_name": "Português", "max_tokens": 12}, + "rus": {"name": "Russian", "native_name": "Русский", "max_tokens": 25}, + "spa": {"name": "Spanish", "native_name": "Español", "max_tokens": 25}, + "tam": {"name": "Tamil", "native_name": "தமிழ்", "max_tokens": 12}, + "tel": {"name": "Telugu", "native_name": "తెలుగు", "max_tokens": 12}, + "tur": {"name": "Turkish", "native_name": "Türkçe", "max_tokens": 25}, + "yor": {"name": "Yoruba", "native_name": "Èdè Yorùbá", "max_tokens": 12}, - "zzz": {"name": "------------------ More languages (A to Z) ------------------", "native_name": "------------------ More languages (A to Z) ------------------", "max_tokens": 26}, + "zzz": {"name": "------------------ More languages (A to Z) ------------------", "native_name": "------------------ More languages (A to Z) ------------------", "max_tokens": 25}, - "abi": {"name": "Abidji", "native_name": "Abidji", "max_tokens": 13}, - "ace": {"name": "Aceh", "native_name": "Acèh", "max_tokens": 13}, - "aca": {"name": "Achagua", "native_name": "Achagua", "max_tokens": 13}, - "acn": {"name": "Achang", "native_name": "Achang", "max_tokens": 26}, - "acr": {"name": "Achi", "native_name": "Achi", "max_tokens": 26}, - "ach": {"name": "Acholi", "native_name": "Acholi", "max_tokens": 13}, - "acu": {"name": "Achuar-Shiwiar", "native_name": "Achuar-Shiwiar", "max_tokens": 13}, - "guq": {"name": "Aché", "native_name": "Aché", "max_tokens": 26}, - "ade": {"name": "Adele", "native_name": "Adele", "max_tokens": 26}, - "adj": {"name": "Adioukrou", "native_name": "Adioukrou", "max_tokens": 13}, - "agd": {"name": "Agarabi", "native_name": "Agarabi", "max_tokens": 13}, - "agx": {"name": "Aghul", "native_name": "Aghul", "max_tokens": 13}, - "agn": {"name": "Agutaynen", "native_name": "Agutaynen", "max_tokens": 13}, - "aha": {"name": "Ahanta", "native_name": "Ahanta", "max_tokens": 26}, - "aka": {"name": "Akan", "native_name": "Akan", "max_tokens": 26}, - "knj": {"name": "Akateko", "native_name": "Akateko", "max_tokens": 13}, - "ake": {"name": "Akawaio", "native_name": "Akawaio", "max_tokens": 13}, - "aeu": {"name": "Akeu", "native_name": "Akeu", "max_tokens": 26}, - "ahk": {"name": "Akha", "native_name": "Akha", "max_tokens": 26}, - "bss": {"name": "Akoose", "native_name": "Akoose", "max_tokens": 26}, - "alj": {"name": "Alangan", "native_name": "Alangan", "max_tokens": 26}, - "sqi": {"name": "Albanian", "native_name": "Shqip", "max_tokens": 13}, - "alt": {"name": "Altai, Southern", "native_name": "Алтай тили", "max_tokens": 26}, - "alp": {"name": "Alune", "native_name": "Alune", "max_tokens": 26}, - "alz": {"name": "Alur", "native_name": "Alur", "max_tokens": 26}, - "kab": {"name": "Amazigh", "native_name": "Tamaziɣt", "max_tokens": 13}, - "amk": {"name": "Ambai", "native_name": "Ambai", "max_tokens": 26}, - "mmg": {"name": "Ambrym, North", "native_name": "Ambrym", "max_tokens": 13}, - "amh": {"name": "Amharic", "native_name": "አማርኛ", "max_tokens": 26}, - "ami": {"name": "Amis", "native_name": "Amis", "max_tokens": 26}, - "azg": {"name": "Amuzgo, San Pedro Amuzgos", "native_name": "Amuzgo", "max_tokens": 13}, - "agg": {"name": "Angor", "native_name": "Angor", "max_tokens": 26}, - "boj": {"name": "Anjam", "native_name": "Anjam", "max_tokens": 26}, - "cko": {"name": "Anufo", "native_name": "Anufo", "max_tokens": 13}, - "any": {"name": "Anyin", "native_name": "Anyin", "max_tokens": 26}, - "arl": {"name": "Arabela", "native_name": "Arabela", "max_tokens": 26}, - "atq": {"name": "Aralle-Tabulahan", "native_name": "Aralle-Tabulahan", "max_tokens": 26}, - "luc": {"name": "Aringa", "native_name": "Aringa", "max_tokens": 26}, - "hyw": {"name": "Armenian, Western", "native_name": "Հայերեն", "max_tokens": 26}, - "apr": {"name": "Arop-Lokep", "native_name": "Arop-Lokep", "max_tokens": 26}, - "aia": {"name": "Arosi", "native_name": "Arosi", "max_tokens": 26}, - "msy": {"name": "Aruamu", "native_name": "Aruamu", "max_tokens": 13}, - "cni": {"name": "Asháninka", "native_name": "Asháninka", "max_tokens": 13}, - "cjo": {"name": "Ashéninka, Pajonal", "native_name": "Ashéninka", "max_tokens": 13}, - "cpu": {"name": "Ashéninka, Pichis", "native_name": "Ashéninka", "max_tokens": 13}, - "cpb": {"name": "Ashéninka, Ucayali-Yurúa", "native_name": "Ashéninka", "max_tokens": 13}, - "asm": {"name": "Assamese", "native_name": "অসমীয়া", "max_tokens": 13}, - "asa": {"name": "Asu", "native_name": "Asu", "max_tokens": 26}, - "teo": {"name": "Ateso", "native_name": "Ateso", "max_tokens": 26}, - "ati": {"name": "Attié", "native_name": "Attié", "max_tokens": 13}, - "djk": {"name": "Aukan", "native_name": "Aukan", "max_tokens": 26}, - "ava": {"name": "Avar", "native_name": "Авар", "max_tokens": 26}, - "avn": {"name": "Avatime", "native_name": "Avatime", "max_tokens": 26}, - "avu": {"name": "Avokaya", "native_name": "Avokaya", "max_tokens": 13}, - "awb": {"name": "Awa", "native_name": "Awa", "max_tokens": 26}, - "kwi": {"name": "Awa-Cuaiquer", "native_name": "Awa-Cuaiquer", "max_tokens": 26}, - "awa": {"name": "Awadhi", "native_name": "अवधी", "max_tokens": 13}, - "agr": {"name": "Awajún", "native_name": "Awajún", "max_tokens": 13}, - "agu": {"name": "Awakateko", "native_name": "Awakateko", "max_tokens": 13}, - "ayr": {"name": "Aymara, Central", "native_name": "Aymara", "max_tokens": 26}, - "ayo": {"name": "Ayoreo", "native_name": "Ayoreo", "max_tokens": 13}, - "abp": {"name": "Ayta, Abellen", "native_name": "Abellen", "max_tokens": 26}, - "blx": {"name": "Ayta, Mag-Indi", "native_name": "Mag-Indi", "max_tokens": 26}, - "sgb": {"name": "Ayta, Mag-antsi", "native_name": "Mag-antsi", "max_tokens": 26}, - "azj-script_cyrillic": {"name": "Azerbaijani, North - Cyrillic", "native_name": "Азәрбајҹан", "max_tokens": 26}, - "azj-script_latin": {"name": "Azerbaijani, North - Latin", "native_name": "Azərbaycan", "max_tokens": 26}, - "azb": {"name": "Azerbaijani, South - Arabic", "native_name": "گؤنئی", "max_tokens": 13}, - "bba": {"name": "Baatonum", "native_name": "Baatonum", "max_tokens": 13}, - "bhz": {"name": "Bada", "native_name": "Bada", "max_tokens": 26}, - "bvc": {"name": "Baelelea", "native_name": "Baelelea", "max_tokens": 13}, - "bfy": {"name": "Bagheli", "native_name": "बघेली", "max_tokens": 13}, - "bgq": {"name": "Bagri", "native_name": "बागड़ी", "max_tokens": 13}, - "bdq": {"name": "Bahnar", "native_name": "Bahnar", "max_tokens": 26}, - "bdh": {"name": "Baka", "native_name": "Baka", "max_tokens": 26}, - "bqi": {"name": "Bakhtiâri", "native_name": "بختیاری", "max_tokens": 13}, - "bjw": {"name": "Bakwé", "native_name": "Bakwé", "max_tokens": 13}, - "blz": {"name": "Balantak", "native_name": "Balantak", "max_tokens": 13}, - "ban": {"name": "Bali", "native_name": "Bali", "max_tokens": 26}, - "bcc-script_latin": {"name": "Balochi, Southern - Latin", "native_name": "Balochi", "max_tokens": 13}, - "bcc-script_arabic": {"name": "Balochi, Southern - Arabic", "native_name": "بلوچی", "max_tokens": 13}, - "bam": {"name": "Bamanankan", "native_name": "Bamanankan", "max_tokens": 13}, - "ptu": {"name": "Bambam", "native_name": "Bambam", "max_tokens": 13}, - "bcw": {"name": "Bana", "native_name": "Bana", "max_tokens": 26}, - "bqj": {"name": "Bandial", "native_name": "Bandial", "max_tokens": 26}, - "bno": {"name": "Bantoanon", "native_name": "Bantoanon", "max_tokens": 13}, - "bbb": {"name": "Barai", "native_name": "Barai", "max_tokens": 26}, - "bfa": {"name": "Bari", "native_name": "Bari", "max_tokens": 26}, - "bjz": {"name": "Baruga", "native_name": "Baruga", "max_tokens": 26}, - "bak": {"name": "Bashkort", "native_name": "Башҡорт", "max_tokens": 26}, - "eus": {"name": "Basque", "native_name": "Euskara", "max_tokens": 13}, - "bsq": {"name": "Bassa", "native_name": "Bassa", "max_tokens": 26}, - "akb": {"name": "Batak Angkola", "native_name": "Batak Angkola", "max_tokens": 26}, - "btd": {"name": "Batak Dairi", "native_name": "Batak Dairi", "max_tokens": 26}, - "btx": {"name": "Batak Karo", "native_name": "Batak Karo", "max_tokens": 26}, - "bts": {"name": "Batak Simalungun", "native_name": "Batak Simalungun", "max_tokens": 13}, - "bbc": {"name": "Batak Toba", "native_name": "Batak Toba", "max_tokens": 26}, - "bvz": {"name": "Bauzi", "native_name": "Bauzi", "max_tokens": 26}, - "bjv": {"name": "Bedjond", "native_name": "Bedjond", "max_tokens": 13}, - "bep": {"name": "Behoa", "native_name": "Behoa", "max_tokens": 13}, - "bkv": {"name": "Bekwarra", "native_name": "Bekwarra", "max_tokens": 13}, - "bzj": {"name": "Belize English Creole", "native_name": "Kriol", "max_tokens": 26}, - "bem": {"name": "Bemba", "native_name": "Ichibemba", "max_tokens": 13}, - "bng": {"name": "Benga", "native_name": "Benga", "max_tokens": 26}, - "bom": {"name": "Berom", "native_name": "Berom", "max_tokens": 26}, - "btt": {"name": "Bete-Bendi", "native_name": "Bete-Bendi", "max_tokens": 26}, - "bha": {"name": "Bharia", "native_name": "Bharia", "max_tokens": 13}, - "bgw": {"name": "Bhatri", "native_name": "Bhatri", "max_tokens": 13}, - "bht": {"name": "Bhattiyali", "native_name": "Bhattiyali", "max_tokens": 13}, - "beh": {"name": "Biali", "native_name": "Biali", "max_tokens": 26}, - "sne": {"name": "Bidayuh, Bau", "native_name": "Bidayuh Bau", "max_tokens": 26}, - "ubl": {"name": "Bikol, Buhi’non", "native_name": "Bikol Buhi’non", "max_tokens": 26}, - "bcl": {"name": "Bikol, Central", "native_name": "Bikol Central", "max_tokens": 26}, - "bim": {"name": "Bimoba", "native_name": "Bimoba", "max_tokens": 13}, - "bkd": {"name": "Binukid", "native_name": "Binukid", "max_tokens": 13}, - "bjr": {"name": "Binumarien", "native_name": "Binumarien", "max_tokens": 13}, - "bfo": {"name": "Birifor, Malba", "native_name": "Birifor Malba", "max_tokens": 13}, - "biv": {"name": "Birifor, Southern", "native_name": "Birifor Southern", "max_tokens": 26}, - "bib": {"name": "Bisa", "native_name": "Bisa", "max_tokens": 26}, - "bis": {"name": "Bislama", "native_name": "Bislama", "max_tokens": 26}, - "bzi": {"name": "Bisu", "native_name": "Bisu", "max_tokens": 26}, - "bqp": {"name": "Bisã", "native_name": "Bisã", "max_tokens": 26}, - "bpr": {"name": "Blaan, Koronadal", "native_name": "Blaan Koronadal", "max_tokens": 13}, - "bps": {"name": "Blaan, Sarangani", "native_name": "Blaan Sarangani", "max_tokens": 13}, - "bwq": {"name": "Bobo Madaré, Southern", "native_name": "Bobo Madaré Southern", "max_tokens": 26}, - "bdv": {"name": "Bodo Parja", "native_name": "Bodo Parja", "max_tokens": 26}, - "bqc": {"name": "Boko", "native_name": "Boko", "max_tokens": 26}, - "bus": {"name": "Bokobaru", "native_name": "Bokobaru", "max_tokens": 13}, - "bnp": {"name": "Bola", "native_name": "Bola", "max_tokens": 26}, - "bmq": {"name": "Bomu", "native_name": "Bomu", "max_tokens": 26}, - "bdg": {"name": "Bonggi", "native_name": "Bonggi", "max_tokens": 26}, - "boa": {"name": "Bora", "native_name": "Bora", "max_tokens": 26}, - "ksr": {"name": "Borong", "native_name": "Borong", "max_tokens": 26}, - "bor": {"name": "Borôro", "native_name": "Borôro", "max_tokens": 13}, - "bru": {"name": "Bru, Eastern", "native_name": "Bru", "max_tokens": 26}, - "box": {"name": "Buamu", "native_name": "Buamu", "max_tokens": 13}, - "bzh": {"name": "Buang, Mapos", "native_name": "Buang", "max_tokens": 26}, - "bgt": {"name": "Bughotu", "native_name": "Bughotu", "max_tokens": 13}, - "sab": {"name": "Buglere", "native_name": "Buglere", "max_tokens": 26}, - "bul": {"name": "Bulgarian", "native_name": "Български", "max_tokens": 13}, - "bwu": {"name": "Buli", "native_name": "Buli", "max_tokens": 26}, - "bmv": {"name": "Bum", "native_name": "Bum", "max_tokens": 26}, - "mya": {"name": "Burmese", "native_name": "မြန်မာ", "max_tokens": 13}, - "tte": {"name": "Bwanabwana", "native_name": "Bwanabwana", "max_tokens": 13}, - "cjp": {"name": "Cabécar", "native_name": "Cabécar", "max_tokens": 13}, - "cbv": {"name": "Cacua", "native_name": "Cacua", "max_tokens": 26}, - "kaq": {"name": "Capanahua", "native_name": "Capanahua", "max_tokens": 13}, - "cot": {"name": "Caquinte", "native_name": "Caquinte", "max_tokens": 13}, - "cbc": {"name": "Carapana", "native_name": "Carapana", "max_tokens": 26}, - "car": {"name": "Carib", "native_name": "Carib", "max_tokens": 26}, - "cat": {"name": "Catalan", "native_name": "Català", "max_tokens": 13}, - "ceb": {"name": "Cebuano", "native_name": "Cebuano", "max_tokens": 13}, - "cme": {"name": "Cerma", "native_name": "Cerma", "max_tokens": 26}, - "cbi": {"name": "Chachi", "native_name": "Cha’palaa", "max_tokens": 26}, - "ceg": {"name": "Chamacoco", "native_name": "Chamacoco", "max_tokens": 13}, - "cly": {"name": "Chatino, Eastern Highland", "native_name": "Chatino", "max_tokens": 26}, - "cya": {"name": "Chatino, Nopala", "native_name": "Chatino", "max_tokens": 26}, - "che": {"name": "Chechen", "native_name": "Нохчийн", "max_tokens": 13}, - "hne": {"name": "Chhattisgarhi", "native_name": "छत्तीसगढ़ी", "max_tokens": 13}, - "nya": {"name": "Chichewa", "native_name": "Chichewa", "max_tokens": 13}, - "dig": {"name": "Chidigo", "native_name": "Chidigo", "max_tokens": 13}, - "dug": {"name": "Chiduruma", "native_name": "Chiduruma", "max_tokens": 13}, - "bgr": {"name": "Chin, Bawm", "native_name": "Bawm Chin", "max_tokens": 26}, - "cek": {"name": "Chin, Eastern Khumi", "native_name": "Khumi Chin", "max_tokens": 26}, - "cfm": {"name": "Chin, Falam", "native_name": "Falam Chin", "max_tokens": 26}, - "cnh": {"name": "Chin, Hakha", "native_name": "Hakha Chin", "max_tokens": 26}, - "hlt": {"name": "Chin, Matu", "native_name": "Matu Chin", "max_tokens": 26}, - "mwq": {"name": "Chin, Müün", "native_name": "Müün Chin", "max_tokens": 26}, - "ctd": {"name": "Chin, Tedim", "native_name": "Tedim Chin", "max_tokens": 26}, - "tcz": {"name": "Chin, Thado", "native_name": "Thado Chin", "max_tokens": 26}, - "zyp": {"name": "Chin, Zyphe", "native_name": "Zyphe Chin", "max_tokens": 26}, - "cco": {"name": "Chinantec, Comaltepec", "native_name": "Chinantec", "max_tokens": 13}, - "cnl": {"name": "Chinantec, Lalana", "native_name": "Chinantec", "max_tokens": 13}, - "cle": {"name": "Chinantec, Lealao", "native_name": "Chinantec", "max_tokens": 13}, - "chz": {"name": "Chinantec, Ozumacín", "native_name": "Chinantec", "max_tokens": 13}, - "cpa": {"name": "Chinantec, Palantla", "native_name": "Chinantec", "max_tokens": 13}, - "cso": {"name": "Chinantec, Sochiapam", "native_name": "Chinantec", "max_tokens": 13}, - "cnt": {"name": "Chinantec, Tepetotutla", "native_name": "Chinantec", "max_tokens": 13}, - "cuc": {"name": "Chinantec, Usila", "native_name": "Chinantec", "max_tokens": 13}, - "hak": {"name": "Chinese, Hakka", "native_name": "客家話", "max_tokens": 13}, - "nan": {"name": "Chinese, Min Nan", "native_name": "閩南語", "max_tokens": 13}, - "xnj": {"name": "Chingoni", "native_name": "Chingoni", "max_tokens": 26}, - "cap": {"name": "Chipaya", "native_name": "Chipaya", "max_tokens": 26}, - "cax": {"name": "Chiquitano", "native_name": "Chiquitano", "max_tokens": 13}, - "ctg": {"name": "Chittagonian", "native_name": "চাটগাঁইয়া", "max_tokens": 13}, - "ctu": {"name": "Chol", "native_name": "Ch’ol", "max_tokens": 26}, - "chf": {"name": "Chontal, Tabasco", "native_name": "Chontal", "max_tokens": 26}, - "cce": {"name": "Chopi", "native_name": "Chopi", "max_tokens": 26}, - "crt": {"name": "Chorote, Iyojwa’ja", "native_name": "Iyojwa’ja Chorote", "max_tokens": 26}, - "crq": {"name": "Chorote, Iyo’wujwa", "native_name": "Iyo’wujwa Chorote", "max_tokens": 26}, - "cac-dialect_sansebastiáncoatán": {"name": "Chuj - San Sebastián Coatán", "native_name": "Chuj", "max_tokens": 26}, - "cac-dialect_sanmateoixtatán": {"name": "Chuj - San Mateo Ixtatán", "native_name": "Chuj", "max_tokens": 26}, - "ckt": {"name": "Chukchi", "native_name": "Чукотский", "max_tokens": 13}, - "ncu": {"name": "Chumburung", "native_name": "Chumburung", "max_tokens": 13}, - "cdj": {"name": "Churahi", "native_name": "Churahi", "max_tokens": 13}, - "chv": {"name": "Chuvash", "native_name": "Чӑвашла", "max_tokens": 13}, - "caa": {"name": "Ch’orti’", "native_name": "Ch’orti’", "max_tokens": 26}, - "asg": {"name": "Cishingini", "native_name": "Cishingini", "max_tokens": 13}, - "con": {"name": "Cofán", "native_name": "A’ingae", "max_tokens": 26}, - "crn": {"name": "Cora, El Nayar", "native_name": "Naayeri", "max_tokens": 13}, - "cok": {"name": "Cora, Santa Teresa", "native_name": "Náayari", "max_tokens": 13}, - "crk-script_latin": {"name": "Cree, Plains - Latin", "native_name": "Nēhiyawēwin", "max_tokens": 13}, - "crk-script_syllabics": {"name": "Cree, Plains - Syllabsics", "native_name": "ᓀᐦᐃᔭᐍᐏᐣ", "max_tokens": 26}, - "crh": {"name": "Crimean Tatar", "native_name": "Къырымтатарджа", "max_tokens": 13}, - "hrv": {"name": "Croatian", "native_name": "hrvatski", "char_limit": 26}, - "cui": {"name": "Cuiba", "native_name": "Cuiba", "max_tokens": 26}, - "ces": {"name": "Czech", "native_name": "Čeština", "max_tokens": 26}, - "dsh": {"name": "Daasanach", "native_name": "Daasanach", "max_tokens": 13}, - "dbq": {"name": "Daba", "native_name": "Daba", "max_tokens": 26}, - "dga": {"name": "Dagaare, Southern", "native_name": "Dagaare", "max_tokens": 13}, - "dgi": {"name": "Dagara, Northern", "native_name": "Dagara", "max_tokens": 26}, - "dgk": {"name": "Dagba", "native_name": "Dagba", "max_tokens": 26}, - "dnj-dialect_gweetaawueast": {"name": "Dan - Gweetaawueast", "native_name": "Gweetaa Wu East", "max_tokens": 26}, - "dnj-dialect_blowowest": {"name": "Dan - Blowowest", "native_name": "Blowo West", "max_tokens": 26}, - "daa": {"name": "Dangaléat", "native_name": "Dangaléat", "max_tokens": 13}, - "dnt": {"name": "Dani, Mid Grand Valley", "native_name": "Mid Grand Valley Dani", "max_tokens": 26}, - "dnw": {"name": "Dani, Western", "native_name": "Western Dani", "max_tokens": 26}, + "abi": {"name": "Abidji", "native_name": "Abidji", "max_tokens": 12}, + "ace": {"name": "Aceh", "native_name": "Acèh", "max_tokens": 12}, + "aca": {"name": "Achagua", "native_name": "Achagua", "max_tokens": 12}, + "acn": {"name": "Achang", "native_name": "Achang", "max_tokens": 25}, + "acr": {"name": "Achi", "native_name": "Achi", "max_tokens": 25}, + "ach": {"name": "Acholi", "native_name": "Acholi", "max_tokens": 12}, + "acu": {"name": "Achuar-Shiwiar", "native_name": "Achuar-Shiwiar", "max_tokens": 12}, + "guq": {"name": "Aché", "native_name": "Aché", "max_tokens": 25}, + "ade": {"name": "Adele", "native_name": "Adele", "max_tokens": 25}, + "adj": {"name": "Adioukrou", "native_name": "Adioukrou", "max_tokens": 12}, + "agd": {"name": "Agarabi", "native_name": "Agarabi", "max_tokens": 12}, + "agx": {"name": "Aghul", "native_name": "Aghul", "max_tokens": 12}, + "agn": {"name": "Agutaynen", "native_name": "Agutaynen", "max_tokens": 12}, + "aha": {"name": "Ahanta", "native_name": "Ahanta", "max_tokens": 25}, + "aka": {"name": "Akan", "native_name": "Akan", "max_tokens": 25}, + "knj": {"name": "Akateko", "native_name": "Akateko", "max_tokens": 12}, + "ake": {"name": "Akawaio", "native_name": "Akawaio", "max_tokens": 12}, + "aeu": {"name": "Akeu", "native_name": "Akeu", "max_tokens": 25}, + "ahk": {"name": "Akha", "native_name": "Akha", "max_tokens": 25}, + "bss": {"name": "Akoose", "native_name": "Akoose", "max_tokens": 25}, + "alj": {"name": "Alangan", "native_name": "Alangan", "max_tokens": 25}, + "sqi": {"name": "Albanian", "native_name": "Shqip", "max_tokens": 12}, + "alt": {"name": "Altai, Southern", "native_name": "Алтай тили", "max_tokens": 25}, + "alp": {"name": "Alune", "native_name": "Alune", "max_tokens": 25}, + "alz": {"name": "Alur", "native_name": "Alur", "max_tokens": 25}, + "kab": {"name": "Amazigh", "native_name": "Tamaziɣt", "max_tokens": 12}, + "amk": {"name": "Ambai", "native_name": "Ambai", "max_tokens": 25}, + "mmg": {"name": "Ambrym, North", "native_name": "Ambrym", "max_tokens": 12}, + "amh": {"name": "Amharic", "native_name": "አማርኛ", "max_tokens": 25}, + "ami": {"name": "Amis", "native_name": "Amis", "max_tokens": 25}, + "azg": {"name": "Amuzgo, San Pedro Amuzgos", "native_name": "Amuzgo", "max_tokens": 12}, + "agg": {"name": "Angor", "native_name": "Angor", "max_tokens": 25}, + "boj": {"name": "Anjam", "native_name": "Anjam", "max_tokens": 25}, + "cko": {"name": "Anufo", "native_name": "Anufo", "max_tokens": 12}, + "any": {"name": "Anyin", "native_name": "Anyin", "max_tokens": 25}, + "arl": {"name": "Arabela", "native_name": "Arabela", "max_tokens": 25}, + "atq": {"name": "Aralle-Tabulahan", "native_name": "Aralle-Tabulahan", "max_tokens": 25}, + "luc": {"name": "Aringa", "native_name": "Aringa", "max_tokens": 25}, + "hyw": {"name": "Armenian, Western", "native_name": "Հայերեն", "max_tokens": 25}, + "apr": {"name": "Arop-Lokep", "native_name": "Arop-Lokep", "max_tokens": 25}, + "aia": {"name": "Arosi", "native_name": "Arosi", "max_tokens": 25}, + "msy": {"name": "Aruamu", "native_name": "Aruamu", "max_tokens": 12}, + "cni": {"name": "Asháninka", "native_name": "Asháninka", "max_tokens": 12}, + "cjo": {"name": "Ashéninka, Pajonal", "native_name": "Ashéninka", "max_tokens": 12}, + "cpu": {"name": "Ashéninka, Pichis", "native_name": "Ashéninka", "max_tokens": 12}, + "cpb": {"name": "Ashéninka, Ucayali-Yurúa", "native_name": "Ashéninka", "max_tokens": 12}, + "asm": {"name": "Assamese", "native_name": "অসমীয়া", "max_tokens": 12}, + "asa": {"name": "Asu", "native_name": "Asu", "max_tokens": 25}, + "teo": {"name": "Ateso", "native_name": "Ateso", "max_tokens": 25}, + "ati": {"name": "Attié", "native_name": "Attié", "max_tokens": 12}, + "djk": {"name": "Aukan", "native_name": "Aukan", "max_tokens": 25}, + "ava": {"name": "Avar", "native_name": "Авар", "max_tokens": 25}, + "avn": {"name": "Avatime", "native_name": "Avatime", "max_tokens": 25}, + "avu": {"name": "Avokaya", "native_name": "Avokaya", "max_tokens": 12}, + "awb": {"name": "Awa", "native_name": "Awa", "max_tokens": 25}, + "kwi": {"name": "Awa-Cuaiquer", "native_name": "Awa-Cuaiquer", "max_tokens": 25}, + "awa": {"name": "Awadhi", "native_name": "अवधी", "max_tokens": 12}, + "agr": {"name": "Awajún", "native_name": "Awajún", "max_tokens": 12}, + "agu": {"name": "Awakateko", "native_name": "Awakateko", "max_tokens": 12}, + "ayr": {"name": "Aymara, Central", "native_name": "Aymara", "max_tokens": 25}, + "ayo": {"name": "Ayoreo", "native_name": "Ayoreo", "max_tokens": 12}, + "abp": {"name": "Ayta, Abellen", "native_name": "Abellen", "max_tokens": 25}, + "blx": {"name": "Ayta, Mag-Indi", "native_name": "Mag-Indi", "max_tokens": 25}, + "sgb": {"name": "Ayta, Mag-antsi", "native_name": "Mag-antsi", "max_tokens": 25}, + "azj-script_cyrillic": {"name": "Azerbaijani, North - Cyrillic", "native_name": "Азәрбајҹан", "max_tokens": 25}, + "azj-script_latin": {"name": "Azerbaijani, North - Latin", "native_name": "Azərbaycan", "max_tokens": 25}, + "azb": {"name": "Azerbaijani, South - Arabic", "native_name": "گؤنئی", "max_tokens": 12}, + "bba": {"name": "Baatonum", "native_name": "Baatonum", "max_tokens": 12}, + "bhz": {"name": "Bada", "native_name": "Bada", "max_tokens": 25}, + "bvc": {"name": "Baelelea", "native_name": "Baelelea", "max_tokens": 12}, + "bfy": {"name": "Bagheli", "native_name": "बघेली", "max_tokens": 12}, + "bgq": {"name": "Bagri", "native_name": "बागड़ी", "max_tokens": 12}, + "bdq": {"name": "Bahnar", "native_name": "Bahnar", "max_tokens": 25}, + "bdh": {"name": "Baka", "native_name": "Baka", "max_tokens": 25}, + "bqi": {"name": "Bakhtiâri", "native_name": "بختیاری", "max_tokens": 12}, + "bjw": {"name": "Bakwé", "native_name": "Bakwé", "max_tokens": 12}, + "blz": {"name": "Balantak", "native_name": "Balantak", "max_tokens": 12}, + "ban": {"name": "Bali", "native_name": "Bali", "max_tokens": 25}, + "bcc-script_latin": {"name": "Balochi, Southern - Latin", "native_name": "Balochi", "max_tokens": 12}, + "bcc-script_arabic": {"name": "Balochi, Southern - Arabic", "native_name": "بلوچی", "max_tokens": 12}, + "bam": {"name": "Bamanankan", "native_name": "Bamanankan", "max_tokens": 12}, + "ptu": {"name": "Bambam", "native_name": "Bambam", "max_tokens": 12}, + "bcw": {"name": "Bana", "native_name": "Bana", "max_tokens": 25}, + "bqj": {"name": "Bandial", "native_name": "Bandial", "max_tokens": 25}, + "bno": {"name": "Bantoanon", "native_name": "Bantoanon", "max_tokens": 12}, + "bbb": {"name": "Barai", "native_name": "Barai", "max_tokens": 25}, + "bfa": {"name": "Bari", "native_name": "Bari", "max_tokens": 25}, + "bjz": {"name": "Baruga", "native_name": "Baruga", "max_tokens": 25}, + "bak": {"name": "Bashkort", "native_name": "Башҡорт", "max_tokens": 25}, + "eus": {"name": "Basque", "native_name": "Euskara", "max_tokens": 12}, + "bsq": {"name": "Bassa", "native_name": "Bassa", "max_tokens": 25}, + "akb": {"name": "Batak Angkola", "native_name": "Batak Angkola", "max_tokens": 25}, + "btd": {"name": "Batak Dairi", "native_name": "Batak Dairi", "max_tokens": 25}, + "btx": {"name": "Batak Karo", "native_name": "Batak Karo", "max_tokens": 25}, + "bts": {"name": "Batak Simalungun", "native_name": "Batak Simalungun", "max_tokens": 12}, + "bbc": {"name": "Batak Toba", "native_name": "Batak Toba", "max_tokens": 25}, + "bvz": {"name": "Bauzi", "native_name": "Bauzi", "max_tokens": 25}, + "bjv": {"name": "Bedjond", "native_name": "Bedjond", "max_tokens": 12}, + "bep": {"name": "Behoa", "native_name": "Behoa", "max_tokens": 12}, + "bkv": {"name": "Bekwarra", "native_name": "Bekwarra", "max_tokens": 12}, + "bzj": {"name": "Belize English Creole", "native_name": "Kriol", "max_tokens": 25}, + "bem": {"name": "Bemba", "native_name": "Ichibemba", "max_tokens": 12}, + "bng": {"name": "Benga", "native_name": "Benga", "max_tokens": 25}, + "bom": {"name": "Berom", "native_name": "Berom", "max_tokens": 25}, + "btt": {"name": "Bete-Bendi", "native_name": "Bete-Bendi", "max_tokens": 25}, + "bha": {"name": "Bharia", "native_name": "Bharia", "max_tokens": 12}, + "bgw": {"name": "Bhatri", "native_name": "Bhatri", "max_tokens": 12}, + "bht": {"name": "Bhattiyali", "native_name": "Bhattiyali", "max_tokens": 12}, + "beh": {"name": "Biali", "native_name": "Biali", "max_tokens": 25}, + "sne": {"name": "Bidayuh, Bau", "native_name": "Bidayuh Bau", "max_tokens": 25}, + "ubl": {"name": "Bikol, Buhi’non", "native_name": "Bikol Buhi’non", "max_tokens": 25}, + "bcl": {"name": "Bikol, Central", "native_name": "Bikol Central", "max_tokens": 25}, + "bim": {"name": "Bimoba", "native_name": "Bimoba", "max_tokens": 12}, + "bkd": {"name": "Binukid", "native_name": "Binukid", "max_tokens": 12}, + "bjr": {"name": "Binumarien", "native_name": "Binumarien", "max_tokens": 12}, + "bfo": {"name": "Birifor, Malba", "native_name": "Birifor Malba", "max_tokens": 12}, + "biv": {"name": "Birifor, Southern", "native_name": "Birifor Southern", "max_tokens": 25}, + "bib": {"name": "Bisa", "native_name": "Bisa", "max_tokens": 25}, + "bis": {"name": "Bislama", "native_name": "Bislama", "max_tokens": 25}, + "bzi": {"name": "Bisu", "native_name": "Bisu", "max_tokens": 25}, + "bqp": {"name": "Bisã", "native_name": "Bisã", "max_tokens": 25}, + "bpr": {"name": "Blaan, Koronadal", "native_name": "Blaan Koronadal", "max_tokens": 12}, + "bps": {"name": "Blaan, Sarangani", "native_name": "Blaan Sarangani", "max_tokens": 12}, + "bwq": {"name": "Bobo Madaré, Southern", "native_name": "Bobo Madaré Southern", "max_tokens": 25}, + "bdv": {"name": "Bodo Parja", "native_name": "Bodo Parja", "max_tokens": 25}, + "bqc": {"name": "Boko", "native_name": "Boko", "max_tokens": 25}, + "bus": {"name": "Bokobaru", "native_name": "Bokobaru", "max_tokens": 12}, + "bnp": {"name": "Bola", "native_name": "Bola", "max_tokens": 25}, + "bmq": {"name": "Bomu", "native_name": "Bomu", "max_tokens": 25}, + "bdg": {"name": "Bonggi", "native_name": "Bonggi", "max_tokens": 25}, + "boa": {"name": "Bora", "native_name": "Bora", "max_tokens": 25}, + "ksr": {"name": "Borong", "native_name": "Borong", "max_tokens": 25}, + "bor": {"name": "Borôro", "native_name": "Borôro", "max_tokens": 12}, + "bru": {"name": "Bru, Eastern", "native_name": "Bru", "max_tokens": 25}, + "box": {"name": "Buamu", "native_name": "Buamu", "max_tokens": 12}, + "bzh": {"name": "Buang, Mapos", "native_name": "Buang", "max_tokens": 25}, + "bgt": {"name": "Bughotu", "native_name": "Bughotu", "max_tokens": 12}, + "sab": {"name": "Buglere", "native_name": "Buglere", "max_tokens": 25}, + "bul": {"name": "Bulgarian", "native_name": "Български", "max_tokens": 12}, + "bwu": {"name": "Buli", "native_name": "Buli", "max_tokens": 25}, + "bmv": {"name": "Bum", "native_name": "Bum", "max_tokens": 25}, + "mya": {"name": "Burmese", "native_name": "မြန်မာ", "max_tokens": 12}, + "tte": {"name": "Bwanabwana", "native_name": "Bwanabwana", "max_tokens": 12}, + "cjp": {"name": "Cabécar", "native_name": "Cabécar", "max_tokens": 12}, + "cbv": {"name": "Cacua", "native_name": "Cacua", "max_tokens": 25}, + "kaq": {"name": "Capanahua", "native_name": "Capanahua", "max_tokens": 12}, + "cot": {"name": "Caquinte", "native_name": "Caquinte", "max_tokens": 12}, + "cbc": {"name": "Carapana", "native_name": "Carapana", "max_tokens": 25}, + "car": {"name": "Carib", "native_name": "Carib", "max_tokens": 25}, + "cat": {"name": "Catalan", "native_name": "Català", "max_tokens": 12}, + "ceb": {"name": "Cebuano", "native_name": "Cebuano", "max_tokens": 12}, + "cme": {"name": "Cerma", "native_name": "Cerma", "max_tokens": 25}, + "cbi": {"name": "Chachi", "native_name": "Cha’palaa", "max_tokens": 25}, + "ceg": {"name": "Chamacoco", "native_name": "Chamacoco", "max_tokens": 12}, + "cly": {"name": "Chatino, Eastern Highland", "native_name": "Chatino", "max_tokens": 25}, + "cya": {"name": "Chatino, Nopala", "native_name": "Chatino", "max_tokens": 25}, + "che": {"name": "Chechen", "native_name": "Нохчийн", "max_tokens": 12}, + "hne": {"name": "Chhattisgarhi", "native_name": "छत्तीसगढ़ी", "max_tokens": 12}, + "nya": {"name": "Chichewa", "native_name": "Chichewa", "max_tokens": 12}, + "dig": {"name": "Chidigo", "native_name": "Chidigo", "max_tokens": 12}, + "dug": {"name": "Chiduruma", "native_name": "Chiduruma", "max_tokens": 12}, + "bgr": {"name": "Chin, Bawm", "native_name": "Bawm Chin", "max_tokens": 25}, + "cek": {"name": "Chin, Eastern Khumi", "native_name": "Khumi Chin", "max_tokens": 25}, + "cfm": {"name": "Chin, Falam", "native_name": "Falam Chin", "max_tokens": 25}, + "cnh": {"name": "Chin, Hakha", "native_name": "Hakha Chin", "max_tokens": 25}, + "hlt": {"name": "Chin, Matu", "native_name": "Matu Chin", "max_tokens": 25}, + "mwq": {"name": "Chin, Müün", "native_name": "Müün Chin", "max_tokens": 25}, + "ctd": {"name": "Chin, Tedim", "native_name": "Tedim Chin", "max_tokens": 25}, + "tcz": {"name": "Chin, Thado", "native_name": "Thado Chin", "max_tokens": 25}, + "zyp": {"name": "Chin, Zyphe", "native_name": "Zyphe Chin", "max_tokens": 25}, + "cco": {"name": "Chinantec, Comaltepec", "native_name": "Chinantec", "max_tokens": 12}, + "cnl": {"name": "Chinantec, Lalana", "native_name": "Chinantec", "max_tokens": 12}, + "cle": {"name": "Chinantec, Lealao", "native_name": "Chinantec", "max_tokens": 12}, + "chz": {"name": "Chinantec, Ozumacín", "native_name": "Chinantec", "max_tokens": 12}, + "cpa": {"name": "Chinantec, Palantla", "native_name": "Chinantec", "max_tokens": 12}, + "cso": {"name": "Chinantec, Sochiapam", "native_name": "Chinantec", "max_tokens": 12}, + "cnt": {"name": "Chinantec, Tepetotutla", "native_name": "Chinantec", "max_tokens": 12}, + "cuc": {"name": "Chinantec, Usila", "native_name": "Chinantec", "max_tokens": 12}, + "hak": {"name": "Chinese, Hakka", "native_name": "客家話", "max_tokens": 12}, + "nan": {"name": "Chinese, Min Nan", "native_name": "閩南語", "max_tokens": 12}, + "xnj": {"name": "Chingoni", "native_name": "Chingoni", "max_tokens": 25}, + "cap": {"name": "Chipaya", "native_name": "Chipaya", "max_tokens": 25}, + "cax": {"name": "Chiquitano", "native_name": "Chiquitano", "max_tokens": 12}, + "ctg": {"name": "Chittagonian", "native_name": "চাটগাঁইয়া", "max_tokens": 12}, + "ctu": {"name": "Chol", "native_name": "Ch’ol", "max_tokens": 25}, + "chf": {"name": "Chontal, Tabasco", "native_name": "Chontal", "max_tokens": 25}, + "cce": {"name": "Chopi", "native_name": "Chopi", "max_tokens": 25}, + "crt": {"name": "Chorote, Iyojwa’ja", "native_name": "Iyojwa’ja Chorote", "max_tokens": 25}, + "crq": {"name": "Chorote, Iyo’wujwa", "native_name": "Iyo’wujwa Chorote", "max_tokens": 25}, + "cac-dialect_sansebastiáncoatán": {"name": "Chuj - San Sebastián Coatán", "native_name": "Chuj", "max_tokens": 25}, + "cac-dialect_sanmateoixtatán": {"name": "Chuj - San Mateo Ixtatán", "native_name": "Chuj", "max_tokens": 25}, + "ckt": {"name": "Chukchi", "native_name": "Чукотский", "max_tokens": 12}, + "ncu": {"name": "Chumburung", "native_name": "Chumburung", "max_tokens": 12}, + "cdj": {"name": "Churahi", "native_name": "Churahi", "max_tokens": 12}, + "chv": {"name": "Chuvash", "native_name": "Чӑвашла", "max_tokens": 12}, + "caa": {"name": "Ch’orti’", "native_name": "Ch’orti’", "max_tokens": 25}, + "asg": {"name": "Cishingini", "native_name": "Cishingini", "max_tokens": 12}, + "con": {"name": "Cofán", "native_name": "A’ingae", "max_tokens": 25}, + "crn": {"name": "Cora, El Nayar", "native_name": "Naayeri", "max_tokens": 12}, + "cok": {"name": "Cora, Santa Teresa", "native_name": "Náayari", "max_tokens": 12}, + "crk-script_latin": {"name": "Cree, Plains - Latin", "native_name": "Nēhiyawēwin", "max_tokens": 12}, + "crk-script_syllabics": {"name": "Cree, Plains - Syllabsics", "native_name": "ᓀᐦᐃᔭᐍᐏᐣ", "max_tokens": 25}, + "crh": {"name": "Crimean Tatar", "native_name": "Къырымтатарджа", "max_tokens": 12}, + "hrv": {"name": "Croatian", "native_name": "hrvatski", "char_limit": 25}, + "cui": {"name": "Cuiba", "native_name": "Cuiba", "max_tokens": 25}, + "ces": {"name": "Czech", "native_name": "Čeština", "max_tokens": 25}, + "dsh": {"name": "Daasanach", "native_name": "Daasanach", "max_tokens": 12}, + "dbq": {"name": "Daba", "native_name": "Daba", "max_tokens": 25}, + "dga": {"name": "Dagaare, Southern", "native_name": "Dagaare", "max_tokens": 12}, + "dgi": {"name": "Dagara, Northern", "native_name": "Dagara", "max_tokens": 25}, + "dgk": {"name": "Dagba", "native_name": "Dagba", "max_tokens": 25}, + "dnj-dialect_gweetaawueast": {"name": "Dan - Gweetaawueast", "native_name": "Gweetaa Wu East", "max_tokens": 25}, + "dnj-dialect_blowowest": {"name": "Dan - Blowowest", "native_name": "Blowo West", "max_tokens": 25}, + "daa": {"name": "Dangaléat", "native_name": "Dangaléat", "max_tokens": 12}, + "dnt": {"name": "Dani, Mid Grand Valley", "native_name": "Mid Grand Valley Dani", "max_tokens": 25}, + "dnw": {"name": "Dani, Western", "native_name": "Western Dani", "max_tokens": 25}, "dan": {"name": "Danish", "native_name": "Dansk", "char_limit": 192}, - "dar": {"name": "Dargwa", "native_name": "Дарган мез", "max_tokens": 26}, - "tcc": {"name": "Datooga", "native_name": "Datooga", "max_tokens": 26}, - "dwr": {"name": "Dawro", "native_name": "Dawro", "max_tokens": 13}, - "ded": {"name": "Dedua", "native_name": "Dedua", "max_tokens": 26}, - "mzw": {"name": "Deg", "native_name": "Deg", "max_tokens": 26}, - "ntr": {"name": "Delo", "native_name": "Delo", "max_tokens": 26}, - "ddn": {"name": "Dendi", "native_name": "Dendi", "max_tokens": 26}, - "des": {"name": "Desano", "native_name": "Desano", "max_tokens": 26}, - "dso": {"name": "Desiya", "native_name": "Desiya", "max_tokens": 26}, - "nfa": {"name": "Dhao", "native_name": "Dhao", "max_tokens": 13}, - "dhi": {"name": "Dhimal", "native_name": "Dhimal", "max_tokens": 13}, - "gud": {"name": "Dida, Yocoboué", "native_name": "Dida", "max_tokens": 26}, - "did": {"name": "Didinga", "native_name": "Didinga", "max_tokens": 26}, - "mhu": {"name": "Digaro-Mishmi", "native_name": "Digaro-Mishmi", "max_tokens": 26}, - "dip": {"name": "Dinka, Northeastern", "native_name": "Dinka", "max_tokens": 26}, - "dik": {"name": "Dinka, Southwestern", "native_name": "Dinka", "max_tokens": 26}, - "tbz": {"name": "Ditammari", "native_name": "Ditammari", "max_tokens": 13}, - "dts": {"name": "Dogon, Toro So", "native_name": "Dogon", "max_tokens": 26}, - "dos": {"name": "Dogosé", "native_name": "Dogosé", "max_tokens": 26}, - "dgo": {"name": "Dogri", "native_name": "डोगरी", "max_tokens": 13}, - "mvp": {"name": "Duri", "native_name": "Duri", "max_tokens": 26}, - "nld": {"name": "Dutch", "native_name": "Nederlands", "max_tokens": 26}, - "jen": {"name": "Dza", "native_name": "Dza", "max_tokens": 26}, - "dzo": {"name": "Dzongkha", "native_name": "རྫོང་ཁ", "max_tokens": 26}, - "idd": {"name": "Ede Idaca", "native_name": "Ede Idaca", "max_tokens": 26}, - "eka": {"name": "Ekajuk", "native_name": "Ekajuk", "max_tokens": 13}, - "cto": {"name": "Embera Catío", "native_name": "Embera Catío", "max_tokens": 26}, - "emp": {"name": "Emberá, Northern", "native_name": "Emberá", "max_tokens": 13}, - "enx": {"name": "Enxet", "native_name": "Enxet", "max_tokens": 13}, - "sja": {"name": "Epena", "native_name": "Epena", "max_tokens": 26}, - "myv": {"name": "Erzya", "native_name": "Эрзянь", "max_tokens": 13}, - "mcq": {"name": "Ese", "native_name": "Ese", "max_tokens": 26}, - "ese": {"name": "Ese Ejja", "native_name": "Ese Ejja", "max_tokens": 26}, - "est": {"name": "Estonian", "native_name": "Eesti", "max_tokens": 26}, - "evn": {"name": "Evenki", "native_name": "Эвенки", "max_tokens": 13}, - "eza": {"name": "Ezaa", "native_name": "Ezaa", "max_tokens": 26}, - "ewe": {"name": "Éwé", "native_name": "Éwé", "max_tokens": 26}, - "fal": {"name": "Fali, South", "native_name": "Fali", "max_tokens": 26}, - "fao": {"name": "Faroese", "native_name": "Føroyskt", "max_tokens": 13}, - "far": {"name": "Fataleka", "native_name": "Fataleka", "max_tokens": 26}, - "fij": {"name": "Fijian", "native_name": "Na Vosa Vakaviti", "max_tokens": 26}, - "fin": {"name": "Finnish", "native_name": "Suomi", "max_tokens": 26}, - "fon": {"name": "Fon", "native_name": "Fon", "max_tokens": 26}, - "frd": {"name": "Fordata", "native_name": "Fordata", "max_tokens": 26}, - "ful": {"name": "Fulah", "native_name": "Fulfulde", "max_tokens": 13}, - "flr": {"name": "Fuliiru", "native_name": "Fuliiru", "max_tokens": 13}, - "gau": {"name": "Gadaba, Mudhili", "native_name": "Gadaba", "max_tokens": 13}, - "gbk": {"name": "Gaddi", "native_name": "Gaddi", "max_tokens": 26}, - "gag-script_cyrillic": {"name": "Gagauz - Cyrillic", "native_name": "Гагаузча", "max_tokens": 13}, - "gag-script_latin": {"name": "Gagauz - Latin", "native_name": "Gagauz", "max_tokens": 26}, - "gbi": {"name": "Galela", "native_name": "Galela", "max_tokens": 26}, - "gmv": {"name": "Gamo", "native_name": "Gamo", "max_tokens": 26}, - "lug": {"name": "Ganda", "native_name": "Luganda", "max_tokens": 13}, - "pwg": {"name": "Gapapaiwa", "native_name": "Gapapaiwa", "max_tokens": 13}, - "gbm": {"name": "Garhwali", "native_name": "गढ़वाळी", "max_tokens": 13}, - "cab": {"name": "Garifuna", "native_name": "Garifuna", "max_tokens": 13}, - "grt": {"name": "Garo", "native_name": "Garo", "max_tokens": 26}, - "krs": {"name": "Gbaya", "native_name": "Gbaya", "max_tokens": 13}, - "gso": {"name": "Gbaya, Southwest", "native_name": "Gbaya", "max_tokens": 13}, - "nlg": {"name": "Gela", "native_name": "Gela", "max_tokens": 26}, - "gej": {"name": "Gen", "native_name": "Gen", "max_tokens": 26}, - "gri": {"name": "Ghari", "native_name": "Ghari", "max_tokens": 26}, - "kik": {"name": "Gikuyu", "native_name": "Gĩkũyũ", "max_tokens": 13}, - "acd": {"name": "Gikyode", "native_name": "Gikyode", "max_tokens": 13}, - "glk": {"name": "Gilaki", "native_name": "گیلکی", "max_tokens": 13}, - "gof-script_latin": {"name": "Gofa", "native_name": "Gofa", "max_tokens": 26}, - "gog": {"name": "Gogo", "native_name": "Gogo", "max_tokens": 26}, - "gkn": {"name": "Gokana", "native_name": "Gokana", "max_tokens": 26}, - "wsg": {"name": "Gondi, Adilabad", "native_name": "Gondi", "max_tokens": 26}, - "gjn": {"name": "Gonja", "native_name": "Gonja", "max_tokens": 26}, - "gqr": {"name": "Gor", "native_name": "Gor", "max_tokens": 26}, - "gor": {"name": "Gorontalo", "native_name": "Gorontalo", "max_tokens": 13}, - "gux": {"name": "Gourmanchéma", "native_name": "Gourmanchéma", "max_tokens": 13}, - "gbo": {"name": "Grebo, Northern", "native_name": "Grebo", "max_tokens": 13}, - "ell": {"name": "Greek", "native_name": "Ελληνικά", "max_tokens": 13}, - "grc": {"name": "Greek, Ancient", "native_name": "Ἑλληνική", "max_tokens": 26}, - "guh": {"name": "Guahibo", "native_name": "Guahibo", "max_tokens": 13}, - "gub": {"name": "Guajajára", "native_name": "Guajajára", "max_tokens": 13}, - "grn": {"name": "Guarani", "native_name": "Avañe'ẽ", "max_tokens": 26}, - "gyr": {"name": "Guarayu", "native_name": "Guarayu", "max_tokens": 13}, - "guo": {"name": "Guayabero", "native_name": "Guayabero", "max_tokens": 13}, - "gde": {"name": "Gude", "native_name": "Gude", "max_tokens": 26}, - "guj": {"name": "Gujarati", "native_name": "ગુજરાતી", "max_tokens": 26}, - "gvl": {"name": "Gulay", "native_name": "Gulay", "max_tokens": 13}, - "guk": {"name": "Gumuz", "native_name": "Gumuz", "max_tokens": 13}, - "rub": {"name": "Gungu", "native_name": "Gungu", "max_tokens": 26}, - "dah": {"name": "Gwahatike", "native_name": "Gwahatike", "max_tokens": 13}, - "gwr": {"name": "Gwere", "native_name": "Gwere", "max_tokens": 13}, - "gwi": {"name": "Gwich’in", "native_name": "Gwich’in", "max_tokens": 26}, - "hat": {"name": "Haitian Creole", "native_name": "Kreyòl Ayisyen", "max_tokens": 26}, - "hlb": {"name": "Halbi", "native_name": "Halbi", "max_tokens": 26}, - "amf": {"name": "Hamer-Banna", "native_name": "Hamer-Banna", "max_tokens": 26}, - "hag": {"name": "Hanga", "native_name": "Hanga", "max_tokens": 26}, - "hnn": {"name": "Hanunoo", "native_name": "Hanunoo", "max_tokens": 13}, - "bgc": {"name": "Haryanvi", "native_name": "हरियाणवी", "max_tokens": 13}, - "had": {"name": "Hatam", "native_name": "Hatam", "max_tokens": 26}, - "hau": {"name": "Hausa", "native_name": "Hausa", "max_tokens": 26}, - "hwc": {"name": "Hawaii Pidgin", "native_name": "Hawai‘i Creole English", "max_tokens": 26}, - "hvn": {"name": "Hawu", "native_name": "Hawu", "max_tokens": 26}, - "hay": {"name": "Haya", "native_name": "Haya", "max_tokens": 26}, - "xed": {"name": "Hdi", "native_name": "Hdi", "max_tokens": 26}, - "heb": {"name": "Hebrew", "native_name": "עברית", "max_tokens": 26}, - "heh": {"name": "Hehe", "native_name": "Hehe", "max_tokens": 26}, - "hil": {"name": "Hiligaynon", "native_name": "Ilonggo", "max_tokens": 13}, - "hif": {"name": "Hindi, Fiji", "native_name": "फ़िजी हिंदी", "max_tokens": 13}, - "hns": {"name": "Hindustani, Sarnami", "native_name": "सरनामी", "max_tokens": 13}, - "hoc": {"name": "Ho", "native_name": "हो", "max_tokens": 13}, - "hoy": {"name": "Holiya", "native_name": "Holiya", "max_tokens": 26}, - "hus-dialect_westernpotosino": {"name": "Huastec - Western Potosino", "native_name": "Teenek", "max_tokens": 26}, - "hus-dialect_centralveracruz": {"name": "Huastec - Central Veracruz", "native_name": "Teenek", "max_tokens": 26}, - "huv": {"name": "Huave, San Mateo del Mar", "native_name": "Ombeayiüts", "max_tokens": 13}, - "hui": {"name": "Huli", "native_name": "Huli", "max_tokens": 26}, - "hap": {"name": "Hupla", "native_name": "Hupla", "max_tokens": 26}, - "iba": {"name": "Iban", "native_name": "Iban", "max_tokens": 26}, - "isl": {"name": "Icelandic", "native_name": "Íslenska", "max_tokens": 13}, - "dbj": {"name": "Ida’an", "native_name": "Ida’an", "max_tokens": 26}, - "ifa": {"name": "Ifugao, Amganad", "native_name": "Ifugao", "max_tokens": 13}, - "ifb": {"name": "Ifugao, Batad", "native_name": "Ifugao", "max_tokens": 13}, - "ifu": {"name": "Ifugao, Mayoyao", "native_name": "Ifugao", "max_tokens": 13}, - "ifk": {"name": "Ifugao, Tuwali", "native_name": "Ifugao", "max_tokens": 13}, - "ife": {"name": "Ifè", "native_name": "Ifè", "max_tokens": 26}, - "ign": {"name": "Ignaciano", "native_name": "Ignaciano", "max_tokens": 13}, - "ikk": {"name": "Ika", "native_name": "Ika", "max_tokens": 26}, - "iqw": {"name": "Ikwo", "native_name": "Ikwo", "max_tokens": 26}, - "ilb": {"name": "Ila", "native_name": "Ila", "max_tokens": 26}, - "ilo": {"name": "Ilocano", "native_name": "Ilocano", "max_tokens": 13}, - "imo": {"name": "Imbongu", "native_name": "Imbongu", "max_tokens": 13}, - "inb": {"name": "Inga", "native_name": "Inga", "max_tokens": 26}, - "ipi": {"name": "Ipili", "native_name": "Ipili", "max_tokens": 26}, - "irk": {"name": "Iraqw", "native_name": "Iraqw", "max_tokens": 26}, - "gle": {"name": "Irish", "native_name": "Gaeilge", "max_tokens": 26}, - "icr": {"name": "Islander English Creole", "native_name": "Islander Creole", "max_tokens": 26}, - "itv": {"name": "Itawit", "native_name": "Itawit", "max_tokens": 13}, - "itl": {"name": "Itelmen", "native_name": "Itelmen", "max_tokens": 13}, - "atg": {"name": "Ivbie North-Okpela-Arhe", "native_name": "Ivbie North-Okpela-Arhe", "max_tokens": 26}, - "ixl-dialect_sanjuancotzal": {"name": "Ixil - San Juan Cotzal", "native_name": "Ixil", "max_tokens": 13}, - "ixl-dialect_sangasparchajul": {"name": "Ixil - San Gaspar Chajul", "native_name": "Ixil", "max_tokens": 13}, - "ixl-dialect_santamarianebaj": {"name": "Ixil - Santa Maria Nebaj", "native_name": "Ixil", "max_tokens": 13}, - "nca": {"name": "Iyo", "native_name": "Iyo", "max_tokens": 26}, - "izr": {"name": "Izere", "native_name": "Izere", "max_tokens": 26}, - "izz": {"name": "Izii", "native_name": "Izii", "max_tokens": 26}, - "jac": {"name": "Jakalteko", "native_name": "Jakalteko", "max_tokens": 13}, - "jam": {"name": "Jamaican English Creole", "native_name": "Patois", "max_tokens": 26}, - "jvn": {"name": "Javanese, Suriname", "native_name": "Basa Jawa Suriname", "max_tokens": 26}, - "kac": {"name": "Jingpho", "native_name": "Jingpho", "max_tokens": 13}, - "dyo": {"name": "Jola-Fonyi", "native_name": "Joola Foñi", "max_tokens": 13}, - "csk": {"name": "Jola-Kasa", "native_name": "Joola Kasa", "max_tokens": 26}, - "adh": {"name": "Jopadhola", "native_name": "Jopadhola", "max_tokens": 13}, - "jun": {"name": "Juang", "native_name": "Juang", "max_tokens": 26}, - "jbu": {"name": "Jukun Takum", "native_name": "Jukun Takum", "max_tokens": 26}, - "dyu": {"name": "Jula", "native_name": "Julakan", "max_tokens": 26}, - "bex": {"name": "Jur Modo", "native_name": "Jur Modo", "max_tokens": 26}, - "juy": {"name": "Juray", "native_name": "Juray", "max_tokens": 26}, - "gna": {"name": "Kaansa", "native_name": "Kaansa", "max_tokens": 26}, - "urb": {"name": "Kaapor", "native_name": "Kaapor", "max_tokens": 26}, - "kbp": {"name": "Kabiyè", "native_name": "Kabiyè", "max_tokens": 13}, - "cwa": {"name": "Kabwa", "native_name": "Kabwa", "max_tokens": 13}, - "dtp": {"name": "Kadazan Dusun", "native_name": "Kadazan Dusun", "max_tokens": 26}, - "kbr": {"name": "Kafa", "native_name": "Kafa", "max_tokens": 26}, - "cgc": {"name": "Kagayanen", "native_name": "Kagayanen", "max_tokens": 13}, - "kki": {"name": "Kagulu", "native_name": "Kagulu", "max_tokens": 13}, - "kzf": {"name": "Kaili, Da’a", "native_name": "Kaili Da’a", "max_tokens": 26}, - "lew": {"name": "Kaili, Ledo", "native_name": "Kaili Ledo", "max_tokens": 26}, - "cbr": {"name": "Kakataibo-Kashibo", "native_name": "Kakataibo-Kashibo", "max_tokens": 13}, - "kkj": {"name": "Kako", "native_name": "Kako", "max_tokens": 26}, - "keo": {"name": "Kakwa", "native_name": "Kakwa", "max_tokens": 26}, - "kqe": {"name": "Kalagan", "native_name": "Kalagan", "max_tokens": 26}, - "kak": {"name": "Kalanguya", "native_name": "Kalanguya", "max_tokens": 13}, - "kyb": {"name": "Kalinga, Butbut", "native_name": "Kalinga Butbut", "max_tokens": 26}, - "knb": {"name": "Kalinga, Lubuagan", "native_name": "Kalinga Lubuagan", "max_tokens": 13}, - "kmd": {"name": "Kalinga, Majukayang", "native_name": "Kalinga Majukayang", "max_tokens": 13}, - "kml": {"name": "Kalinga, Tanudan", "native_name": "Kalinga Tanudan", "max_tokens": 26}, - "ify": {"name": "Kallahan, Keley-i", "native_name": "Kallahan Keley-i", "max_tokens": 26}, - "xal": {"name": "Kalmyk-Oirat", "native_name": "Хальмг", "max_tokens": 13}, - "kbq": {"name": "Kamano", "native_name": "Kamano", "max_tokens": 26}, - "kay": {"name": "Kamayurá", "native_name": "Kamayurá", "max_tokens": 13}, - "ktb": {"name": "Kambaata", "native_name": "Kambaata", "max_tokens": 13}, - "hig": {"name": "Kamwe", "native_name": "Kamwe", "max_tokens": 13}, - "gam": {"name": "Kandawo", "native_name": "Kandawo", "max_tokens": 13}, - "cbu": {"name": "Kandozi-Chapra", "native_name": "Kandozi-Chapra", "max_tokens": 26}, - "xnr": {"name": "Kangri", "native_name": "Kangri", "max_tokens": 26}, - "kmu": {"name": "Kanite", "native_name": "Kanite", "max_tokens": 26}, - "kne": {"name": "Kankanaey", "native_name": "Kankanaey", "max_tokens": 13}, - "kan": {"name": "Kannada", "native_name": "ಕನ್ನಡ", "max_tokens": 26}, - "kby": {"name": "Kanuri, Manga", "native_name": "Kanuri", "max_tokens": 26}, - "pam": {"name": "Kapampangan", "native_name": "Kapampangan", "max_tokens": 13}, - "cak-dialect_santamaríadejesús": {"name": "Kaqchikel - Santa María de Jesús", "native_name": "Kaqchikel", "max_tokens": 13}, - "cak-dialect_southcentral": {"name": "Kaqchikel - dialect South Central", "native_name": "Kaqchikel", "max_tokens": 13}, - "cak-dialect_yepocapa": {"name": "Kaqchikel - dialect Yepocapa", "native_name": "Kaqchikel", "max_tokens": 13}, - "cak-dialect_western": {"name": "Kaqchikel - dialect Western", "native_name": "Kaqchikel", "max_tokens": 13}, - "cak-dialect_santodomingoxenacoj": {"name": "Kaqchikel - dialect Santo Domingo Xenacoj", "native_name": "Kaqchikel", "max_tokens": 13}, - "cak-dialect_central": {"name": "Kaqchikel - Dialect Central", "native_name": "Kaqchikel", "max_tokens": 13}, - "xrb": {"name": "Karaboro, Eastern", "native_name": "Karaboro", "max_tokens": 26}, - "krc": {"name": "Karachay-Balkar", "native_name": "Къарачай-Малкъар", "max_tokens": 13}, - "kaa": {"name": "Karakalpak", "native_name": "Qaraqalpaq", "max_tokens": 13}, - "krl": {"name": "Karelian", "native_name": "Karjala", "max_tokens": 26}, - "pww": {"name": "Karen, Pwo Northern", "native_name": "Pwo Karen", "max_tokens": 26}, - "xsm": {"name": "Kasem", "native_name": "Kasem", "max_tokens": 26}, - "cbs": {"name": "Kashinawa", "native_name": "Kashinawa", "max_tokens": 13}, - "pss": {"name": "Kaulong", "native_name": "Kaulong", "max_tokens": 13}, - "kxf": {"name": "Kawyaw", "native_name": "Kawyaw", "max_tokens": 13}, - "kyz": {"name": "Kayabí", "native_name": "Kayabí", "max_tokens": 26}, - "kyu": {"name": "Kayah, Western", "native_name": "Kayah", "max_tokens": 26}, - "txu": {"name": "Kayapó", "native_name": "Kayapó", "max_tokens": 13}, - "kaz": {"name": "Kazakh", "native_name": "Қазақ тілі", "max_tokens": 26}, - "ndp": {"name": "Kebu", "native_name": "Kebu", "max_tokens": 26}, - "kbo": {"name": "Keliko", "native_name": "Keliko", "max_tokens": 26}, - "kyq": {"name": "Kenga", "native_name": "Kenga", "max_tokens": 26}, - "ken": {"name": "Kenyang", "native_name": "Kenyang", "max_tokens": 26}, - "ker": {"name": "Kera", "native_name": "Kera", "max_tokens": 26}, - "xte": {"name": "Ketengban", "native_name": "Ketengban", "max_tokens": 13}, - "kyg": {"name": "Keyagana", "native_name": "Keyagana", "max_tokens": 13}, - "kjh": {"name": "Khakas", "native_name": "Хакас тілі", "max_tokens": 26}, - "kca": {"name": "Khanty", "native_name": "Ханты", "max_tokens": 26}, - "khm": {"name": "Khmer", "native_name": "ភាសាខ្មែរ", "max_tokens": 26}, - "kxm": {"name": "Khmer, Northern", "native_name": "ភាសាខ្មែរ, ភាគខាងជើង", "max_tokens": 26}, - "kjg": {"name": "Khmu", "native_name": "ຂະມູ", "max_tokens": 26}, - "nyf": {"name": "Kigiryama", "native_name": "Kigiryama", "max_tokens": 13}, - "kij": {"name": "Kilivila", "native_name": "Kilivila", "max_tokens": 13}, - "kia": {"name": "Kim", "native_name": "Kim", "max_tokens": 26}, - "kqr": {"name": "Kimaragang", "native_name": "Kimaragang", "max_tokens": 13}, - "kqp": {"name": "Kimré", "native_name": "Kimré", "max_tokens": 26}, - "krj": {"name": "Kinaray-a", "native_name": "Kinaray-a", "max_tokens": 26}, - "zga": {"name": "Kinga", "native_name": "Kinga", "max_tokens": 26}, - "kin": {"name": "Kinyarwanda", "native_name": "Ikinyarwanda", "max_tokens": 13}, - "pkb": {"name": "Kipfokomo", "native_name": "Kipfokomo", "max_tokens": 13}, - "geb": {"name": "Kire", "native_name": "Kire", "max_tokens": 26}, - "gil": {"name": "Kiribati", "native_name": "Taetae ni Kiribati", "max_tokens": 26}, - "kje": {"name": "Kisar", "native_name": "Kisar", "max_tokens": 26}, - "kss": {"name": "Kisi, Southern", "native_name": "Kisi", "max_tokens": 26}, - "thk": {"name": "Kitharaka", "native_name": "Kitharaka", "max_tokens": 13}, - "klu": {"name": "Klao", "native_name": "Klao", "max_tokens": 26}, - "kyo": {"name": "Klon", "native_name": "Klon", "max_tokens": 26}, - "kog": {"name": "Kogi", "native_name": "Kogi", "max_tokens": 26}, - "kfb": {"name": "Kolami, Northwestern", "native_name": "Kolami", "max_tokens": 26}, - "kpv": {"name": "Komi-Zyrian", "native_name": "Коми", "max_tokens": 26}, - "bbo": {"name": "Konabéré", "native_name": "Konabéré", "max_tokens": 13}, - "xon": {"name": "Konkomba", "native_name": "Konkomba", "max_tokens": 13}, - "kma": {"name": "Konni", "native_name": "Konni", "max_tokens": 26}, - "kno": {"name": "Kono", "native_name": "Kono", "max_tokens": 26}, - "kxc": {"name": "Konso", "native_name": "Konso", "max_tokens": 13}, - "ozm": {"name": "Koonzime", "native_name": "Koonzime", "max_tokens": 13}, - "kqy": {"name": "Koorete", "native_name": "Koorete", "max_tokens": 13}, - "coe": {"name": "Koreguaje", "native_name": "Koreguaje", "max_tokens": 13}, - "kpq": {"name": "Korupun-Sela", "native_name": "Korupun-Sela", "max_tokens": 26}, - "kpy": {"name": "Koryak", "native_name": "Курил", "max_tokens": 13}, - "kyf": {"name": "Kouya", "native_name": "Kouya", "max_tokens": 26}, - "kff-script_telugu": {"name": "Koya", "native_name": "కోయా", "max_tokens": 13}, - "kri": {"name": "Krio", "native_name": "Krio", "max_tokens": 26}, - "rop": {"name": "Kriol", "native_name": "Kriol", "max_tokens": 26}, - "ktj": {"name": "Krumen, Plapo", "native_name": "Krumen, Plapo", "max_tokens": 26}, - "ted": {"name": "Krumen, Tepo", "native_name": "Krumen, Tepo", "max_tokens": 26}, - "krr": {"name": "Krung", "native_name": "Krung", "max_tokens": 26}, - "kdt": {"name": "Kuay", "native_name": "Kuay", "max_tokens": 26}, - "kez": {"name": "Kukele", "native_name": "Kukele", "max_tokens": 13}, - "cul": {"name": "Kulina", "native_name": "Kulina", "max_tokens": 26}, - "kle": {"name": "Kulung", "native_name": "Kulung", "max_tokens": 26}, - "kdi": {"name": "Kumam", "native_name": "Kumam", "max_tokens": 13}, - "kue": {"name": "Kuman", "native_name": "Kuman", "max_tokens": 26}, - "kum": {"name": "Kumyk", "native_name": "Къумукъ", "max_tokens": 13}, - "kvn": {"name": "Kuna, Border", "native_name": "Kuna, Border", "max_tokens": 26}, - "cuk": {"name": "Kuna, San Blas", "native_name": "Kuna, San Blas", "max_tokens": 26}, - "kdn": {"name": "Kunda", "native_name": "Kunda", "max_tokens": 26}, - "xuo": {"name": "Kuo", "native_name": "Kuo", "max_tokens": 26}, - "key": {"name": "Kupia", "native_name": "Kupia", "max_tokens": 26}, - "kpz": {"name": "Kupsapiiny", "native_name": "Kupsapiiny", "max_tokens": 13}, - "knk": {"name": "Kuranko", "native_name": "Kuranko", "max_tokens": 13}, - "kmr-script_latin": {"name": "Kurdish, Northern - Latin", "native_name": "Kurmancî", "max_tokens": 13}, - "kmr-script_arabic": {"name": "Kurdish, Northern - Arabic", "native_name": "كورمانجي", "max_tokens": 13}, - "kmr-script_cyrillic": {"name": "Kurdish, Northern - Cyrillic", "native_name": "Курманджи", "max_tokens": 13}, - "xua": {"name": "Kurumba, Alu", "native_name": "Kurumba", "max_tokens": 26}, - "kru": {"name": "Kurux", "native_name": "कुड़ुख", "max_tokens": 13}, - "kus": {"name": "Kusaal", "native_name": "Kusaal", "max_tokens": 26}, - "kub": {"name": "Kutep", "native_name": "Kutep", "max_tokens": 13}, - "kdc": {"name": "Kutu", "native_name": "Kutu", "max_tokens": 26}, - "kxv": {"name": "Kuvi", "native_name": "Kuvi", "max_tokens": 26}, - "blh": {"name": "Kuwaa", "native_name": "Kuwaa", "max_tokens": 13}, - "cwt": {"name": "Kuwaataay", "native_name": "Kuwaataay", "max_tokens": 13}, - "kwd": {"name": "Kwaio", "native_name": "Kwaio", "max_tokens": 26}, - "tnk": {"name": "Kwamera", "native_name": "Kwamera", "max_tokens": 26}, - "kwf": {"name": "Kwara’ae", "native_name": "Kwara’ae", "max_tokens": 26}, - "cwe": {"name": "Kwere", "native_name": "Kwere", "max_tokens": 13}, - "kyc": {"name": "Kyaka", "native_name": "Kyaka", "max_tokens": 26}, - "tye": {"name": "Kyanga", "native_name": "Kyanga", "max_tokens": 26}, - "kir": {"name": "Kyrgyz", "native_name": "Кыргызча", "max_tokens": 26}, - "quc-dialect_north": {"name": "K’iche’ - dialect North", "native_name": "K’iche’", "max_tokens": 26}, - "quc-dialect_east": {"name": "K’iche’ - dialect East", "native_name": "K’iche’", "max_tokens": 26}, - "quc-dialect_central": {"name": "K’iche’ - dialect Central", "native_name": "K’iche’", "max_tokens": 26}, - "lac": {"name": "Lacandon", "native_name": "Lacandon", "max_tokens": 13}, - "lsi": {"name": "Lacid", "native_name": "Lacid", "max_tokens": 26}, - "lbj": {"name": "Ladakhi", "native_name": "Ladakhi", "max_tokens": 13}, - "lhu": {"name": "Lahu", "native_name": "Lahu", "max_tokens": 26}, - "las": {"name": "Lama", "native_name": "Lama", "max_tokens": 26}, - "lam": {"name": "Lamba", "native_name": "Lamba", "max_tokens": 26}, - "lns": {"name": "Lamnso’", "native_name": "Lamnso’", "max_tokens": 26}, - "ljp": {"name": "Lampung Api", "native_name": "Lampung Api", "max_tokens": 26}, - "laj": {"name": "Lango", "native_name": "Lango", "max_tokens": 26}, - "lao": {"name": "Lao", "native_name": "ລາວ", "max_tokens": 26}, - "lat": {"name": "Latin", "native_name": "Latina", "max_tokens": 26}, - "lav": {"name": "Latvian", "native_name": "Latviešu", "max_tokens": 13}, - "law": {"name": "Lauje", "native_name": "Lauje", "max_tokens": 26}, - "lcp": {"name": "Lawa, Western", "native_name": "Lawa", "max_tokens": 26}, - "lzz": {"name": "Laz", "native_name": "ლაზური", "max_tokens": 13}, - "lln": {"name": "Lele", "native_name": "Lele", "max_tokens": 26}, - "lef": {"name": "Lelemi", "native_name": "Lelemi", "max_tokens": 13}, - "acf": {"name": "Lesser Antillean French Creole", "native_name": "Kwéyòl", "max_tokens": 13}, - "lww": {"name": "Lewo", "native_name": "Lewo", "max_tokens": 26}, - "mhx": {"name": "Lhao Vo", "native_name": "Lhao Vo", "max_tokens": 26}, - "eip": {"name": "Lik", "native_name": "Lik", "max_tokens": 26}, - "lia": {"name": "Limba, West-Central", "native_name": "Limba", "max_tokens": 26}, - "lif": {"name": "Limbu", "native_name": "ᤕᤠᤰᤌᤢᤱ", "max_tokens": 13}, - "onb": {"name": "Lingao", "native_name": "Lingao", "max_tokens": 26}, - "lis": {"name": "Lisu", "native_name": "ꓡꓲꓢꓳ", "max_tokens": 26}, - "lit": {"name": "Lithuanian", "native_name": "Lietuvių", "max_tokens": 26}, - "loq": {"name": "Lobala", "native_name": "Lobala", "max_tokens": 26}, - "lob": {"name": "Lobi", "native_name": "Lobi", "max_tokens": 26}, - "yaz": {"name": "Lokaa", "native_name": "Lokaa", "max_tokens": 26}, - "lok": {"name": "Loko", "native_name": "Loko", "max_tokens": 26}, - "llg": {"name": "Lole", "native_name": "Lole", "max_tokens": 26}, - "ycl": {"name": "Lolopo", "native_name": "Lolopo", "max_tokens": 13}, - "lom": {"name": "Loma", "native_name": "Loma", "max_tokens": 26}, - "ngl": {"name": "Lomwe", "native_name": "Lomwe", "max_tokens": 13}, - "lon": {"name": "Lomwe, Malawi", "native_name": "Lomwe", "max_tokens": 13}, - "lex": {"name": "Luang", "native_name": "Luang", "max_tokens": 26}, - "lgg": {"name": "Lugbara", "native_name": "Lugbara", "max_tokens": 13}, - "ruf": {"name": "Luguru", "native_name": "Luguru", "max_tokens": 13}, - "dop": {"name": "Lukpa", "native_name": "Lukpa", "max_tokens": 13}, - "lnd": {"name": "Lundayeh", "native_name": "Lundayeh", "max_tokens": 13}, - "ndy": {"name": "Lutos", "native_name": "Lutos", "max_tokens": 26}, - "lwo": {"name": "Luwo", "native_name": "Luwo", "max_tokens": 26}, - "lee": {"name": "Lyélé", "native_name": "Lyélé", "max_tokens": 13}, - "mev": {"name": "Maan", "native_name": "Maan", "max_tokens": 26}, - "mfz": {"name": "Mabaan", "native_name": "Mabaan", "max_tokens": 26}, - "jmc": {"name": "Machame", "native_name": "Machame", "max_tokens": 26}, - "myy": {"name": "Macuna", "native_name": "Macuna", "max_tokens": 26}, - "mbc": {"name": "Macushi", "native_name": "Macushi", "max_tokens": 13}, - "mda": {"name": "Mada", "native_name": "Mada", "max_tokens": 26}, - "mad": {"name": "Madura", "native_name": "Madura", "max_tokens": 26}, - "mag": {"name": "Magahi", "native_name": "Magahi", "max_tokens": 26}, - "ayz": {"name": "Mai Brat", "native_name": "Mai Brat", "max_tokens": 26}, - "mai": {"name": "Maithili", "native_name": "मैथिली", "max_tokens": 13}, - "mca": {"name": "Maka", "native_name": "Maka", "max_tokens": 26}, - "mcp": {"name": "Makaa", "native_name": "Makaa", "max_tokens": 26}, - "mak": {"name": "Makasar", "native_name": "Makasar", "max_tokens": 26}, - "vmw": {"name": "Makhuwa", "native_name": "Makhuwa", "max_tokens": 13}, - "mgh": {"name": "Makhuwa-Meetto", "native_name": "Makhuwa-Meetto", "max_tokens": 26}, - "kde": {"name": "Makonde", "native_name": "Makonde", "max_tokens": 13}, - "mlg": {"name": "Malagasy", "native_name": "Malagasy", "max_tokens": 26}, - "zlm": {"name": "Malay", "native_name": "Bahasa Melayu", "max_tokens": 26}, - "pse": {"name": "Malay, Central", "native_name": "Bahasa Melayu Tengah", "max_tokens": 26}, - "mkn": {"name": "Malay, Kupang", "native_name": "Bahasa Melayu Kupang", "max_tokens": 26}, - "xmm": {"name": "Malay, Manado", "native_name": "Bahasa Melayu Manado", "max_tokens": 26}, - "mal": {"name": "Malayalam", "native_name": "മലയാളം", "max_tokens": 13}, - "xdy": {"name": "Malayic Dayak", "native_name": "Dayak Melayu", "max_tokens": 26}, - "div": {"name": "Maldivian", "native_name": "ދިވެހި", "max_tokens": 13}, - "mdy": {"name": "Male", "native_name": "Male", "max_tokens": 26}, - "mlt": {"name": "Maltese", "native_name": "Malti", "max_tokens": 26}, - "mup": {"name": "Malvi", "native_name": "Malvi", "max_tokens": 26}, - "mam-dialect_central": {"name": "Mam - dialect Central", "native_name": "Mam", "max_tokens": 26}, - "mam-dialect_northern": {"name": "Mam - dialect Northern", "native_name": "Mam", "max_tokens": 26}, - "mam-dialect_southern": {"name": "Mam - dialect Southern", "native_name": "Mam", "max_tokens": 26}, - "mam-dialect_western": {"name": "Mam - dialect Western", "native_name": "Mam", "max_tokens": 26}, - "mqj": {"name": "Mamasa", "native_name": "Mamasa", "max_tokens": 26}, - "mcu": {"name": "Mambila, Cameroon", "native_name": "Mambila", "max_tokens": 13}, - "mzk": {"name": "Mambila, Nigeria", "native_name": "Mambila", "max_tokens": 13}, - "maw": {"name": "Mampruli", "native_name": "Mampruli", "max_tokens": 13}, - "mjl": {"name": "Mandeali", "native_name": "Mandeali", "max_tokens": 13}, - "mnk": {"name": "Mandinka", "native_name": "Mandinka", "max_tokens": 13}, - "mge": {"name": "Mango", "native_name": "Mango", "max_tokens": 26}, - "mbh": {"name": "Mangseng", "native_name": "Mangseng", "max_tokens": 13}, - "knf": {"name": "Mankanya", "native_name": "Mankanya", "max_tokens": 13}, - "mjv": {"name": "Mannan", "native_name": "Mannan", "max_tokens": 26}, - "mbt": {"name": "Manobo, Matigsalug", "native_name": "Manobo", "max_tokens": 13}, - "obo": {"name": "Manobo, Obo", "native_name": "Manobo", "max_tokens": 13}, - "mbb": {"name": "Manobo, Western Bukidnon", "native_name": "Manobo", "max_tokens": 13}, - "mzj": {"name": "Manya", "native_name": "Manya", "max_tokens": 26}, - "sjm": {"name": "Mapun", "native_name": "Mapun", "max_tokens": 26}, - "mrw": {"name": "Maranao", "native_name": "Maranao", "max_tokens": 13}, - "mar": {"name": "Marathi", "native_name": "मराठी", "max_tokens": 26}, - "mpg": {"name": "Marba", "native_name": "Marba", "max_tokens": 26}, - "mhr": {"name": "Mari, Meadow", "native_name": "Марий", "max_tokens": 26}, - "enb": {"name": "Markweeta", "native_name": "Markweeta", "max_tokens": 13}, - "mah": {"name": "Marshallese", "native_name": "Kajin M̧ajeļ", "max_tokens": 13}, - "myx": {"name": "Masaaba", "native_name": "Masaaba", "max_tokens": 26}, - "klv": {"name": "Maskelynes", "native_name": "Maskelynes", "max_tokens": 13}, - "mfh": {"name": "Matal", "native_name": "Matal", "max_tokens": 26}, - "met": {"name": "Mato", "native_name": "Mato", "max_tokens": 26}, - "mcb": {"name": "Matsigenka", "native_name": "Matsigenka", "max_tokens": 13}, - "mop": {"name": "Maya, Mopán", "native_name": "Mopán", "max_tokens": 26}, - "yua": {"name": "Maya, Yucatec", "native_name": "Yucateco", "max_tokens": 13}, - "mfy": {"name": "Mayo", "native_name": "Mayo", "max_tokens": 26}, - "maz": {"name": "Mazahua, Central", "native_name": "Mazahua", "max_tokens": 13}, - "vmy": {"name": "Mazatec, Ayautla", "native_name": "Ayautla", "max_tokens": 13}, - "maq": {"name": "Mazatec, Chiquihuitlán", "native_name": "Chiquihuitlán", "max_tokens": 13}, - "mzi": {"name": "Mazatec, Ixcatlán", "native_name": "Ixcatlán", "max_tokens": 13}, - "maj": {"name": "Mazatec, Jalapa de Díaz", "native_name": "Jalapa de Díaz", "max_tokens": 26}, - "maa-dialect_sanantonio": {"name": "Mazatec, San Jerónimo Tecóatl - dialect San Antonio", "native_name": "San Jerónimo Tecóatl", "max_tokens": 26}, - "maa-dialect_sanjerónimo": {"name": "Mazatec, San Jerónimo Tecóatl - dialect San Jerónimo", "native_name": "San Jerónimo Tecóatl", "max_tokens": 26}, - "mhy": {"name": "Ma’anyan", "native_name": "Ma’anyan", "max_tokens": 26}, - "mhi": {"name": "Ma’di", "native_name": "Ma’di", "max_tokens": 26}, - "zmz": {"name": "Mbandja", "native_name": "Mbandja", "max_tokens": 13}, - "myb": {"name": "Mbay", "native_name": "Mbay", "max_tokens": 26}, - "gai": {"name": "Mbore", "native_name": "Mbore", "max_tokens": 26}, - "mqb": {"name": "Mbuko", "native_name": "Mbuko", "max_tokens": 13}, - "mbu": {"name": "Mbula-Bwazza", "native_name": "Mbula-Bwazza", "max_tokens": 26}, - "med": {"name": "Melpa", "native_name": "Melpa", "max_tokens": 26}, - "men": {"name": "Mende", "native_name": "Mende", "max_tokens": 26}, - "mee": {"name": "Mengen", "native_name": "Mengen", "max_tokens": 26}, - "mwv": {"name": "Mentawai", "native_name": "Mentawai", "max_tokens": 13}, - "meq": {"name": "Merey", "native_name": "Merey", "max_tokens": 26}, - "zim": {"name": "Mesme", "native_name": "Mesme", "max_tokens": 26}, - "mgo": {"name": "Meta’", "native_name": "Meta’", "max_tokens": 26}, - "mej": {"name": "Meyah", "native_name": "Meyah", "max_tokens": 26}, - "mpp": {"name": "Migabac", "native_name": "Migabac", "max_tokens": 13}, - "min": {"name": "Minangkabau", "native_name": "Minangkabau", "max_tokens": 13}, - "gum": {"name": "Misak", "native_name": "Misak", "max_tokens": 26}, - "mpx": {"name": "Misima-Panaeati", "native_name": "Misima-Panaeati", "max_tokens": 26}, - "mco": {"name": "Mixe, Coatlán", "native_name": "Coatlán", "max_tokens": 13}, - "mxq": {"name": "Mixe, Juquila", "native_name": "Juquila", "max_tokens": 26}, - "pxm": {"name": "Mixe, Quetzaltepec", "native_name": "Mixe, Quetzaltepec", "max_tokens": 13}, - "mto": {"name": "Mixe, Totontepec", "native_name": "Mixe, Totontepec", "max_tokens": 26}, - "mim": {"name": "Mixtec, Alacatlatzala", "native_name": "Mixtec, Alacatlatzala", "max_tokens": 13}, - "xta": {"name": "Mixtec, Alcozauca", "native_name": "Mixtec, Alcozauca", "max_tokens": 13}, - "mbz": {"name": "Mixtec, Amoltepec", "native_name": "Mixtec, Amoltepec", "max_tokens": 13}, - "mip": {"name": "Mixtec, Apasco-Apoala", "native_name": "Mixtec, Apasco-Apoala", "max_tokens": 26}, - "mib": {"name": "Mixtec, Atatlahuca", "native_name": "Mixtec, Atatlahuca", "max_tokens": 13}, - "miy": {"name": "Mixtec, Ayutla", "native_name": "Mixtec, Ayutla", "max_tokens": 26}, - "mih": {"name": "Mixtec, Chayuco", "native_name": "Mixtec, Chayuco", "max_tokens": 26}, - "miz": {"name": "Mixtec, Coatzospan", "native_name": "Mixtec, Coatzospan", "max_tokens": 13}, - "xtd": {"name": "Mixtec, Diuxi-Tilantongo", "native_name": "Mixtec, Diuxi-Tilantongo", "max_tokens": 26}, - "mxt": {"name": "Mixtec, Jamiltepec", "native_name": "Mixtec, Jamiltepec", "max_tokens": 13}, - "xtm": {"name": "Mixtec, Magdalena Peñasco", "native_name": "Mixtec, Magdalena Peñasco", "max_tokens": 26}, - "mxv": {"name": "Mixtec, Metlatónoc", "native_name": "Mixtec, Metlatónoc", "max_tokens": 13}, - "xtn": {"name": "Mixtec, Northern Tlaxiaco", "native_name": "Mixtec, Northern Tlaxiaco", "max_tokens": 26}, - "mie": {"name": "Mixtec, Ocotepec", "native_name": "Mixtec, Ocotepec", "max_tokens": 26}, - "mil": {"name": "Mixtec, Peñoles", "native_name": "Mixtec, Peñoles", "max_tokens": 26}, - "mio": {"name": "Mixtec, Pinotepa Nacional", "native_name": "Mixtec, Pinotepa Nacional", "max_tokens": 26}, - "mdv": {"name": "Mixtec, Santa Lucía Monteverde", "native_name": "Mixtec, Santa Lucía Monteverde", "max_tokens": 26}, - "mza": {"name": "Mixtec, Santa María Zacatepec", "native_name": "Mixtec, Santa María Zacatepec", "max_tokens": 26}, - "mit": {"name": "Mixtec, Southern Puebla", "native_name": "Mixtec, Southern Puebla", "max_tokens": 26}, - "mxb": {"name": "Mixtec, Tezoatlán", "native_name": "Mixtec, Tezoatlán", "max_tokens": 13}, - "mpm": {"name": "Mixtec, Yosondúa", "native_name": "Mixtec, Yosondúa", "max_tokens": 13}, - "soy": {"name": "Miyobe", "native_name": "Miyobe", "max_tokens": 13}, - "cmo-script_latin": {"name": "Mnong, Central - Latin", "native_name": "Mnong, Central", "max_tokens": 26}, - "cmo-script_khmer": {"name": "Mnong, Central - Khmer", "native_name": "Mnong, Central", "max_tokens": 26}, - "mfq": {"name": "Moba", "native_name": "Moba", "max_tokens": 26}, - "old": {"name": "Mochi", "native_name": "Mochi", "max_tokens": 26}, - "mfk": {"name": "Mofu, North", "native_name": "Mofu, North", "max_tokens": 26}, - "mif": {"name": "Mofu-Gudur", "native_name": "Mofu-Gudur", "max_tokens": 26}, - "mkl": {"name": "Mokole", "native_name": "Mokole", "max_tokens": 26}, - "mox": {"name": "Molima", "native_name": "Molima", "max_tokens": 26}, - "myl": {"name": "Moma", "native_name": "Moma", "max_tokens": 26}, - "mqf": {"name": "Momuna", "native_name": "Momuna", "max_tokens": 13}, - "mnw": {"name": "Mon", "native_name": "မွန်", "max_tokens": 13}, - "mon": {"name": "Mongolian", "native_name": "Монгол", "max_tokens": 26}, - "mog": {"name": "Mongondow", "native_name": "Mongondow", "max_tokens": 13}, - "mfe": {"name": "Morisyen", "native_name": "Morisyen", "max_tokens": 26}, - "mor": {"name": "Moro", "native_name": "Moro", "max_tokens": 26}, - "mqn": {"name": "Moronene", "native_name": "Moronene", "max_tokens": 26}, - "mgd": {"name": "Moru", "native_name": "Moru", "max_tokens": 26}, - "mtj": {"name": "Moskona", "native_name": "Moskona", "max_tokens": 13}, - "cmr": {"name": "Mro-Khimi", "native_name": "Mro-Khimi", "max_tokens": 26}, - "mtd": {"name": "Mualang", "native_name": "Mualang", "max_tokens": 26}, - "bmr": {"name": "Muinane", "native_name": "Muinane", "max_tokens": 13}, - "moz": {"name": "Mukulu", "native_name": "Mukulu", "max_tokens": 13}, - "mzm": {"name": "Mumuye", "native_name": "Mumuye", "max_tokens": 13}, - "mnb": {"name": "Muna", "native_name": "Muna", "max_tokens": 26}, - "mnf": {"name": "Mundani", "native_name": "Mundani", "max_tokens": 13}, - "unr": {"name": "Mundari", "native_name": "Mundari", "max_tokens": 13}, - "fmu": {"name": "Muria, Far Western", "native_name": "Muria, Far Western", "max_tokens": 26}, - "mur": {"name": "Murle", "native_name": "Murle", "max_tokens": 26}, - "tih": {"name": "Murut, Timugon", "native_name": "Murut, Timugon", "max_tokens": 26}, - "muv": {"name": "Muthuvan", "native_name": "Muthuvan", "max_tokens": 13}, - "muy": {"name": "Muyang", "native_name": "Muyang", "max_tokens": 26}, - "sur": {"name": "Mwaghavul", "native_name": "Mwaghavul", "max_tokens": 13}, - "moa": {"name": "Mwan", "native_name": "Mwan", "max_tokens": 26}, - "wmw": {"name": "Mwani", "native_name": "Mwani", "max_tokens": 26}, - "tnr": {"name": "Ménik", "native_name": "Ménik", "max_tokens": 13}, - "miq": {"name": "Mískito", "native_name": "Mískito", "max_tokens": 13}, - "mos": {"name": "Mòoré", "native_name": "Mòoré", "max_tokens": 13}, - "muh": {"name": "Mündü", "native_name": "Mündü", "max_tokens": 13}, - "nas": {"name": "Naasioi", "native_name": "Naasioi", "max_tokens": 13}, - "mbj": {"name": "Nadëb", "native_name": "Nadëb", "max_tokens": 13}, - "nfr": {"name": "Nafaanra", "native_name": "Nafaanra", "max_tokens": 13}, - "kfw": {"name": "Naga, Kharam", "native_name": "Naga, Kharam", "max_tokens": 26}, - "nst": {"name": "Naga, Tangshang", "native_name": "Naga, Tangshang", "max_tokens": 26}, - "nag": {"name": "Nagamese", "native_name": "Nagamese", "max_tokens": 13}, - "nch": {"name": "Nahuatl, Central Huasteca", "native_name": "Nāhuatl Central Huasteca", "max_tokens": 13}, - "nhe": {"name": "Nahuatl, Eastern Huasteca", "native_name": "Nāhuatl Eastern Huastec", "max_tokens": 13}, - "ngu": {"name": "Nahuatl, Guerrero", "native_name": "Nāhuatl Guerrero", "max_tokens": 13}, - "azz": {"name": "Nahuatl, Highland Puebla", "native_name": "Nāhuatl Puebla Alta", "max_tokens": 26}, - "nhx": {"name": "Nahuatl, Isthmus-Mecayapan", "native_name": "Nāhuatl Istmo Mecayapan", "max_tokens": 13}, - "ncl": {"name": "Nahuatl, Michoacán", "native_name": "Nāhuatl Michoacán", "max_tokens": 13}, - "nhy": {"name": "Nahuatl, Northern Oaxaca", "native_name": "Nāhuatl Oaxaca Norte", "max_tokens": 26}, - "ncj": {"name": "Nahuatl, Northern Puebla", "native_name": "Nāhuatl Puebla Norte", "max_tokens": 26}, - "nsu": {"name": "Nahuatl, Sierra Negra", "native_name": "Nāhuatl Sierra Negra", "max_tokens": 26}, - "npl": {"name": "Nahuatl, Southeastern Puebla", "native_name": "Nāhuatl Sureste Puebla", "max_tokens": 13}, - "nuz": {"name": "Nahuatl, Tlamacazapa", "native_name": "Nāhuatl Tlamacazapa", "max_tokens": 13}, - "nhw": {"name": "Nahuatl, Western Huasteca", "native_name": "Nahuatl, Western Huasteca", "max_tokens": 26}, - "nhi": {"name": "Nahuatl, Zacatlán-Ahuacatlán-Tepetzintla", "native_name": "Nāhuatl Zacatlán-Ahuacatlán-Tepetzintla", "max_tokens": 13}, - "nlc": {"name": "Nalca", "native_name": "Nalca", "max_tokens": 26}, - "nab": {"name": "Nambikuára, Southern", "native_name": "Nambikuára Meridional", "max_tokens": 13}, - "gld": {"name": "Nanai", "native_name": "Нанай", "max_tokens": 26}, - "nnb": {"name": "Nande", "native_name": "Nande", "max_tokens": 26}, - "npy": {"name": "Napu", "native_name": "Napu", "max_tokens": 26}, - "pbb": {"name": "Nasa", "native_name": "Nasa Yuwe", "max_tokens": 26}, - "ntm": {"name": "Nateni", "native_name": "Nateni", "max_tokens": 26}, - "nmz": {"name": "Nawdm", "native_name": "Nawdm", "max_tokens": 13}, - "naw": {"name": "Nawuri", "native_name": "Nawuri", "max_tokens": 13}, - "nxq": {"name": "Naxi", "native_name": "纳西语", "max_tokens": 13}, - "ndj": {"name": "Ndamba", "native_name": "Ndamba", "max_tokens": 13}, - "ndz": {"name": "Ndogo", "native_name": "Ndogo", "max_tokens": 26}, - "ndv": {"name": "Ndut", "native_name": "Ndut", "max_tokens": 13}, - "new": {"name": "Newar", "native_name": "नेपाल भाषा", "max_tokens": 13}, - "nij": {"name": "Ngaju", "native_name": "Ngaju", "max_tokens": 26}, - "sba": {"name": "Ngambay", "native_name": "Ngambay", "max_tokens": 13}, - "gng": {"name": "Ngangam", "native_name": "Ngangam", "max_tokens": 13}, - "nga": {"name": "Ngbaka", "native_name": "Ngbaka", "max_tokens": 13}, - "nnq": {"name": "Ngindo", "native_name": "Ngindo", "max_tokens": 26}, - "ngp": {"name": "Ngulu", "native_name": "Ngulu", "max_tokens": 26}, - "gym": {"name": "Ngäbere", "native_name": "Ngäbere", "max_tokens": 13}, - "kdj": {"name": "Ng’akarimojong", "native_name": "Ng’akarimojong", "max_tokens": 26}, - "nia": {"name": "Nias", "native_name": "Nias", "max_tokens": 26}, - "nim": {"name": "Nilamba", "native_name": "Nilamba", "max_tokens": 13}, - "nin": {"name": "Ninzo", "native_name": "Ninzo", "max_tokens": 26}, - "nko": {"name": "Nkonya", "native_name": "Nkonya", "max_tokens": 13}, - "nog": {"name": "Nogai", "native_name": "Nogai", "max_tokens": 26}, - "lem": {"name": "Nomaande", "native_name": "Nomaande", "max_tokens": 13}, - "not": {"name": "Nomatsigenga", "native_name": "Nomatsigenga", "max_tokens": 13}, - "nhu": {"name": "Noone", "native_name": "Noone", "max_tokens": 26}, - "nob": {"name": "Norwegian Bokmål", "native_name": "norsk bokmål", "max_tokens": 26}, - "bud": {"name": "Ntcham", "native_name": "Ntcham", "max_tokens": 13}, - "nus": {"name": "Nuer", "native_name": "Nuer", "max_tokens": 26}, - "yas": {"name": "Nugunu", "native_name": "Nugunu", "max_tokens": 13}, - "nnw": {"name": "Nuni, Southern", "native_name": "Nuni, Southern", "max_tokens": 26}, - "nwb": {"name": "Nyabwa", "native_name": "Nyabwa", "max_tokens": 13}, - "nyy": {"name": "Nyakyusa-Ngonde", "native_name": "Nyakyusa-Ngonde", "max_tokens": 26}, - "nyn": {"name": "Nyankore", "native_name": "Nyankore", "max_tokens": 13}, - "rim": {"name": "Nyaturu", "native_name": "Nyaturu", "max_tokens": 13}, - "lid": {"name": "Nyindrou", "native_name": "Nyindrou", "max_tokens": 13}, - "nuj": {"name": "Nyole", "native_name": "Nyole", "max_tokens": 26}, - "nyo": {"name": "Nyoro", "native_name": "Nyoro", "max_tokens": 26}, - "nzi": {"name": "Nzema", "native_name": "Nzema", "max_tokens": 13}, - "ann": {"name": "Obolo", "native_name": "Obolo", "max_tokens": 26}, - "ory": {"name": "Odia", "native_name": "ଓଡ଼ିଆ", "max_tokens": 13}, - "ojb-script_latin": {"name": "Ojibwa, Northwestern - Latin", "native_name": "Ojibwa", "max_tokens": 13}, - "ojb-script_syllabics": {"name": "Ojibwa, Northwestern - Syllabics", "native_name": "ᐊᒋᒧᐎᓐ", "max_tokens": 26}, - "oku": {"name": "Oku", "native_name": "Oku", "max_tokens": 26}, - "bsc": {"name": "Oniyan", "native_name": "Oniyan", "max_tokens": 26}, - "bdu": {"name": "Oroko", "native_name": "Oroko", "max_tokens": 26}, - "orm": {"name": "Oromo", "native_name": "Oromoo", "max_tokens": 13}, - "ury": {"name": "Orya", "native_name": "Orya", "max_tokens": 26}, - "oss": {"name": "Ossetic", "native_name": "Ирон", "max_tokens": 26}, - "ote": {"name": "Otomi, Mezquital", "native_name": "Hñähñu", "max_tokens": 13}, - "otq": {"name": "Otomi, Querétaro", "native_name": "Ñañhö", "max_tokens": 13}, - "stn": {"name": "Owa", "native_name": "Owa", "max_tokens": 26}, - "sig": {"name": "Paasaal", "native_name": "Paasaal", "max_tokens": 13}, - "kfx": {"name": "Pahari, Kullu", "native_name": "कुल्लू पहाड़ी", "max_tokens": 13}, - "bfz": {"name": "Pahari, Mahasu", "native_name": "महासू पहाड़ी", "max_tokens": 13}, - "sey": {"name": "Paicoca", "native_name": "Paicoca", "max_tokens": 13}, - "pao": {"name": "Paiute, Northern", "native_name": "Numu", "max_tokens": 26}, - "pau": {"name": "Palauan", "native_name": "Palauan", "max_tokens": 26}, - "pce": {"name": "Palaung, Ruching", "native_name": "Ruching", "max_tokens": 13}, - "plw": {"name": "Palawano, Brooke’s Point", "native_name": "Palawano", "max_tokens": 13}, - "pmf": {"name": "Pamona", "native_name": "Pamona", "max_tokens": 26}, - "pag": {"name": "Pangasinan", "native_name": "Pangasinan", "max_tokens": 13}, - "pap": {"name": "Papiamentu", "native_name": "Papiamentu", "max_tokens": 13}, - "prf": {"name": "Paranan", "native_name": "Paranan", "max_tokens": 26}, - "pab": {"name": "Parecís", "native_name": "Haliti", "max_tokens": 26}, - "pbi": {"name": "Parkwa", "native_name": "Parkwa", "max_tokens": 26}, - "pbc": {"name": "Patamona", "native_name": "Patamona", "max_tokens": 13}, - "pad": {"name": "Paumarí", "native_name": "Paumarí", "max_tokens": 13}, - "ata": {"name": "Pele-Ata", "native_name": "Pele-Ata", "max_tokens": 26}, - "pez": {"name": "Penan, Eastern", "native_name": "Penan", "max_tokens": 26}, - "peg": {"name": "Pengo", "native_name": "Pengo", "max_tokens": 26}, - "pcm": {"name": "Pidgin, Nigerian", "native_name": "Naijá", "max_tokens": 13}, - "pis": {"name": "Pijin", "native_name": "Pijin", "max_tokens": 26}, - "pny": {"name": "Pinyin", "native_name": "Pinyin", "max_tokens": 26}, - "pir": {"name": "Piratapuyo", "native_name": "Piratapuyo", "max_tokens": 13}, - "pjt": {"name": "Pitjantjatjara", "native_name": "Pitjantjatjara", "max_tokens": 13}, - "poy": {"name": "Pogolo", "native_name": "Pogolo", "max_tokens": 13}, - "pps": {"name": "Popoloca, San Luís Temalacayuca", "native_name": "Popoloca de San Luís Temalacayuca", "max_tokens": 26}, - "pls": {"name": "Popoloca, San Marcos Tlacoyalco", "native_name": "Popoloca de San Marcos Tlacoyalco", "max_tokens": 26}, - "poi": {"name": "Popoluca, Highland", "native_name": "Popoluca de la Sierra", "max_tokens": 26}, - "poh-dialect_eastern": {"name": "Poqomchi’ - dialect Eastern", "native_name": "Poqomchi’", "max_tokens": 13}, - "poh-dialect_western": {"name": "Poqomchi’ - dialect Western", "native_name": "Poqomchi’", "max_tokens": 13}, - "prt": {"name": "Prai", "native_name": "Prai", "max_tokens": 26}, - "pui": {"name": "Puinave", "native_name": "Puinave", "max_tokens": 13}, - "pan": {"name": "Punjabi, Eastern", "native_name": "ਪੰਜਾਬੀ", "max_tokens": 13}, - "tsz": {"name": "Purepecha", "native_name": "Purépecha", "max_tokens": 13}, - "suv": {"name": "Puroik", "native_name": "Puroik", "max_tokens": 13}, - "lme": {"name": "Pévé", "native_name": "Pévé", "max_tokens": 13}, - "quy": {"name": "Quechua, Ayacucho", "native_name": "Runasimi", "max_tokens": 13}, - "qvc": {"name": "Quechua, Cajamarca", "native_name": "Runasimi", "max_tokens": 13}, - "quz": {"name": "Quechua, Cusco", "native_name": "Runasimi", "max_tokens": 13}, - "qve": {"name": "Quechua, Eastern Apurímac", "native_name": "Runasimi", "max_tokens": 13}, - "qub": {"name": "Quechua, Huallaga", "native_name": "Runasimi", "max_tokens": 13}, - "qvh": {"name": "Quechua, Huamalíes-Dos de Mayo Huánuco", "native_name": "Runasimi", "max_tokens": 13}, - "qwh": {"name": "Quechua, Huaylas Ancash", "native_name": "Runasimi", "max_tokens": 13}, - "qvw": {"name": "Quechua, Huaylla Wanca", "native_name": "Runasimi", "max_tokens": 13}, - "quf": {"name": "Quechua, Lambayeque", "native_name": "Runasimi", "max_tokens": 13}, - "qvm": {"name": "Quechua, Margos-Yarowilca-Lauricocha", "native_name": "Runasimi", "max_tokens": 13}, - "qul": {"name": "Quechua, North Bolivian", "native_name": "Runasimi", "max_tokens": 13}, - "qvn": {"name": "Quechua, North Junín", "native_name": "Runasimi", "max_tokens": 13}, - "qxn": {"name": "Quechua, Northern Conchucos Ancash", "native_name": "Runasimi", "max_tokens": 13}, - "qxh": {"name": "Quechua, Panao", "native_name": "Runasimi", "max_tokens": 13}, - "qvs": {"name": "Quechua, San Martín", "native_name": "Runasimi", "max_tokens": 13}, - "quh": {"name": "Quechua, South Bolivian", "native_name": "Runasimi", "max_tokens": 13}, - "qxo": {"name": "Quechua, Southern Conchucos", "native_name": "Runasimi", "max_tokens": 13}, - "qxr": {"name": "Quichua, Cañar Highland", "native_name": "Runasimi", "max_tokens": 13}, - "qvo": {"name": "Quichua, Napo", "native_name": "Runasimi", "max_tokens": 13}, - "qvz": {"name": "Quichua, Northern Pastaza", "native_name": "Runasimi", "max_tokens": 13}, - "qxl": {"name": "Quichua, Salasaca Highland", "native_name": "Runasimi", "max_tokens": 13}, - "quw": {"name": "Quichua, Tena Lowland", "native_name": "Runasimi", "max_tokens": 13}, - "kjb": {"name": "Q’anjob’al", "native_name": "Q’anjob’al", "max_tokens": 26}, - "kek": {"name": "Q’eqchi’", "native_name": "Q’eqchi’", "max_tokens": 26}, - "rah": {"name": "Rabha", "native_name": "Rabha", "max_tokens": 13}, - "rjs": {"name": "Rajbanshi", "native_name": "Rajbanshi", "max_tokens": 13}, - "rai": {"name": "Ramoaaina", "native_name": "Ramoaaina", "max_tokens": 13}, - "lje": {"name": "Rampi", "native_name": "Rampi", "max_tokens": 26}, - "rnl": {"name": "Ranglong", "native_name": "Ranglong", "max_tokens": 26}, - "rkt": {"name": "Rangpuri", "native_name": "Rangpuri", "max_tokens": 26}, - "rap": {"name": "Rapa Nui", "native_name": "Rapa Nui", "max_tokens": 26}, - "yea": {"name": "Ravula", "native_name": "Ravula", "max_tokens": 13}, - "raw": {"name": "Rawang", "native_name": "Rawang", "max_tokens": 26}, - "rej": {"name": "Rejang", "native_name": "Rejang", "max_tokens": 26}, - "rel": {"name": "Rendille", "native_name": "Rendille", "max_tokens": 13}, - "ril": {"name": "Riang Lang", "native_name": "Riang Lang", "max_tokens": 26}, - "iri": {"name": "Rigwe", "native_name": "Rigwe", "max_tokens": 13}, - "rgu": {"name": "Rikou", "native_name": "Rikou", "max_tokens": 13}, - "rhg": {"name": "Rohingya", "native_name": "Ruáingga", "max_tokens": 13}, - "rmc-script_latin": {"name": "Romani, Carpathian - Latin", "native_name": "Romani Čhib", "max_tokens": 26}, - "rmc-script_cyrillic": {"name": "Romani, Carpathian - Cyrillic", "native_name": "Романи Чхиб", "max_tokens": 13}, - "rmo": {"name": "Romani, Sinte", "native_name": "Romanes", "max_tokens": 26}, - "rmy-script_latin": {"name": "Romani, Vlax - Latin", "native_name": "Romani Čhib", "max_tokens": 26}, - "rmy-script_cyrillic": {"name": "Romani, Vlax - Cyrillic", "native_name": "Романи Чхиб", "max_tokens": 13}, - "ron": {"name": "Romanian", "native_name": "Română", "max_tokens": 26}, - "rol": {"name": "Romblomanon", "native_name": "Romblomanon", "max_tokens": 13}, - "cla": {"name": "Ron", "native_name": "Ron", "max_tokens": 26}, - "rng": {"name": "Ronga", "native_name": "Ronga", "max_tokens": 26}, - "rug": {"name": "Roviana", "native_name": "Roviana", "max_tokens": 13}, - "run": {"name": "Rundi", "native_name": "Ikirundi", "max_tokens": 13}, - "lsm": {"name": "Saamya-Gwe", "native_name": "Saamya-Gwe", "max_tokens": 26}, - "spy": {"name": "Sabaot", "native_name": "Sabaot", "max_tokens": 26}, - "sck": {"name": "Sadri", "native_name": "Sadri", "max_tokens": 26}, - "saj": {"name": "Sahu", "native_name": "Sahu", "max_tokens": 26}, - "sch": {"name": "Sakachep", "native_name": "Sakachep", "max_tokens": 13}, - "sml": {"name": "Sama, Central", "native_name": "Sama", "max_tokens": 26}, - "xsb": {"name": "Sambal", "native_name": "Sambal", "max_tokens": 26}, - "sbl": {"name": "Sambal, Botolan", "native_name": "Sambal Botolan", "max_tokens": 13}, - "saq": {"name": "Samburu", "native_name": "Samburu", "max_tokens": 26}, - "sbd": {"name": "Samo, Southern", "native_name": "Samo", "max_tokens": 26}, - "smo": {"name": "Samoan", "native_name": "Gagana fa'a Samoa", "max_tokens": 26}, - "rav": {"name": "Sampang", "native_name": "Sampang", "max_tokens": 26}, - "sxn": {"name": "Sangir", "native_name": "Sangir", "max_tokens": 26}, - "sag": {"name": "Sango", "native_name": "Sängö", "max_tokens": 13}, - "sbp": {"name": "Sangu", "native_name": "Sangu", "max_tokens": 26}, - "xsu": {"name": "Sanumá", "native_name": "Sanumá", "max_tokens": 13}, - "srm": {"name": "Saramaccan", "native_name": "Saramaccan", "max_tokens": 13}, - "sas": {"name": "Sasak", "native_name": "Sasak", "max_tokens": 26}, - "apb": {"name": "Sa’a", "native_name": "Sa’a", "max_tokens": 26}, - "sgw": {"name": "Sebat Bet Gurage", "native_name": "Sebat Bet Gurage", "max_tokens": 26}, - "tvw": {"name": "Sedoa", "native_name": "Sedoa", "max_tokens": 13}, - "lip": {"name": "Sekpele", "native_name": "Sekpele", "max_tokens": 13}, - "slu": {"name": "Selaru", "native_name": "Selaru", "max_tokens": 13}, - "snw": {"name": "Selee", "native_name": "Selee", "max_tokens": 26}, - "sea": {"name": "Semai", "native_name": "Semai", "max_tokens": 26}, - "sza": {"name": "Semelai", "native_name": "Semelai", "max_tokens": 13}, - "seh": {"name": "Sena", "native_name": "Sena", "max_tokens": 26}, - "crs": {"name": "Seychelles French Creole", "native_name": "Kreol Seselwa", "max_tokens": 13}, - "ksb": {"name": "Shambala", "native_name": "Kishambala", "max_tokens": 13}, - "shn": {"name": "Shan", "native_name": "Shan", "max_tokens": 26}, - "sho": {"name": "Shanga", "native_name": "Shanga", "max_tokens": 26}, - "mcd": {"name": "Sharanahua", "native_name": "Sharanahua", "max_tokens": 13}, - "cbt": {"name": "Shawi", "native_name": "Shawi", "max_tokens": 26}, - "xsr": {"name": "Sherpa", "native_name": "ཤར་པཱ", "max_tokens": 26}, - "shk": {"name": "Shilluk", "native_name": "Shilluk", "max_tokens": 13}, - "shp": {"name": "Shipibo-Conibo", "native_name": "Shipibo-Conibo", "max_tokens": 26}, - "sna": {"name": "Shona", "native_name": "ChiShona", "max_tokens": 13}, - "cjs": {"name": "Shor", "native_name": "Шор тили", "max_tokens": 26}, - "jiv": {"name": "Shuar", "native_name": "Shuar", "max_tokens": 26}, - "snp": {"name": "Siane", "native_name": "Siane", "max_tokens": 26}, - "sya": {"name": "Siang", "native_name": "Siang", "max_tokens": 26}, - "sid": {"name": "Sidamo", "native_name": "Sidamo", "max_tokens": 26}, - "snn": {"name": "Siona", "native_name": "Siona", "max_tokens": 26}, - "sri": {"name": "Siriano", "native_name": "Siriano", "max_tokens": 26}, - "srx": {"name": "Sirmauri", "native_name": "Sirmauri", "max_tokens": 13}, - "sil": {"name": "Sisaala, Tumulung", "native_name": "Sisaala, Tumulung", "max_tokens": 13}, - "sld": {"name": "Sissala", "native_name": "Sissala", "max_tokens": 13}, - "akp": {"name": "Siwu", "native_name": "Siwu", "max_tokens": 26}, - "slk": {"name": "Slovak", "native_name": "Slovenčina", "max_tokens": 26}, - "sln": {"name": "Slovenian", "native_name": "Slovenščina", "max_tokens": 26}, - "xog": {"name": "Soga", "native_name": "Soga", "max_tokens": 26}, - "som": {"name": "Somali", "native_name": "Soomaali", "max_tokens": 13}, - "bmu": {"name": "Somba-Siawari", "native_name": "Somba-Siawari", "max_tokens": 26}, - "khq": {"name": "Songhay, Koyra Chiini", "native_name": "Songhay, Koyra Chiini", "max_tokens": 26}, - "ses": {"name": "Songhay, Koyraboro Senni", "native_name": "Songhay, Koyraboro Senni", "max_tokens": 26}, - "mnx": {"name": "Sougb", "native_name": "Sougb", "max_tokens": 13}, - "srn": {"name": "Sranan Tongo", "native_name": "Sranan Tongo", "max_tokens": 26}, - "sxb": {"name": "Suba", "native_name": "Suba", "max_tokens": 26}, - "suc": {"name": "Subanon, Western", "native_name": "Subanon, Western", "max_tokens": 26}, - "tgo": {"name": "Sudest", "native_name": "Sudest", "max_tokens": 26}, - "suk": {"name": "Sukuma", "native_name": "Sukuma", "max_tokens": 26}, - "sun": {"name": "Sunda", "native_name": "Basa Sunda", "max_tokens": 26}, - "suz": {"name": "Sunwar", "native_name": "Sunwar", "max_tokens": 26}, - "sgj": {"name": "Surgujia", "native_name": "Surgujia", "max_tokens": 13}, - "sus": {"name": "Susu", "native_name": "Susu", "max_tokens": 26}, - "swh": {"name": "Swahili", "native_name": "Kiswahili", "max_tokens": 26}, - "swe": {"name": "Swedish", "native_name": "Svenska", "max_tokens": 26}, - "syl": {"name": "Sylheti", "native_name": "Sylheti", "max_tokens": 13}, - "dyi": {"name": "Sénoufo, Djimini", "native_name": "Sénoufo, Djimini", "max_tokens": 13}, - "myk": {"name": "Sénoufo, Mamara", "native_name": "Sénoufo, Mamara", "max_tokens": 13}, - "spp": {"name": "Sénoufo, Supyire", "native_name": "Sénoufo, Supyire", "max_tokens": 13}, - "tap": {"name": "Taabwa", "native_name": "Taabwa", "max_tokens": 13}, - "tby": {"name": "Tabaru", "native_name": "Tabaru", "max_tokens": 26}, - "tna": {"name": "Tacana", "native_name": "Tacana", "max_tokens": 26}, - "shi": {"name": "Tachelhit", "native_name": "Tashelḥiyt", "max_tokens": 13}, - "klw": {"name": "Tado", "native_name": "Tado", "max_tokens": 26}, - "tgl": {"name": "Tagalog", "native_name": "Tagalog", "max_tokens": 26}, - "tbk": {"name": "Tagbanwa, Calamian", "native_name": "Tagbanwa", "max_tokens": 13}, - "tgj": {"name": "Tagin", "native_name": "Tagin", "max_tokens": 26}, - "blt": {"name": "Tai Dam", "native_name": "Táy Dăm", "max_tokens": 26}, - "tbg": {"name": "Tairora, North", "native_name": "Tairora", "max_tokens": 13}, - "omw": {"name": "Tairora, South", "native_name": "Tairora", "max_tokens": 13}, - "tgk": {"name": "Tajik", "native_name": "Тоҷикӣ", "max_tokens": 13}, - "tdj": {"name": "Tajio", "native_name": "Tajio", "max_tokens": 26}, - "tbc": {"name": "Takia", "native_name": "Takia", "max_tokens": 26}, - "tlj": {"name": "Talinga-Bwisi", "native_name": "Talinga-Bwisi", "max_tokens": 26}, - "tly": {"name": "Talysh", "native_name": "Толыши", "max_tokens": 13}, - "ttq-script_tifinagh": {"name": "Tamajaq, Tawallammat", "native_name": "ⵜⴰⵎⴰⵌⴰⵇ", "max_tokens": 26}, - "taj": {"name": "Tamang, Eastern", "native_name": "तामाङ", "max_tokens": 13}, - "taq": {"name": "Tamasheq", "native_name": "ⵜⴰⵎⴰⵛⵍⵈⵜ", "max_tokens": 13}, - "tpm": {"name": "Tampulma", "native_name": "Tampulma", "max_tokens": 13}, - "tgp": {"name": "Tangoa", "native_name": "Tangoa", "max_tokens": 26}, - "tnn": {"name": "Tanna, North", "native_name": "Tanna", "max_tokens": 26}, - "tac": {"name": "Tarahumara, Western", "native_name": "Tarahumara", "max_tokens": 13}, - "rif-script_latin": {"name": "Tarifit - Latin", "native_name": "Tarifit", "max_tokens": 13}, - "rif-script_arabic": {"name": "Tarifit - Arabic", "native_name": "ⵜⴰⵔⵉⴼⵉⵜ", "max_tokens": 26}, - "tat": {"name": "Tatar", "native_name": "татар теле", "max_tokens": 26}, - "tav": {"name": "Tatuyo", "native_name": "Tatuyo", "max_tokens": 13}, - "twb": {"name": "Tawbuid", "native_name": "Tawbuid", "max_tokens": 13}, - "tbl": {"name": "Tboli", "native_name": "Tboli", "max_tokens": 13}, - "kps": {"name": "Tehit", "native_name": "Tehit", "max_tokens": 26}, - "twe": {"name": "Teiwa", "native_name": "Teiwa", "max_tokens": 26}, - "ttc": {"name": "Tektiteko", "native_name": "Tektiteko", "max_tokens": 13}, - "kdh": {"name": "Tem", "native_name": "Tem", "max_tokens": 26}, - "tes": {"name": "Tengger", "native_name": "Tengger", "max_tokens": 26}, - "tex": {"name": "Tennet", "native_name": "Tennet", "max_tokens": 26}, - "tee": {"name": "Tepehua, Huehuetla", "native_name": "Tepehua", "max_tokens": 13}, - "tpp": {"name": "Tepehua, Pisaflores", "native_name": "Tepehua Pisaflores", "max_tokens": 13}, - "tpt": {"name": "Tepehua, Tlachichilco", "native_name": "Tepehua Tlachichilco", "max_tokens": 13}, - "stp": {"name": "Tepehuan, Southeastern", "native_name": "Tepehuan Southeastern", "max_tokens": 13}, - "tfr": {"name": "Teribe", "native_name": "Teribe", "max_tokens": 26}, - "twu": {"name": "Termanu", "native_name": "Termanu", "max_tokens": 26}, - "ter": {"name": "Terêna", "native_name": "Terêna", "max_tokens": 13}, - "tew": {"name": "Tewa", "native_name": "Tewa", "max_tokens": 26}, - "tha": {"name": "Thai", "native_name": "ไทย", "max_tokens": 13}, - "nod": {"name": "Thai, Northern", "native_name": "คำเมือง", "max_tokens": 13}, - "thl": {"name": "Tharu, Dangaura", "native_name": "थारू", "max_tokens": 13}, - "tem": {"name": "Themne", "native_name": "Themne", "max_tokens": 26}, - "adx": {"name": "Tibetan, Amdo", "native_name": "ཨ་མདོ", "max_tokens": 26}, - "bod": {"name": "Tibetan, Central", "native_name": "བོད", "max_tokens": 13}, - "khg": {"name": "Tibetan, Khams", "native_name": "ཁམས", "max_tokens": 26}, - "tca": {"name": "Ticuna", "native_name": "Ticuna", "max_tokens": 13}, - "tir": {"name": "Tigrigna", "native_name": "ትግርኛ", "max_tokens": 26}, - "txq": {"name": "Tii", "native_name": "Tii", "max_tokens": 26}, - "tik": {"name": "Tikar", "native_name": "Tikar", "max_tokens": 26}, - "dgr": {"name": "Tlicho", "native_name": "Tlicho", "max_tokens": 13}, - "tob": {"name": "Toba", "native_name": "Toba", "max_tokens": 26}, - "tmf": {"name": "Toba-Maskoy", "native_name": "Toba-Maskoy", "max_tokens": 26}, - "tng": {"name": "Tobanga", "native_name": "Tobanga", "max_tokens": 13}, - "tlb": {"name": "Tobelo", "native_name": "Tobelo", "max_tokens": 13}, - "ood": {"name": "Tohono O’odham", "native_name": "Tohono O’odham", "max_tokens": 26}, - "tpi": {"name": "Tok Pisin", "native_name": "Tok Pisin", "max_tokens": 26}, - "jic": {"name": "Tol", "native_name": "Tol", "max_tokens": 26}, - "lbw": {"name": "Tolaki", "native_name": "Tolaki", "max_tokens": 26}, - "txa": {"name": "Tombonuo", "native_name": "Tombonuo", "max_tokens": 13}, - "tom": {"name": "Tombulu", "native_name": "Tombulu", "max_tokens": 26}, - "toh": {"name": "Tonga", "native_name": "Tonga", "max_tokens": 26}, - "tnt": {"name": "Tontemboan", "native_name": "Tontemboan", "max_tokens": 13}, - "sda": {"name": "Toraja-Sa’dan", "native_name": "Toraja-Sa’dan", "max_tokens": 26}, - "tcs": {"name": "Torres Strait Creole", "native_name": "Torres Strait Creole", "max_tokens": 26}, - "toc": {"name": "Totonac, Coyutla", "native_name": "Totonac, Coyutla", "max_tokens": 26}, - "tos": {"name": "Totonac, Highland", "native_name": "Totonac, Highland", "max_tokens": 26}, - "neb": {"name": "Toura", "native_name": "Toura", "max_tokens": 26}, - "trn": {"name": "Trinitario", "native_name": "Trinitario", "max_tokens": 13}, - "trs": {"name": "Triqui, Chicahuaxtla", "native_name": "Triqui, Chicahuaxtla", "max_tokens": 13}, - "trc": {"name": "Triqui, Copala", "native_name": "Triqui, Copala", "max_tokens": 26}, - "tri": {"name": "Trió", "native_name": "Trió", "max_tokens": 26}, - "cof": {"name": "Tsafiki", "native_name": "Tsafiki", "max_tokens": 13}, - "tkr": {"name": "Tsakhur", "native_name": "Tsakhur", "max_tokens": 13}, - "kdl": {"name": "Tsikimba", "native_name": "Tsikimba", "max_tokens": 13}, - "cas": {"name": "Tsimané", "native_name": "Tsimané", "max_tokens": 13}, - "tso": {"name": "Tsonga", "native_name": "Tsonga", "max_tokens": 13}, - "tuo": {"name": "Tucano", "native_name": "Tucano", "max_tokens": 26}, - "iou": {"name": "Tuma-Irumu", "native_name": "Tuma-Irumu", "max_tokens": 26}, - "tmc": {"name": "Tumak", "native_name": "Tumak", "max_tokens": 26}, - "tuf": {"name": "Tunebo, Central", "native_name": "Tunebo, Central", "max_tokens": 26}, - "tuk-script_latin": {"name": "Turkmen - Latin", "native_name": "Türkmençe", "max_tokens": 13}, - "tuk-script_arabic": {"name": "Turkmen - Arabic", "native_name": "تركمن", "max_tokens": 13}, - "bov": {"name": "Tuwuli", "native_name": "Tuwuli", "max_tokens": 13}, - "tue": {"name": "Tuyuca", "native_name": "Tuyuca", "max_tokens": 26}, - "kcg": {"name": "Tyap", "native_name": "Tyap", "max_tokens": 26}, - "tzh-dialect_bachajón": {"name": "Tzeltal - dialect Bachajón", "native_name": "Tzeltal", "max_tokens": 13}, - "tzh-dialect_tenejapa": {"name": "Tzeltal - dialect Tenejapa", "native_name": "Tzeltal", "max_tokens": 13}, - "tzo-dialect_chenalhó": {"name": "Tzotzil - dialect Chenalhó", "native_name": "Tzotzil", "max_tokens": 13}, - "tzo-dialect_chamula": {"name": "Tzotzil - dialect Chamula", "native_name": "Tzotzil", "max_tokens": 13}, - "tzj-dialect_western": {"name": "Tz’utujil - dialect Western", "native_name": "Tz’utujil", "max_tokens": 26}, - "tzj-dialect_eastern": {"name": "Tz’utujil - dialect Eastern", "native_name": "Tz’utujil", "max_tokens": 26}, - "aoz": {"name": "Uab Meto", "native_name": "Uab Meto", "max_tokens": 26}, - "udm": {"name": "Udmurt", "native_name": "Udmurt", "max_tokens": 13}, - "udu": {"name": "Uduk", "native_name": "Uduk", "max_tokens": 26}, - "ukr": {"name": "Ukrainian", "native_name": "Українська", "max_tokens": 26}, - "ppk": {"name": "Uma", "native_name": "Uma", "max_tokens": 26}, - "ubu": {"name": "Umbu-Ungu", "native_name": "Umbu-Ungu", "max_tokens": 26}, - "urk": {"name": "Urak Lawoi’", "native_name": "Urak Lawoi’", "max_tokens": 26}, - "ura": {"name": "Urarina", "native_name": "Urarina", "max_tokens": 13}, - "urt": {"name": "Urat", "native_name": "Urat", "max_tokens": 26}, - "urd-script_devanagari": {"name": "Urdu - Devanagari", "native_name": "उर्दू", "max_tokens": 26}, - "urd-script_arabic": {"name": "Urdu - Arabic", "native_name": "اردو", "max_tokens": 26}, - "urd-script_latin": {"name": "Urdu - Latin", "native_name": "Urdu", "max_tokens": 26}, - "upv": {"name": "Uripiv-Wala-Rano-Atchin", "native_name": "Uripiv-Wala-Rano-Atchin", "max_tokens": 26}, - "usp": {"name": "Uspanteko", "native_name": "Uspanteko", "max_tokens": 13}, - "uig-script_arabic": {"name": "Uyghur - Arabic", "native_name": "ئۇيغۇر", "max_tokens": 13}, - "uig-script_cyrillic": {"name": "Uyghur - Cyrillic", "native_name": "Уйғур", "max_tokens": 13}, - "uzb-script_cyrillic": {"name": "Uzbek", "native_name": "Ўзбек", "max_tokens": 13}, - "vag": {"name": "Vagla", "native_name": "Vagla", "max_tokens": 26}, - "bav": {"name": "Vengo", "native_name": "Vengo", "max_tokens": 26}, - "vid": {"name": "Vidunda", "native_name": "Vidunda", "max_tokens": 26}, - "vie": {"name": "Vietnamese", "native_name": "Tiếng Việt", "max_tokens": 26}, - "vif": {"name": "Vili", "native_name": "Vili", "max_tokens": 26}, - "vun": {"name": "Vunjo", "native_name": "Vunjo", "max_tokens": 26}, - "vut": {"name": "Vute", "native_name": "Vute", "max_tokens": 26}, - "prk": {"name": "Wa, Parauk", "native_name": "Wa, Parauk", "max_tokens": 26}, - "wwa": {"name": "Waama", "native_name": "Waama", "max_tokens": 13}, - "rro": {"name": "Waima", "native_name": "Waima", "max_tokens": 13}, - "bao": {"name": "Waimaha", "native_name": "Waimaha", "max_tokens": 13}, - "waw": {"name": "Waiwai", "native_name": "Waiwai", "max_tokens": 13}, - "lgl": {"name": "Wala", "native_name": "Wala", "max_tokens": 26}, - "wlx": {"name": "Wali", "native_name": "Wali", "max_tokens": 26}, - "cou": {"name": "Wamey", "native_name": "Wamey", "max_tokens": 13}, - "hub": {"name": "Wampís", "native_name": "Wampís", "max_tokens": 13}, - "gvc": {"name": "Wanano", "native_name": "Wanano", "max_tokens": 26}, - "mfi": {"name": "Wandala", "native_name": "Wandala", "max_tokens": 26}, - "wap": {"name": "Wapishana", "native_name": "Wapishana", "max_tokens": 13}, - "wba": {"name": "Warao", "native_name": "Warao", "max_tokens": 26}, - "war": {"name": "Waray-Waray", "native_name": "Waray-Waray", "max_tokens": 26}, - "way": {"name": "Wayana", "native_name": "Wayana", "max_tokens": 26}, - "guc": {"name": "Wayuu", "native_name": "Wayuu", "max_tokens": 26}, - "cym": {"name": "Welsh", "native_name": "Cymraeg", "max_tokens": 26}, - "kvw": {"name": "Wersing", "native_name": "Wersing", "max_tokens": 26}, - "tnp": {"name": "Whitesands", "native_name": "Whitesands", "max_tokens": 13}, - "hto": {"name": "Witoto, Minika", "native_name": "Witoto, Minika", "max_tokens": 26}, - "huu": {"name": "Witoto, Murui", "native_name": "Witoto, Murui", "max_tokens": 26}, - "wal-script_latin": {"name": "Wolaytta - Latin", "native_name": "Wolaytta", "max_tokens": 13}, - "wal-script_ethiopic": {"name": "Wolaytta - Ethiopic", "native_name": "ወላይታ", "max_tokens": 26}, - "wlo": {"name": "Wolio", "native_name": "Wolio", "max_tokens": 26}, - "noa": {"name": "Woun Meu", "native_name": "Woun Meu", "max_tokens": 26}, - "wob": {"name": "Wè Northern", "native_name": "Wè", "max_tokens": 26}, - "kao": {"name": "Xaasongaxango", "native_name": "Xaasongaxango", "max_tokens": 13}, - "xer": {"name": "Xerénte", "native_name": "Xerénte", "max_tokens": 13}, - "yad": {"name": "Yagua", "native_name": "Yagua", "max_tokens": 26}, - "yka": {"name": "Yakan", "native_name": "Yakan", "max_tokens": 26}, - "sah": {"name": "Yakut", "native_name": "Саха", "max_tokens": 26}, - "yba": {"name": "Yala", "native_name": "Yala", "max_tokens": 26}, - "yli": {"name": "Yali, Angguruk", "native_name": "Yali, Angguruk", "max_tokens": 26}, - "nlk": {"name": "Yali, Ninia", "native_name": "Yali, Ninia", "max_tokens": 26}, - "yal": {"name": "Yalunka", "native_name": "Yalunka", "max_tokens": 13}, - "yam": {"name": "Yamba", "native_name": "Yamba", "max_tokens": 26}, - "yat": {"name": "Yambeta", "native_name": "Yambeta", "max_tokens": 13}, - "jmd": {"name": "Yamdena", "native_name": "Yamdena", "max_tokens": 13}, - "tao": {"name": "Yami", "native_name": "Yami", "max_tokens": 26}, - "yaa": {"name": "Yaminahua", "native_name": "Yaminahua", "max_tokens": 13}, - "ame": {"name": "Yanesha’", "native_name": "Yanesha’", "max_tokens": 26}, - "guu": {"name": "Yanomamö", "native_name": "Yanomamö", "max_tokens": 13}, - "yao": {"name": "Yao", "native_name": "Yao", "max_tokens": 26}, - "yre": {"name": "Yaouré", "native_name": "Yaouré", "max_tokens": 26}, - "yva": {"name": "Yawa", "native_name": "Yawa", "max_tokens": 26}, - "ybb": {"name": "Yemba", "native_name": "Yemba", "max_tokens": 26}, - "pib": {"name": "Yine", "native_name": "Yine", "max_tokens": 26}, - "byr": {"name": "Yipma", "native_name": "Yipma", "max_tokens": 13}, - "pil": {"name": "Yom", "native_name": "Yom", "max_tokens": 26}, - "ycn": {"name": "Yucuna", "native_name": "Yucuna", "max_tokens": 13}, - "ess": {"name": "Yupik, Saint Lawrence Island", "native_name": "Yupigestun", "max_tokens": 13}, - "yuz": {"name": "Yuracare", "native_name": "Yuracare", "max_tokens": 13}, - "atb": {"name": "Zaiwa", "native_name": "Zaiwa", "max_tokens": 26}, - "zne": {"name": "Zande", "native_name": "Zande", "max_tokens": 26}, - "zaq": {"name": "Zapotec, Aloápam", "native_name": "Aloápam Zapotec", "max_tokens": 13}, - "zpo": {"name": "Zapotec, Amatlán", "native_name": "Amatlán Zapotec", "max_tokens": 13}, - "zad": {"name": "Zapotec, Cajonos", "native_name": "Cajonos Zapotec", "max_tokens": 13}, - "zpc": {"name": "Zapotec, Choapan", "native_name": "Choapan Zapotec", "max_tokens": 13}, - "zca": {"name": "Zapotec, Coatecas Altas", "native_name": "Coatecas Altas Zapotec", "max_tokens": 13}, - "zpg": {"name": "Zapotec, Guevea de Humboldt", "native_name": "Guevea de Humboldt Zapotec", "max_tokens": 13}, - "zai": {"name": "Zapotec, Isthmus", "native_name": "Isthmus Zapotec", "max_tokens": 13}, - "zpl": {"name": "Zapotec, Lachixío", "native_name": "Lachixío Zapotec", "max_tokens": 13}, - "zam": {"name": "Zapotec, Miahuatlán", "native_name": "Miahuatlán Zapotec", "max_tokens": 13}, - "zaw": {"name": "Zapotec, Mitla", "native_name": "Mitla Zapotec", "max_tokens": 13}, - "zpm": {"name": "Zapotec, Mixtepec", "native_name": "Mixtepec Zapotec", "max_tokens": 13}, - "zac": {"name": "Zapotec, Ocotlán", "native_name": "Ocotlán Zapotec", "max_tokens": 13}, - "zao": {"name": "Zapotec, Ozolotepec", "native_name": "Ozolotepec Zapotec", "max_tokens": 13}, - "ztq": {"name": "Zapotec, Quioquitani-Quierí", "native_name": "Quioquitani-Quierí Zapotec", "max_tokens": 13}, - "zar": {"name": "Zapotec, Rincón", "native_name": "Rincón Zapotec", "max_tokens": 26}, - "zpt": {"name": "Zapotec, San Vicente Coatlán", "native_name": "San Vicente Coatlán Zapotec", "max_tokens": 26}, - "zpi": {"name": "Zapotec, Santa María Quiegolani", "native_name": "Santa María Quiegolani Zapotec", "max_tokens": 26}, - "zas": {"name": "Zapotec, Santo Domingo Albarradas", "native_name": "Santo Domingo Albarradas Zapotec", "max_tokens": 26}, - "zaa": {"name": "Zapotec, Sierra de Juárez", "native_name": "Sierra de Juárez Zapotec", "max_tokens": 26}, - "zpz": {"name": "Zapotec, Texmelucan", "native_name": "Texmelucan Zapotec", "max_tokens": 13}, - "zab": {"name": "Zapotec, Western Tlacolula Valley", "native_name": "Western Tlacolula Valley Zapotec", "max_tokens": 13}, - "zpu": {"name": "Zapotec, Yalálag", "native_name": "Yalálag Zapotec", "max_tokens": 13}, - "zae": {"name": "Zapotec, Yareni", "native_name": "Yareni Zapotec", "max_tokens": 13}, - "zty": {"name": "Zapotec, Yatee", "native_name": "Yatee Zapotec", "max_tokens": 13}, - "zav": {"name": "Zapotec, Yatzachi", "native_name": "Yatzachi Zapotec", "max_tokens": 13}, - "zza": {"name": "Zaza", "native_name": "Zazaki", "max_tokens": 26}, - "zyb": {"name": "Zhuang, Yongbei", "native_name": "Yongbei Zhuang", "max_tokens": 26}, - "ziw": {"name": "Zigula", "native_name": "Zigula", "max_tokens": 26}, - "zos": {"name": "Zoque, Francisco León", "native_name": "Francisco León Zoque", "max_tokens": 26}, - "gnd": {"name": "Zulgo-Gemzek", "native_name": "Zulgo-Gemzek", "max_tokens": 26} + "dar": {"name": "Dargwa", "native_name": "Дарган мез", "max_tokens": 25}, + "tcc": {"name": "Datooga", "native_name": "Datooga", "max_tokens": 25}, + "dwr": {"name": "Dawro", "native_name": "Dawro", "max_tokens": 12}, + "ded": {"name": "Dedua", "native_name": "Dedua", "max_tokens": 25}, + "mzw": {"name": "Deg", "native_name": "Deg", "max_tokens": 25}, + "ntr": {"name": "Delo", "native_name": "Delo", "max_tokens": 25}, + "ddn": {"name": "Dendi", "native_name": "Dendi", "max_tokens": 25}, + "des": {"name": "Desano", "native_name": "Desano", "max_tokens": 25}, + "dso": {"name": "Desiya", "native_name": "Desiya", "max_tokens": 25}, + "nfa": {"name": "Dhao", "native_name": "Dhao", "max_tokens": 12}, + "dhi": {"name": "Dhimal", "native_name": "Dhimal", "max_tokens": 12}, + "gud": {"name": "Dida, Yocoboué", "native_name": "Dida", "max_tokens": 25}, + "did": {"name": "Didinga", "native_name": "Didinga", "max_tokens": 25}, + "mhu": {"name": "Digaro-Mishmi", "native_name": "Digaro-Mishmi", "max_tokens": 25}, + "dip": {"name": "Dinka, Northeastern", "native_name": "Dinka", "max_tokens": 25}, + "dik": {"name": "Dinka, Southwestern", "native_name": "Dinka", "max_tokens": 25}, + "tbz": {"name": "Ditammari", "native_name": "Ditammari", "max_tokens": 12}, + "dts": {"name": "Dogon, Toro So", "native_name": "Dogon", "max_tokens": 25}, + "dos": {"name": "Dogosé", "native_name": "Dogosé", "max_tokens": 25}, + "dgo": {"name": "Dogri", "native_name": "डोगरी", "max_tokens": 12}, + "mvp": {"name": "Duri", "native_name": "Duri", "max_tokens": 25}, + "nld": {"name": "Dutch", "native_name": "Nederlands", "max_tokens": 25}, + "jen": {"name": "Dza", "native_name": "Dza", "max_tokens": 25}, + "dzo": {"name": "Dzongkha", "native_name": "རྫོང་ཁ", "max_tokens": 25}, + "idd": {"name": "Ede Idaca", "native_name": "Ede Idaca", "max_tokens": 25}, + "eka": {"name": "Ekajuk", "native_name": "Ekajuk", "max_tokens": 12}, + "cto": {"name": "Embera Catío", "native_name": "Embera Catío", "max_tokens": 25}, + "emp": {"name": "Emberá, Northern", "native_name": "Emberá", "max_tokens": 12}, + "enx": {"name": "Enxet", "native_name": "Enxet", "max_tokens": 12}, + "sja": {"name": "Epena", "native_name": "Epena", "max_tokens": 25}, + "myv": {"name": "Erzya", "native_name": "Эрзянь", "max_tokens": 12}, + "mcq": {"name": "Ese", "native_name": "Ese", "max_tokens": 25}, + "ese": {"name": "Ese Ejja", "native_name": "Ese Ejja", "max_tokens": 25}, + "est": {"name": "Estonian", "native_name": "Eesti", "max_tokens": 25}, + "evn": {"name": "Evenki", "native_name": "Эвенки", "max_tokens": 12}, + "eza": {"name": "Ezaa", "native_name": "Ezaa", "max_tokens": 25}, + "ewe": {"name": "Éwé", "native_name": "Éwé", "max_tokens": 25}, + "fal": {"name": "Fali, South", "native_name": "Fali", "max_tokens": 25}, + "fao": {"name": "Faroese", "native_name": "Føroyskt", "max_tokens": 12}, + "far": {"name": "Fataleka", "native_name": "Fataleka", "max_tokens": 25}, + "fij": {"name": "Fijian", "native_name": "Na Vosa Vakaviti", "max_tokens": 25}, + "fin": {"name": "Finnish", "native_name": "Suomi", "max_tokens": 25}, + "fon": {"name": "Fon", "native_name": "Fon", "max_tokens": 25}, + "frd": {"name": "Fordata", "native_name": "Fordata", "max_tokens": 25}, + "ful": {"name": "Fulah", "native_name": "Fulfulde", "max_tokens": 12}, + "flr": {"name": "Fuliiru", "native_name": "Fuliiru", "max_tokens": 12}, + "gau": {"name": "Gadaba, Mudhili", "native_name": "Gadaba", "max_tokens": 12}, + "gbk": {"name": "Gaddi", "native_name": "Gaddi", "max_tokens": 25}, + "gag-script_cyrillic": {"name": "Gagauz - Cyrillic", "native_name": "Гагаузча", "max_tokens": 12}, + "gag-script_latin": {"name": "Gagauz - Latin", "native_name": "Gagauz", "max_tokens": 25}, + "gbi": {"name": "Galela", "native_name": "Galela", "max_tokens": 25}, + "gmv": {"name": "Gamo", "native_name": "Gamo", "max_tokens": 25}, + "lug": {"name": "Ganda", "native_name": "Luganda", "max_tokens": 12}, + "pwg": {"name": "Gapapaiwa", "native_name": "Gapapaiwa", "max_tokens": 12}, + "gbm": {"name": "Garhwali", "native_name": "गढ़वाळी", "max_tokens": 12}, + "cab": {"name": "Garifuna", "native_name": "Garifuna", "max_tokens": 12}, + "grt": {"name": "Garo", "native_name": "Garo", "max_tokens": 25}, + "krs": {"name": "Gbaya", "native_name": "Gbaya", "max_tokens": 12}, + "gso": {"name": "Gbaya, Southwest", "native_name": "Gbaya", "max_tokens": 12}, + "nlg": {"name": "Gela", "native_name": "Gela", "max_tokens": 25}, + "gej": {"name": "Gen", "native_name": "Gen", "max_tokens": 25}, + "gri": {"name": "Ghari", "native_name": "Ghari", "max_tokens": 25}, + "kik": {"name": "Gikuyu", "native_name": "Gĩkũyũ", "max_tokens": 12}, + "acd": {"name": "Gikyode", "native_name": "Gikyode", "max_tokens": 12}, + "glk": {"name": "Gilaki", "native_name": "گیلکی", "max_tokens": 12}, + "gof-script_latin": {"name": "Gofa", "native_name": "Gofa", "max_tokens": 25}, + "gog": {"name": "Gogo", "native_name": "Gogo", "max_tokens": 25}, + "gkn": {"name": "Gokana", "native_name": "Gokana", "max_tokens": 25}, + "wsg": {"name": "Gondi, Adilabad", "native_name": "Gondi", "max_tokens": 25}, + "gjn": {"name": "Gonja", "native_name": "Gonja", "max_tokens": 25}, + "gqr": {"name": "Gor", "native_name": "Gor", "max_tokens": 25}, + "gor": {"name": "Gorontalo", "native_name": "Gorontalo", "max_tokens": 12}, + "gux": {"name": "Gourmanchéma", "native_name": "Gourmanchéma", "max_tokens": 12}, + "gbo": {"name": "Grebo, Northern", "native_name": "Grebo", "max_tokens": 12}, + "ell": {"name": "Greek", "native_name": "Ελληνικά", "max_tokens": 12}, + "grc": {"name": "Greek, Ancient", "native_name": "Ἑλληνική", "max_tokens": 25}, + "guh": {"name": "Guahibo", "native_name": "Guahibo", "max_tokens": 12}, + "gub": {"name": "Guajajára", "native_name": "Guajajára", "max_tokens": 12}, + "grn": {"name": "Guarani", "native_name": "Avañe'ẽ", "max_tokens": 25}, + "gyr": {"name": "Guarayu", "native_name": "Guarayu", "max_tokens": 12}, + "guo": {"name": "Guayabero", "native_name": "Guayabero", "max_tokens": 12}, + "gde": {"name": "Gude", "native_name": "Gude", "max_tokens": 25}, + "guj": {"name": "Gujarati", "native_name": "ગુજરાતી", "max_tokens": 25}, + "gvl": {"name": "Gulay", "native_name": "Gulay", "max_tokens": 12}, + "guk": {"name": "Gumuz", "native_name": "Gumuz", "max_tokens": 12}, + "rub": {"name": "Gungu", "native_name": "Gungu", "max_tokens": 25}, + "dah": {"name": "Gwahatike", "native_name": "Gwahatike", "max_tokens": 12}, + "gwr": {"name": "Gwere", "native_name": "Gwere", "max_tokens": 12}, + "gwi": {"name": "Gwich’in", "native_name": "Gwich’in", "max_tokens": 25}, + "hat": {"name": "Haitian Creole", "native_name": "Kreyòl Ayisyen", "max_tokens": 25}, + "hlb": {"name": "Halbi", "native_name": "Halbi", "max_tokens": 25}, + "amf": {"name": "Hamer-Banna", "native_name": "Hamer-Banna", "max_tokens": 25}, + "hag": {"name": "Hanga", "native_name": "Hanga", "max_tokens": 25}, + "hnn": {"name": "Hanunoo", "native_name": "Hanunoo", "max_tokens": 12}, + "bgc": {"name": "Haryanvi", "native_name": "हरियाणवी", "max_tokens": 12}, + "had": {"name": "Hatam", "native_name": "Hatam", "max_tokens": 25}, + "hau": {"name": "Hausa", "native_name": "Hausa", "max_tokens": 25}, + "hwc": {"name": "Hawaii Pidgin", "native_name": "Hawai‘i Creole English", "max_tokens": 25}, + "hvn": {"name": "Hawu", "native_name": "Hawu", "max_tokens": 25}, + "hay": {"name": "Haya", "native_name": "Haya", "max_tokens": 25}, + "xed": {"name": "Hdi", "native_name": "Hdi", "max_tokens": 25}, + "heb": {"name": "Hebrew", "native_name": "עברית", "max_tokens": 25}, + "heh": {"name": "Hehe", "native_name": "Hehe", "max_tokens": 25}, + "hil": {"name": "Hiligaynon", "native_name": "Ilonggo", "max_tokens": 12}, + "hif": {"name": "Hindi, Fiji", "native_name": "फ़िजी हिंदी", "max_tokens": 12}, + "hns": {"name": "Hindustani, Sarnami", "native_name": "सरनामी", "max_tokens": 12}, + "hoc": {"name": "Ho", "native_name": "हो", "max_tokens": 12}, + "hoy": {"name": "Holiya", "native_name": "Holiya", "max_tokens": 25}, + "hus-dialect_westernpotosino": {"name": "Huastec - Western Potosino", "native_name": "Teenek", "max_tokens": 25}, + "hus-dialect_centralveracruz": {"name": "Huastec - Central Veracruz", "native_name": "Teenek", "max_tokens": 25}, + "huv": {"name": "Huave, San Mateo del Mar", "native_name": "Ombeayiüts", "max_tokens": 12}, + "hui": {"name": "Huli", "native_name": "Huli", "max_tokens": 25}, + "hap": {"name": "Hupla", "native_name": "Hupla", "max_tokens": 25}, + "iba": {"name": "Iban", "native_name": "Iban", "max_tokens": 25}, + "isl": {"name": "Icelandic", "native_name": "Íslenska", "max_tokens": 12}, + "dbj": {"name": "Ida’an", "native_name": "Ida’an", "max_tokens": 25}, + "ifa": {"name": "Ifugao, Amganad", "native_name": "Ifugao", "max_tokens": 12}, + "ifb": {"name": "Ifugao, Batad", "native_name": "Ifugao", "max_tokens": 12}, + "ifu": {"name": "Ifugao, Mayoyao", "native_name": "Ifugao", "max_tokens": 12}, + "ifk": {"name": "Ifugao, Tuwali", "native_name": "Ifugao", "max_tokens": 12}, + "ife": {"name": "Ifè", "native_name": "Ifè", "max_tokens": 25}, + "ign": {"name": "Ignaciano", "native_name": "Ignaciano", "max_tokens": 12}, + "ikk": {"name": "Ika", "native_name": "Ika", "max_tokens": 25}, + "iqw": {"name": "Ikwo", "native_name": "Ikwo", "max_tokens": 25}, + "ilb": {"name": "Ila", "native_name": "Ila", "max_tokens": 25}, + "ilo": {"name": "Ilocano", "native_name": "Ilocano", "max_tokens": 12}, + "imo": {"name": "Imbongu", "native_name": "Imbongu", "max_tokens": 12}, + "inb": {"name": "Inga", "native_name": "Inga", "max_tokens": 25}, + "ipi": {"name": "Ipili", "native_name": "Ipili", "max_tokens": 25}, + "irk": {"name": "Iraqw", "native_name": "Iraqw", "max_tokens": 25}, + "gle": {"name": "Irish", "native_name": "Gaeilge", "max_tokens": 25}, + "icr": {"name": "Islander English Creole", "native_name": "Islander Creole", "max_tokens": 25}, + "itv": {"name": "Itawit", "native_name": "Itawit", "max_tokens": 12}, + "itl": {"name": "Itelmen", "native_name": "Itelmen", "max_tokens": 12}, + "atg": {"name": "Ivbie North-Okpela-Arhe", "native_name": "Ivbie North-Okpela-Arhe", "max_tokens": 25}, + "ixl-dialect_sanjuancotzal": {"name": "Ixil - San Juan Cotzal", "native_name": "Ixil", "max_tokens": 12}, + "ixl-dialect_sangasparchajul": {"name": "Ixil - San Gaspar Chajul", "native_name": "Ixil", "max_tokens": 12}, + "ixl-dialect_santamarianebaj": {"name": "Ixil - Santa Maria Nebaj", "native_name": "Ixil", "max_tokens": 12}, + "nca": {"name": "Iyo", "native_name": "Iyo", "max_tokens": 25}, + "izr": {"name": "Izere", "native_name": "Izere", "max_tokens": 25}, + "izz": {"name": "Izii", "native_name": "Izii", "max_tokens": 25}, + "jac": {"name": "Jakalteko", "native_name": "Jakalteko", "max_tokens": 12}, + "jam": {"name": "Jamaican English Creole", "native_name": "Patois", "max_tokens": 25}, + "jvn": {"name": "Javanese, Suriname", "native_name": "Basa Jawa Suriname", "max_tokens": 25}, + "kac": {"name": "Jingpho", "native_name": "Jingpho", "max_tokens": 12}, + "dyo": {"name": "Jola-Fonyi", "native_name": "Joola Foñi", "max_tokens": 12}, + "csk": {"name": "Jola-Kasa", "native_name": "Joola Kasa", "max_tokens": 25}, + "adh": {"name": "Jopadhola", "native_name": "Jopadhola", "max_tokens": 12}, + "jun": {"name": "Juang", "native_name": "Juang", "max_tokens": 25}, + "jbu": {"name": "Jukun Takum", "native_name": "Jukun Takum", "max_tokens": 25}, + "dyu": {"name": "Jula", "native_name": "Julakan", "max_tokens": 25}, + "bex": {"name": "Jur Modo", "native_name": "Jur Modo", "max_tokens": 25}, + "juy": {"name": "Juray", "native_name": "Juray", "max_tokens": 25}, + "gna": {"name": "Kaansa", "native_name": "Kaansa", "max_tokens": 25}, + "urb": {"name": "Kaapor", "native_name": "Kaapor", "max_tokens": 25}, + "kbp": {"name": "Kabiyè", "native_name": "Kabiyè", "max_tokens": 12}, + "cwa": {"name": "Kabwa", "native_name": "Kabwa", "max_tokens": 12}, + "dtp": {"name": "Kadazan Dusun", "native_name": "Kadazan Dusun", "max_tokens": 25}, + "kbr": {"name": "Kafa", "native_name": "Kafa", "max_tokens": 25}, + "cgc": {"name": "Kagayanen", "native_name": "Kagayanen", "max_tokens": 12}, + "kki": {"name": "Kagulu", "native_name": "Kagulu", "max_tokens": 12}, + "kzf": {"name": "Kaili, Da’a", "native_name": "Kaili Da’a", "max_tokens": 25}, + "lew": {"name": "Kaili, Ledo", "native_name": "Kaili Ledo", "max_tokens": 25}, + "cbr": {"name": "Kakataibo-Kashibo", "native_name": "Kakataibo-Kashibo", "max_tokens": 12}, + "kkj": {"name": "Kako", "native_name": "Kako", "max_tokens": 25}, + "keo": {"name": "Kakwa", "native_name": "Kakwa", "max_tokens": 25}, + "kqe": {"name": "Kalagan", "native_name": "Kalagan", "max_tokens": 25}, + "kak": {"name": "Kalanguya", "native_name": "Kalanguya", "max_tokens": 12}, + "kyb": {"name": "Kalinga, Butbut", "native_name": "Kalinga Butbut", "max_tokens": 25}, + "knb": {"name": "Kalinga, Lubuagan", "native_name": "Kalinga Lubuagan", "max_tokens": 12}, + "kmd": {"name": "Kalinga, Majukayang", "native_name": "Kalinga Majukayang", "max_tokens": 12}, + "kml": {"name": "Kalinga, Tanudan", "native_name": "Kalinga Tanudan", "max_tokens": 25}, + "ify": {"name": "Kallahan, Keley-i", "native_name": "Kallahan Keley-i", "max_tokens": 25}, + "xal": {"name": "Kalmyk-Oirat", "native_name": "Хальмг", "max_tokens": 12}, + "kbq": {"name": "Kamano", "native_name": "Kamano", "max_tokens": 25}, + "kay": {"name": "Kamayurá", "native_name": "Kamayurá", "max_tokens": 12}, + "ktb": {"name": "Kambaata", "native_name": "Kambaata", "max_tokens": 12}, + "hig": {"name": "Kamwe", "native_name": "Kamwe", "max_tokens": 12}, + "gam": {"name": "Kandawo", "native_name": "Kandawo", "max_tokens": 12}, + "cbu": {"name": "Kandozi-Chapra", "native_name": "Kandozi-Chapra", "max_tokens": 25}, + "xnr": {"name": "Kangri", "native_name": "Kangri", "max_tokens": 25}, + "kmu": {"name": "Kanite", "native_name": "Kanite", "max_tokens": 25}, + "kne": {"name": "Kankanaey", "native_name": "Kankanaey", "max_tokens": 12}, + "kan": {"name": "Kannada", "native_name": "ಕನ್ನಡ", "max_tokens": 25}, + "kby": {"name": "Kanuri, Manga", "native_name": "Kanuri", "max_tokens": 25}, + "pam": {"name": "Kapampangan", "native_name": "Kapampangan", "max_tokens": 12}, + "cak-dialect_santamaríadejesús": {"name": "Kaqchikel - Santa María de Jesús", "native_name": "Kaqchikel", "max_tokens": 12}, + "cak-dialect_southcentral": {"name": "Kaqchikel - dialect South Central", "native_name": "Kaqchikel", "max_tokens": 12}, + "cak-dialect_yepocapa": {"name": "Kaqchikel - dialect Yepocapa", "native_name": "Kaqchikel", "max_tokens": 12}, + "cak-dialect_western": {"name": "Kaqchikel - dialect Western", "native_name": "Kaqchikel", "max_tokens": 12}, + "cak-dialect_santodomingoxenacoj": {"name": "Kaqchikel - dialect Santo Domingo Xenacoj", "native_name": "Kaqchikel", "max_tokens": 12}, + "cak-dialect_central": {"name": "Kaqchikel - Dialect Central", "native_name": "Kaqchikel", "max_tokens": 12}, + "xrb": {"name": "Karaboro, Eastern", "native_name": "Karaboro", "max_tokens": 25}, + "krc": {"name": "Karachay-Balkar", "native_name": "Къарачай-Малкъар", "max_tokens": 12}, + "kaa": {"name": "Karakalpak", "native_name": "Qaraqalpaq", "max_tokens": 12}, + "krl": {"name": "Karelian", "native_name": "Karjala", "max_tokens": 25}, + "pww": {"name": "Karen, Pwo Northern", "native_name": "Pwo Karen", "max_tokens": 25}, + "xsm": {"name": "Kasem", "native_name": "Kasem", "max_tokens": 25}, + "cbs": {"name": "Kashinawa", "native_name": "Kashinawa", "max_tokens": 12}, + "pss": {"name": "Kaulong", "native_name": "Kaulong", "max_tokens": 12}, + "kxf": {"name": "Kawyaw", "native_name": "Kawyaw", "max_tokens": 12}, + "kyz": {"name": "Kayabí", "native_name": "Kayabí", "max_tokens": 25}, + "kyu": {"name": "Kayah, Western", "native_name": "Kayah", "max_tokens": 25}, + "txu": {"name": "Kayapó", "native_name": "Kayapó", "max_tokens": 12}, + "kaz": {"name": "Kazakh", "native_name": "Қазақ тілі", "max_tokens": 25}, + "ndp": {"name": "Kebu", "native_name": "Kebu", "max_tokens": 25}, + "kbo": {"name": "Keliko", "native_name": "Keliko", "max_tokens": 25}, + "kyq": {"name": "Kenga", "native_name": "Kenga", "max_tokens": 25}, + "ken": {"name": "Kenyang", "native_name": "Kenyang", "max_tokens": 25}, + "ker": {"name": "Kera", "native_name": "Kera", "max_tokens": 25}, + "xte": {"name": "Ketengban", "native_name": "Ketengban", "max_tokens": 12}, + "kyg": {"name": "Keyagana", "native_name": "Keyagana", "max_tokens": 12}, + "kjh": {"name": "Khakas", "native_name": "Хакас тілі", "max_tokens": 25}, + "kca": {"name": "Khanty", "native_name": "Ханты", "max_tokens": 25}, + "khm": {"name": "Khmer", "native_name": "ភាសាខ្មែរ", "max_tokens": 25}, + "kxm": {"name": "Khmer, Northern", "native_name": "ភាសាខ្មែរ, ភាគខាងជើង", "max_tokens": 25}, + "kjg": {"name": "Khmu", "native_name": "ຂະມູ", "max_tokens": 25}, + "nyf": {"name": "Kigiryama", "native_name": "Kigiryama", "max_tokens": 12}, + "kij": {"name": "Kilivila", "native_name": "Kilivila", "max_tokens": 12}, + "kia": {"name": "Kim", "native_name": "Kim", "max_tokens": 25}, + "kqr": {"name": "Kimaragang", "native_name": "Kimaragang", "max_tokens": 12}, + "kqp": {"name": "Kimré", "native_name": "Kimré", "max_tokens": 25}, + "krj": {"name": "Kinaray-a", "native_name": "Kinaray-a", "max_tokens": 25}, + "zga": {"name": "Kinga", "native_name": "Kinga", "max_tokens": 25}, + "kin": {"name": "Kinyarwanda", "native_name": "Ikinyarwanda", "max_tokens": 12}, + "pkb": {"name": "Kipfokomo", "native_name": "Kipfokomo", "max_tokens": 12}, + "geb": {"name": "Kire", "native_name": "Kire", "max_tokens": 25}, + "gil": {"name": "Kiribati", "native_name": "Taetae ni Kiribati", "max_tokens": 25}, + "kje": {"name": "Kisar", "native_name": "Kisar", "max_tokens": 25}, + "kss": {"name": "Kisi, Southern", "native_name": "Kisi", "max_tokens": 25}, + "thk": {"name": "Kitharaka", "native_name": "Kitharaka", "max_tokens": 12}, + "klu": {"name": "Klao", "native_name": "Klao", "max_tokens": 25}, + "kyo": {"name": "Klon", "native_name": "Klon", "max_tokens": 25}, + "kog": {"name": "Kogi", "native_name": "Kogi", "max_tokens": 25}, + "kfb": {"name": "Kolami, Northwestern", "native_name": "Kolami", "max_tokens": 25}, + "kpv": {"name": "Komi-Zyrian", "native_name": "Коми", "max_tokens": 25}, + "bbo": {"name": "Konabéré", "native_name": "Konabéré", "max_tokens": 12}, + "xon": {"name": "Konkomba", "native_name": "Konkomba", "max_tokens": 12}, + "kma": {"name": "Konni", "native_name": "Konni", "max_tokens": 25}, + "kno": {"name": "Kono", "native_name": "Kono", "max_tokens": 25}, + "kxc": {"name": "Konso", "native_name": "Konso", "max_tokens": 12}, + "ozm": {"name": "Koonzime", "native_name": "Koonzime", "max_tokens": 12}, + "kqy": {"name": "Koorete", "native_name": "Koorete", "max_tokens": 12}, + "coe": {"name": "Koreguaje", "native_name": "Koreguaje", "max_tokens": 12}, + "kpq": {"name": "Korupun-Sela", "native_name": "Korupun-Sela", "max_tokens": 25}, + "kpy": {"name": "Koryak", "native_name": "Курил", "max_tokens": 12}, + "kyf": {"name": "Kouya", "native_name": "Kouya", "max_tokens": 25}, + "kff-script_telugu": {"name": "Koya", "native_name": "కోయా", "max_tokens": 12}, + "kri": {"name": "Krio", "native_name": "Krio", "max_tokens": 25}, + "rop": {"name": "Kriol", "native_name": "Kriol", "max_tokens": 25}, + "ktj": {"name": "Krumen, Plapo", "native_name": "Krumen, Plapo", "max_tokens": 25}, + "ted": {"name": "Krumen, Tepo", "native_name": "Krumen, Tepo", "max_tokens": 25}, + "krr": {"name": "Krung", "native_name": "Krung", "max_tokens": 25}, + "kdt": {"name": "Kuay", "native_name": "Kuay", "max_tokens": 25}, + "kez": {"name": "Kukele", "native_name": "Kukele", "max_tokens": 12}, + "cul": {"name": "Kulina", "native_name": "Kulina", "max_tokens": 25}, + "kle": {"name": "Kulung", "native_name": "Kulung", "max_tokens": 25}, + "kdi": {"name": "Kumam", "native_name": "Kumam", "max_tokens": 12}, + "kue": {"name": "Kuman", "native_name": "Kuman", "max_tokens": 25}, + "kum": {"name": "Kumyk", "native_name": "Къумукъ", "max_tokens": 12}, + "kvn": {"name": "Kuna, Border", "native_name": "Kuna, Border", "max_tokens": 25}, + "cuk": {"name": "Kuna, San Blas", "native_name": "Kuna, San Blas", "max_tokens": 25}, + "kdn": {"name": "Kunda", "native_name": "Kunda", "max_tokens": 25}, + "xuo": {"name": "Kuo", "native_name": "Kuo", "max_tokens": 25}, + "key": {"name": "Kupia", "native_name": "Kupia", "max_tokens": 25}, + "kpz": {"name": "Kupsapiiny", "native_name": "Kupsapiiny", "max_tokens": 12}, + "knk": {"name": "Kuranko", "native_name": "Kuranko", "max_tokens": 12}, + "kmr-script_latin": {"name": "Kurdish, Northern - Latin", "native_name": "Kurmancî", "max_tokens": 12}, + "kmr-script_arabic": {"name": "Kurdish, Northern - Arabic", "native_name": "كورمانجي", "max_tokens": 12}, + "kmr-script_cyrillic": {"name": "Kurdish, Northern - Cyrillic", "native_name": "Курманджи", "max_tokens": 12}, + "xua": {"name": "Kurumba, Alu", "native_name": "Kurumba", "max_tokens": 25}, + "kru": {"name": "Kurux", "native_name": "कुड़ुख", "max_tokens": 12}, + "kus": {"name": "Kusaal", "native_name": "Kusaal", "max_tokens": 25}, + "kub": {"name": "Kutep", "native_name": "Kutep", "max_tokens": 12}, + "kdc": {"name": "Kutu", "native_name": "Kutu", "max_tokens": 25}, + "kxv": {"name": "Kuvi", "native_name": "Kuvi", "max_tokens": 25}, + "blh": {"name": "Kuwaa", "native_name": "Kuwaa", "max_tokens": 12}, + "cwt": {"name": "Kuwaataay", "native_name": "Kuwaataay", "max_tokens": 12}, + "kwd": {"name": "Kwaio", "native_name": "Kwaio", "max_tokens": 25}, + "tnk": {"name": "Kwamera", "native_name": "Kwamera", "max_tokens": 25}, + "kwf": {"name": "Kwara’ae", "native_name": "Kwara’ae", "max_tokens": 25}, + "cwe": {"name": "Kwere", "native_name": "Kwere", "max_tokens": 12}, + "kyc": {"name": "Kyaka", "native_name": "Kyaka", "max_tokens": 25}, + "tye": {"name": "Kyanga", "native_name": "Kyanga", "max_tokens": 25}, + "kir": {"name": "Kyrgyz", "native_name": "Кыргызча", "max_tokens": 25}, + "quc-dialect_north": {"name": "K’iche’ - dialect North", "native_name": "K’iche’", "max_tokens": 25}, + "quc-dialect_east": {"name": "K’iche’ - dialect East", "native_name": "K’iche’", "max_tokens": 25}, + "quc-dialect_central": {"name": "K’iche’ - dialect Central", "native_name": "K’iche’", "max_tokens": 25}, + "lac": {"name": "Lacandon", "native_name": "Lacandon", "max_tokens": 12}, + "lsi": {"name": "Lacid", "native_name": "Lacid", "max_tokens": 25}, + "lbj": {"name": "Ladakhi", "native_name": "Ladakhi", "max_tokens": 12}, + "lhu": {"name": "Lahu", "native_name": "Lahu", "max_tokens": 25}, + "las": {"name": "Lama", "native_name": "Lama", "max_tokens": 25}, + "lam": {"name": "Lamba", "native_name": "Lamba", "max_tokens": 25}, + "lns": {"name": "Lamnso’", "native_name": "Lamnso’", "max_tokens": 25}, + "ljp": {"name": "Lampung Api", "native_name": "Lampung Api", "max_tokens": 25}, + "laj": {"name": "Lango", "native_name": "Lango", "max_tokens": 25}, + "lao": {"name": "Lao", "native_name": "ລາວ", "max_tokens": 25}, + "lat": {"name": "Latin", "native_name": "Latina", "max_tokens": 25}, + "lav": {"name": "Latvian", "native_name": "Latviešu", "max_tokens": 12}, + "law": {"name": "Lauje", "native_name": "Lauje", "max_tokens": 25}, + "lcp": {"name": "Lawa, Western", "native_name": "Lawa", "max_tokens": 25}, + "lzz": {"name": "Laz", "native_name": "ლაზური", "max_tokens": 12}, + "lln": {"name": "Lele", "native_name": "Lele", "max_tokens": 25}, + "lef": {"name": "Lelemi", "native_name": "Lelemi", "max_tokens": 12}, + "acf": {"name": "Lesser Antillean French Creole", "native_name": "Kwéyòl", "max_tokens": 12}, + "lww": {"name": "Lewo", "native_name": "Lewo", "max_tokens": 25}, + "mhx": {"name": "Lhao Vo", "native_name": "Lhao Vo", "max_tokens": 25}, + "eip": {"name": "Lik", "native_name": "Lik", "max_tokens": 25}, + "lia": {"name": "Limba, West-Central", "native_name": "Limba", "max_tokens": 25}, + "lif": {"name": "Limbu", "native_name": "ᤕᤠᤰᤌᤢᤱ", "max_tokens": 12}, + "lin": {"name": "Lingala", "native_name": "Lingála", "max_tokens": 25}, + "onb": {"name": "Lingao", "native_name": "Lingao", "max_tokens": 25}, + "lis": {"name": "Lisu", "native_name": "ꓡꓲꓢꓳ", "max_tokens": 25}, + "lit": {"name": "Lithuanian", "native_name": "Lietuvių", "max_tokens": 25}, + "loq": {"name": "Lobala", "native_name": "Lobala", "max_tokens": 25}, + "lob": {"name": "Lobi", "native_name": "Lobi", "max_tokens": 25}, + "yaz": {"name": "Lokaa", "native_name": "Lokaa", "max_tokens": 25}, + "lok": {"name": "Loko", "native_name": "Loko", "max_tokens": 25}, + "llg": {"name": "Lole", "native_name": "Lole", "max_tokens": 25}, + "ycl": {"name": "Lolopo", "native_name": "Lolopo", "max_tokens": 12}, + "lom": {"name": "Loma", "native_name": "Loma", "max_tokens": 25}, + "ngl": {"name": "Lomwe", "native_name": "Lomwe", "max_tokens": 12}, + "lon": {"name": "Lomwe, Malawi", "native_name": "Lomwe", "max_tokens": 12}, + "lex": {"name": "Luang", "native_name": "Luang", "max_tokens": 25}, + "lgg": {"name": "Lugbara", "native_name": "Lugbara", "max_tokens": 12}, + "ruf": {"name": "Luguru", "native_name": "Luguru", "max_tokens": 12}, + "dop": {"name": "Lukpa", "native_name": "Lukpa", "max_tokens": 12}, + "lnd": {"name": "Lundayeh", "native_name": "Lundayeh", "max_tokens": 12}, + "ndy": {"name": "Lutos", "native_name": "Lutos", "max_tokens": 25}, + "lwo": {"name": "Luwo", "native_name": "Luwo", "max_tokens": 25}, + "lee": {"name": "Lyélé", "native_name": "Lyélé", "max_tokens": 12}, + "mev": {"name": "Maan", "native_name": "Maan", "max_tokens": 25}, + "mfz": {"name": "Mabaan", "native_name": "Mabaan", "max_tokens": 25}, + "jmc": {"name": "Machame", "native_name": "Machame", "max_tokens": 25}, + "myy": {"name": "Macuna", "native_name": "Macuna", "max_tokens": 25}, + "mbc": {"name": "Macushi", "native_name": "Macushi", "max_tokens": 12}, + "mda": {"name": "Mada", "native_name": "Mada", "max_tokens": 25}, + "mad": {"name": "Madura", "native_name": "Madura", "max_tokens": 25}, + "mag": {"name": "Magahi", "native_name": "Magahi", "max_tokens": 25}, + "ayz": {"name": "Mai Brat", "native_name": "Mai Brat", "max_tokens": 25}, + "mai": {"name": "Maithili", "native_name": "मैथिली", "max_tokens": 12}, + "mca": {"name": "Maka", "native_name": "Maka", "max_tokens": 25}, + "mcp": {"name": "Makaa", "native_name": "Makaa", "max_tokens": 25}, + "mak": {"name": "Makasar", "native_name": "Makasar", "max_tokens": 25}, + "vmw": {"name": "Makhuwa", "native_name": "Makhuwa", "max_tokens": 12}, + "mgh": {"name": "Makhuwa-Meetto", "native_name": "Makhuwa-Meetto", "max_tokens": 25}, + "kde": {"name": "Makonde", "native_name": "Makonde", "max_tokens": 12}, + "mlg": {"name": "Malagasy", "native_name": "Malagasy", "max_tokens": 25}, + "zlm": {"name": "Malay", "native_name": "Bahasa Melayu", "max_tokens": 25}, + "pse": {"name": "Malay, Central", "native_name": "Bahasa Melayu Tengah", "max_tokens": 25}, + "mkn": {"name": "Malay, Kupang", "native_name": "Bahasa Melayu Kupang", "max_tokens": 25}, + "xmm": {"name": "Malay, Manado", "native_name": "Bahasa Melayu Manado", "max_tokens": 25}, + "mal": {"name": "Malayalam", "native_name": "മലയാളം", "max_tokens": 12}, + "xdy": {"name": "Malayic Dayak", "native_name": "Dayak Melayu", "max_tokens": 25}, + "div": {"name": "Maldivian", "native_name": "ދިވެހި", "max_tokens": 12}, + "mdy": {"name": "Male", "native_name": "Male", "max_tokens": 25}, + "mlt": {"name": "Maltese", "native_name": "Malti", "max_tokens": 25}, + "mup": {"name": "Malvi", "native_name": "Malvi", "max_tokens": 25}, + "mam-dialect_central": {"name": "Mam - dialect Central", "native_name": "Mam", "max_tokens": 25}, + "mam-dialect_northern": {"name": "Mam - dialect Northern", "native_name": "Mam", "max_tokens": 25}, + "mam-dialect_southern": {"name": "Mam - dialect Southern", "native_name": "Mam", "max_tokens": 25}, + "mam-dialect_western": {"name": "Mam - dialect Western", "native_name": "Mam", "max_tokens": 25}, + "mqj": {"name": "Mamasa", "native_name": "Mamasa", "max_tokens": 25}, + "mcu": {"name": "Mambila, Cameroon", "native_name": "Mambila", "max_tokens": 12}, + "mzk": {"name": "Mambila, Nigeria", "native_name": "Mambila", "max_tokens": 12}, + "maw": {"name": "Mampruli", "native_name": "Mampruli", "max_tokens": 12}, + "mjl": {"name": "Mandeali", "native_name": "Mandeali", "max_tokens": 12}, + "mnk": {"name": "Mandinka", "native_name": "Mandinka", "max_tokens": 12}, + "mge": {"name": "Mango", "native_name": "Mango", "max_tokens": 25}, + "mbh": {"name": "Mangseng", "native_name": "Mangseng", "max_tokens": 12}, + "knf": {"name": "Mankanya", "native_name": "Mankanya", "max_tokens": 12}, + "mjv": {"name": "Mannan", "native_name": "Mannan", "max_tokens": 25}, + "mbt": {"name": "Manobo, Matigsalug", "native_name": "Manobo", "max_tokens": 12}, + "obo": {"name": "Manobo, Obo", "native_name": "Manobo", "max_tokens": 12}, + "mbb": {"name": "Manobo, Western Bukidnon", "native_name": "Manobo", "max_tokens": 12}, + "mzj": {"name": "Manya", "native_name": "Manya", "max_tokens": 25}, + "sjm": {"name": "Mapun", "native_name": "Mapun", "max_tokens": 25}, + "mrw": {"name": "Maranao", "native_name": "Maranao", "max_tokens": 12}, + "mar": {"name": "Marathi", "native_name": "मराठी", "max_tokens": 25}, + "mpg": {"name": "Marba", "native_name": "Marba", "max_tokens": 25}, + "mhr": {"name": "Mari, Meadow", "native_name": "Марий", "max_tokens": 25}, + "enb": {"name": "Markweeta", "native_name": "Markweeta", "max_tokens": 12}, + "mah": {"name": "Marshallese", "native_name": "Kajin M̧ajeļ", "max_tokens": 12}, + "myx": {"name": "Masaaba", "native_name": "Masaaba", "max_tokens": 25}, + "klv": {"name": "Maskelynes", "native_name": "Maskelynes", "max_tokens": 12}, + "mfh": {"name": "Matal", "native_name": "Matal", "max_tokens": 25}, + "met": {"name": "Mato", "native_name": "Mato", "max_tokens": 25}, + "mcb": {"name": "Matsigenka", "native_name": "Matsigenka", "max_tokens": 12}, + "mop": {"name": "Maya, Mopán", "native_name": "Mopán", "max_tokens": 25}, + "yua": {"name": "Maya, Yucatec", "native_name": "Yucateco", "max_tokens": 12}, + "mfy": {"name": "Mayo", "native_name": "Mayo", "max_tokens": 25}, + "maz": {"name": "Mazahua, Central", "native_name": "Mazahua", "max_tokens": 12}, + "vmy": {"name": "Mazatec, Ayautla", "native_name": "Ayautla", "max_tokens": 12}, + "maq": {"name": "Mazatec, Chiquihuitlán", "native_name": "Chiquihuitlán", "max_tokens": 12}, + "mzi": {"name": "Mazatec, Ixcatlán", "native_name": "Ixcatlán", "max_tokens": 12}, + "maj": {"name": "Mazatec, Jalapa de Díaz", "native_name": "Jalapa de Díaz", "max_tokens": 25}, + "maa-dialect_sanantonio": {"name": "Mazatec, San Jerónimo Tecóatl - dialect San Antonio", "native_name": "San Jerónimo Tecóatl", "max_tokens": 25}, + "maa-dialect_sanjerónimo": {"name": "Mazatec, San Jerónimo Tecóatl - dialect San Jerónimo", "native_name": "San Jerónimo Tecóatl", "max_tokens": 25}, + "mhy": {"name": "Ma’anyan", "native_name": "Ma’anyan", "max_tokens": 25}, + "mhi": {"name": "Ma’di", "native_name": "Ma’di", "max_tokens": 25}, + "zmz": {"name": "Mbandja", "native_name": "Mbandja", "max_tokens": 12}, + "myb": {"name": "Mbay", "native_name": "Mbay", "max_tokens": 25}, + "gai": {"name": "Mbore", "native_name": "Mbore", "max_tokens": 25}, + "mqb": {"name": "Mbuko", "native_name": "Mbuko", "max_tokens": 12}, + "mbu": {"name": "Mbula-Bwazza", "native_name": "Mbula-Bwazza", "max_tokens": 25}, + "med": {"name": "Melpa", "native_name": "Melpa", "max_tokens": 25}, + "men": {"name": "Mende", "native_name": "Mende", "max_tokens": 25}, + "mee": {"name": "Mengen", "native_name": "Mengen", "max_tokens": 25}, + "mwv": {"name": "Mentawai", "native_name": "Mentawai", "max_tokens": 12}, + "meq": {"name": "Merey", "native_name": "Merey", "max_tokens": 25}, + "zim": {"name": "Mesme", "native_name": "Mesme", "max_tokens": 25}, + "mgo": {"name": "Meta’", "native_name": "Meta’", "max_tokens": 25}, + "mej": {"name": "Meyah", "native_name": "Meyah", "max_tokens": 25}, + "mpp": {"name": "Migabac", "native_name": "Migabac", "max_tokens": 12}, + "min": {"name": "Minangkabau", "native_name": "Minangkabau", "max_tokens": 12}, + "gum": {"name": "Misak", "native_name": "Misak", "max_tokens": 25}, + "mpx": {"name": "Misima-Panaeati", "native_name": "Misima-Panaeati", "max_tokens": 25}, + "mco": {"name": "Mixe, Coatlán", "native_name": "Coatlán", "max_tokens": 12}, + "mxq": {"name": "Mixe, Juquila", "native_name": "Juquila", "max_tokens": 25}, + "pxm": {"name": "Mixe, Quetzaltepec", "native_name": "Mixe, Quetzaltepec", "max_tokens": 12}, + "mto": {"name": "Mixe, Totontepec", "native_name": "Mixe, Totontepec", "max_tokens": 25}, + "mim": {"name": "Mixtec, Alacatlatzala", "native_name": "Mixtec, Alacatlatzala", "max_tokens": 12}, + "xta": {"name": "Mixtec, Alcozauca", "native_name": "Mixtec, Alcozauca", "max_tokens": 12}, + "mbz": {"name": "Mixtec, Amoltepec", "native_name": "Mixtec, Amoltepec", "max_tokens": 12}, + "mip": {"name": "Mixtec, Apasco-Apoala", "native_name": "Mixtec, Apasco-Apoala", "max_tokens": 25}, + "mib": {"name": "Mixtec, Atatlahuca", "native_name": "Mixtec, Atatlahuca", "max_tokens": 12}, + "miy": {"name": "Mixtec, Ayutla", "native_name": "Mixtec, Ayutla", "max_tokens": 25}, + "mih": {"name": "Mixtec, Chayuco", "native_name": "Mixtec, Chayuco", "max_tokens": 25}, + "miz": {"name": "Mixtec, Coatzospan", "native_name": "Mixtec, Coatzospan", "max_tokens": 12}, + "xtd": {"name": "Mixtec, Diuxi-Tilantongo", "native_name": "Mixtec, Diuxi-Tilantongo", "max_tokens": 25}, + "mxt": {"name": "Mixtec, Jamiltepec", "native_name": "Mixtec, Jamiltepec", "max_tokens": 12}, + "xtm": {"name": "Mixtec, Magdalena Peñasco", "native_name": "Mixtec, Magdalena Peñasco", "max_tokens": 25}, + "mxv": {"name": "Mixtec, Metlatónoc", "native_name": "Mixtec, Metlatónoc", "max_tokens": 12}, + "xtn": {"name": "Mixtec, Northern Tlaxiaco", "native_name": "Mixtec, Northern Tlaxiaco", "max_tokens": 25}, + "mie": {"name": "Mixtec, Ocotepec", "native_name": "Mixtec, Ocotepec", "max_tokens": 25}, + "mil": {"name": "Mixtec, Peñoles", "native_name": "Mixtec, Peñoles", "max_tokens": 25}, + "mio": {"name": "Mixtec, Pinotepa Nacional", "native_name": "Mixtec, Pinotepa Nacional", "max_tokens": 25}, + "mdv": {"name": "Mixtec, Santa Lucía Monteverde", "native_name": "Mixtec, Santa Lucía Monteverde", "max_tokens": 25}, + "mza": {"name": "Mixtec, Santa María Zacatepec", "native_name": "Mixtec, Santa María Zacatepec", "max_tokens": 25}, + "mit": {"name": "Mixtec, Southern Puebla", "native_name": "Mixtec, Southern Puebla", "max_tokens": 25}, + "mxb": {"name": "Mixtec, Tezoatlán", "native_name": "Mixtec, Tezoatlán", "max_tokens": 12}, + "mpm": {"name": "Mixtec, Yosondúa", "native_name": "Mixtec, Yosondúa", "max_tokens": 12}, + "soy": {"name": "Miyobe", "native_name": "Miyobe", "max_tokens": 12}, + "cmo-script_latin": {"name": "Mnong, Central - Latin", "native_name": "Mnong, Central", "max_tokens": 25}, + "cmo-script_khmer": {"name": "Mnong, Central - Khmer", "native_name": "Mnong, Central", "max_tokens": 25}, + "mfq": {"name": "Moba", "native_name": "Moba", "max_tokens": 25}, + "old": {"name": "Mochi", "native_name": "Mochi", "max_tokens": 25}, + "mfk": {"name": "Mofu, North", "native_name": "Mofu, North", "max_tokens": 25}, + "mif": {"name": "Mofu-Gudur", "native_name": "Mofu-Gudur", "max_tokens": 25}, + "mkl": {"name": "Mokole", "native_name": "Mokole", "max_tokens": 25}, + "mox": {"name": "Molima", "native_name": "Molima", "max_tokens": 25}, + "myl": {"name": "Moma", "native_name": "Moma", "max_tokens": 25}, + "mqf": {"name": "Momuna", "native_name": "Momuna", "max_tokens": 12}, + "mnw": {"name": "Mon", "native_name": "မွန်", "max_tokens": 12}, + "mon": {"name": "Mongolian", "native_name": "Монгол", "max_tokens": 25}, + "mog": {"name": "Mongondow", "native_name": "Mongondow", "max_tokens": 12}, + "mfe": {"name": "Morisyen", "native_name": "Morisyen", "max_tokens": 25}, + "mor": {"name": "Moro", "native_name": "Moro", "max_tokens": 25}, + "mqn": {"name": "Moronene", "native_name": "Moronene", "max_tokens": 25}, + "mgd": {"name": "Moru", "native_name": "Moru", "max_tokens": 25}, + "mtj": {"name": "Moskona", "native_name": "Moskona", "max_tokens": 12}, + "cmr": {"name": "Mro-Khimi", "native_name": "Mro-Khimi", "max_tokens": 25}, + "mtd": {"name": "Mualang", "native_name": "Mualang", "max_tokens": 25}, + "bmr": {"name": "Muinane", "native_name": "Muinane", "max_tokens": 12}, + "moz": {"name": "Mukulu", "native_name": "Mukulu", "max_tokens": 12}, + "mzm": {"name": "Mumuye", "native_name": "Mumuye", "max_tokens": 12}, + "mnb": {"name": "Muna", "native_name": "Muna", "max_tokens": 25}, + "mnf": {"name": "Mundani", "native_name": "Mundani", "max_tokens": 12}, + "unr": {"name": "Mundari", "native_name": "Mundari", "max_tokens": 12}, + "fmu": {"name": "Muria, Far Western", "native_name": "Muria, Far Western", "max_tokens": 25}, + "mur": {"name": "Murle", "native_name": "Murle", "max_tokens": 25}, + "tih": {"name": "Murut, Timugon", "native_name": "Murut, Timugon", "max_tokens": 25}, + "muv": {"name": "Muthuvan", "native_name": "Muthuvan", "max_tokens": 12}, + "muy": {"name": "Muyang", "native_name": "Muyang", "max_tokens": 25}, + "sur": {"name": "Mwaghavul", "native_name": "Mwaghavul", "max_tokens": 12}, + "moa": {"name": "Mwan", "native_name": "Mwan", "max_tokens": 25}, + "wmw": {"name": "Mwani", "native_name": "Mwani", "max_tokens": 25}, + "tnr": {"name": "Ménik", "native_name": "Ménik", "max_tokens": 12}, + "miq": {"name": "Mískito", "native_name": "Mískito", "max_tokens": 12}, + "mos": {"name": "Mòoré", "native_name": "Mòoré", "max_tokens": 12}, + "muh": {"name": "Mündü", "native_name": "Mündü", "max_tokens": 12}, + "nas": {"name": "Naasioi", "native_name": "Naasioi", "max_tokens": 12}, + "mbj": {"name": "Nadëb", "native_name": "Nadëb", "max_tokens": 12}, + "nfr": {"name": "Nafaanra", "native_name": "Nafaanra", "max_tokens": 12}, + "kfw": {"name": "Naga, Kharam", "native_name": "Naga, Kharam", "max_tokens": 25}, + "nst": {"name": "Naga, Tangshang", "native_name": "Naga, Tangshang", "max_tokens": 25}, + "nag": {"name": "Nagamese", "native_name": "Nagamese", "max_tokens": 12}, + "nch": {"name": "Nahuatl, Central Huasteca", "native_name": "Nāhuatl Central Huasteca", "max_tokens": 12}, + "nhe": {"name": "Nahuatl, Eastern Huasteca", "native_name": "Nāhuatl Eastern Huastec", "max_tokens": 12}, + "ngu": {"name": "Nahuatl, Guerrero", "native_name": "Nāhuatl Guerrero", "max_tokens": 12}, + "azz": {"name": "Nahuatl, Highland Puebla", "native_name": "Nāhuatl Puebla Alta", "max_tokens": 25}, + "nhx": {"name": "Nahuatl, Isthmus-Mecayapan", "native_name": "Nāhuatl Istmo Mecayapan", "max_tokens": 12}, + "ncl": {"name": "Nahuatl, Michoacán", "native_name": "Nāhuatl Michoacán", "max_tokens": 12}, + "nhy": {"name": "Nahuatl, Northern Oaxaca", "native_name": "Nāhuatl Oaxaca Norte", "max_tokens": 25}, + "ncj": {"name": "Nahuatl, Northern Puebla", "native_name": "Nāhuatl Puebla Norte", "max_tokens": 25}, + "nsu": {"name": "Nahuatl, Sierra Negra", "native_name": "Nāhuatl Sierra Negra", "max_tokens": 25}, + "npl": {"name": "Nahuatl, Southeastern Puebla", "native_name": "Nāhuatl Sureste Puebla", "max_tokens": 12}, + "nuz": {"name": "Nahuatl, Tlamacazapa", "native_name": "Nāhuatl Tlamacazapa", "max_tokens": 12}, + "nhw": {"name": "Nahuatl, Western Huasteca", "native_name": "Nahuatl, Western Huasteca", "max_tokens": 25}, + "nhi": {"name": "Nahuatl, Zacatlán-Ahuacatlán-Tepetzintla", "native_name": "Nāhuatl Zacatlán-Ahuacatlán-Tepetzintla", "max_tokens": 12}, + "nlc": {"name": "Nalca", "native_name": "Nalca", "max_tokens": 25}, + "nab": {"name": "Nambikuára, Southern", "native_name": "Nambikuára Meridional", "max_tokens": 12}, + "gld": {"name": "Nanai", "native_name": "Нанай", "max_tokens": 25}, + "nnb": {"name": "Nande", "native_name": "Nande", "max_tokens": 25}, + "npy": {"name": "Napu", "native_name": "Napu", "max_tokens": 25}, + "pbb": {"name": "Nasa", "native_name": "Nasa Yuwe", "max_tokens": 25}, + "ntm": {"name": "Nateni", "native_name": "Nateni", "max_tokens": 25}, + "nmz": {"name": "Nawdm", "native_name": "Nawdm", "max_tokens": 12}, + "naw": {"name": "Nawuri", "native_name": "Nawuri", "max_tokens": 12}, + "nxq": {"name": "Naxi", "native_name": "纳西语", "max_tokens": 12}, + "ndj": {"name": "Ndamba", "native_name": "Ndamba", "max_tokens": 12}, + "ndz": {"name": "Ndogo", "native_name": "Ndogo", "max_tokens": 25}, + "ndv": {"name": "Ndut", "native_name": "Ndut", "max_tokens": 12}, + "new": {"name": "Newar", "native_name": "नेपाल भाषा", "max_tokens": 12}, + "nij": {"name": "Ngaju", "native_name": "Ngaju", "max_tokens": 25}, + "sba": {"name": "Ngambay", "native_name": "Ngambay", "max_tokens": 12}, + "gng": {"name": "Ngangam", "native_name": "Ngangam", "max_tokens": 12}, + "nga": {"name": "Ngbaka", "native_name": "Ngbaka", "max_tokens": 12}, + "nnq": {"name": "Ngindo", "native_name": "Ngindo", "max_tokens": 25}, + "ngp": {"name": "Ngulu", "native_name": "Ngulu", "max_tokens": 25}, + "gym": {"name": "Ngäbere", "native_name": "Ngäbere", "max_tokens": 12}, + "kdj": {"name": "Ng’akarimojong", "native_name": "Ng’akarimojong", "max_tokens": 25}, + "nia": {"name": "Nias", "native_name": "Nias", "max_tokens": 25}, + "nim": {"name": "Nilamba", "native_name": "Nilamba", "max_tokens": 12}, + "nin": {"name": "Ninzo", "native_name": "Ninzo", "max_tokens": 25}, + "nko": {"name": "Nkonya", "native_name": "Nkonya", "max_tokens": 12}, + "nog": {"name": "Nogai", "native_name": "Nogai", "max_tokens": 25}, + "lem": {"name": "Nomaande", "native_name": "Nomaande", "max_tokens": 12}, + "not": {"name": "Nomatsigenga", "native_name": "Nomatsigenga", "max_tokens": 12}, + "nhu": {"name": "Noone", "native_name": "Noone", "max_tokens": 25}, + "nob": {"name": "Norwegian Bokmål", "native_name": "norsk bokmål", "max_tokens": 25}, + "bud": {"name": "Ntcham", "native_name": "Ntcham", "max_tokens": 12}, + "nus": {"name": "Nuer", "native_name": "Nuer", "max_tokens": 25}, + "yas": {"name": "Nugunu", "native_name": "Nugunu", "max_tokens": 12}, + "nnw": {"name": "Nuni, Southern", "native_name": "Nuni, Southern", "max_tokens": 25}, + "nwb": {"name": "Nyabwa", "native_name": "Nyabwa", "max_tokens": 12}, + "nyy": {"name": "Nyakyusa-Ngonde", "native_name": "Nyakyusa-Ngonde", "max_tokens": 25}, + "nyn": {"name": "Nyankore", "native_name": "Nyankore", "max_tokens": 12}, + "rim": {"name": "Nyaturu", "native_name": "Nyaturu", "max_tokens": 12}, + "lid": {"name": "Nyindrou", "native_name": "Nyindrou", "max_tokens": 12}, + "nuj": {"name": "Nyole", "native_name": "Nyole", "max_tokens": 25}, + "nyo": {"name": "Nyoro", "native_name": "Nyoro", "max_tokens": 25}, + "nzi": {"name": "Nzema", "native_name": "Nzema", "max_tokens": 12}, + "ann": {"name": "Obolo", "native_name": "Obolo", "max_tokens": 25}, + "ory": {"name": "Odia", "native_name": "ଓଡ଼ିଆ", "max_tokens": 12}, + "ojb-script_latin": {"name": "Ojibwa, Northwestern - Latin", "native_name": "Ojibwa", "max_tokens": 12}, + "ojb-script_syllabics": {"name": "Ojibwa, Northwestern - Syllabics", "native_name": "ᐊᒋᒧᐎᓐ", "max_tokens": 25}, + "oku": {"name": "Oku", "native_name": "Oku", "max_tokens": 25}, + "bsc": {"name": "Oniyan", "native_name": "Oniyan", "max_tokens": 25}, + "bdu": {"name": "Oroko", "native_name": "Oroko", "max_tokens": 25}, + "orm": {"name": "Oromo", "native_name": "Oromoo", "max_tokens": 12}, + "ury": {"name": "Orya", "native_name": "Orya", "max_tokens": 25}, + "oss": {"name": "Ossetic", "native_name": "Ирон", "max_tokens": 25}, + "ote": {"name": "Otomi, Mezquital", "native_name": "Hñähñu", "max_tokens": 12}, + "otq": {"name": "Otomi, Querétaro", "native_name": "Ñañhö", "max_tokens": 12}, + "stn": {"name": "Owa", "native_name": "Owa", "max_tokens": 25}, + "sig": {"name": "Paasaal", "native_name": "Paasaal", "max_tokens": 12}, + "kfx": {"name": "Pahari, Kullu", "native_name": "कुल्लू पहाड़ी", "max_tokens": 12}, + "bfz": {"name": "Pahari, Mahasu", "native_name": "महासू पहाड़ी", "max_tokens": 12}, + "sey": {"name": "Paicoca", "native_name": "Paicoca", "max_tokens": 12}, + "pao": {"name": "Paiute, Northern", "native_name": "Numu", "max_tokens": 25}, + "pau": {"name": "Palauan", "native_name": "Palauan", "max_tokens": 25}, + "pce": {"name": "Palaung, Ruching", "native_name": "Ruching", "max_tokens": 12}, + "plw": {"name": "Palawano, Brooke’s Point", "native_name": "Palawano", "max_tokens": 12}, + "pmf": {"name": "Pamona", "native_name": "Pamona", "max_tokens": 25}, + "pag": {"name": "Pangasinan", "native_name": "Pangasinan", "max_tokens": 12}, + "pap": {"name": "Papiamentu", "native_name": "Papiamentu", "max_tokens": 12}, + "prf": {"name": "Paranan", "native_name": "Paranan", "max_tokens": 25}, + "pab": {"name": "Parecís", "native_name": "Haliti", "max_tokens": 25}, + "pbi": {"name": "Parkwa", "native_name": "Parkwa", "max_tokens": 25}, + "pbc": {"name": "Patamona", "native_name": "Patamona", "max_tokens": 12}, + "pad": {"name": "Paumarí", "native_name": "Paumarí", "max_tokens": 12}, + "ata": {"name": "Pele-Ata", "native_name": "Pele-Ata", "max_tokens": 25}, + "pez": {"name": "Penan, Eastern", "native_name": "Penan", "max_tokens": 25}, + "peg": {"name": "Pengo", "native_name": "Pengo", "max_tokens": 25}, + "pcm": {"name": "Pidgin, Nigerian", "native_name": "Naijá", "max_tokens": 12}, + "pis": {"name": "Pijin", "native_name": "Pijin", "max_tokens": 25}, + "pny": {"name": "Pinyin", "native_name": "Pinyin", "max_tokens": 25}, + "pir": {"name": "Piratapuyo", "native_name": "Piratapuyo", "max_tokens": 12}, + "pjt": {"name": "Pitjantjatjara", "native_name": "Pitjantjatjara", "max_tokens": 12}, + "poy": {"name": "Pogolo", "native_name": "Pogolo", "max_tokens": 12}, + "pps": {"name": "Popoloca, San Luís Temalacayuca", "native_name": "Popoloca de San Luís Temalacayuca", "max_tokens": 25}, + "pls": {"name": "Popoloca, San Marcos Tlacoyalco", "native_name": "Popoloca de San Marcos Tlacoyalco", "max_tokens": 25}, + "poi": {"name": "Popoluca, Highland", "native_name": "Popoluca de la Sierra", "max_tokens": 25}, + "poh-dialect_eastern": {"name": "Poqomchi’ - dialect Eastern", "native_name": "Poqomchi’", "max_tokens": 12}, + "poh-dialect_western": {"name": "Poqomchi’ - dialect Western", "native_name": "Poqomchi’", "max_tokens": 12}, + "prt": {"name": "Prai", "native_name": "Prai", "max_tokens": 25}, + "pui": {"name": "Puinave", "native_name": "Puinave", "max_tokens": 12}, + "pan": {"name": "Punjabi, Eastern", "native_name": "ਪੰਜਾਬੀ", "max_tokens": 12}, + "tsz": {"name": "Purepecha", "native_name": "Purépecha", "max_tokens": 12}, + "suv": {"name": "Puroik", "native_name": "Puroik", "max_tokens": 12}, + "lme": {"name": "Pévé", "native_name": "Pévé", "max_tokens": 12}, + "quy": {"name": "Quechua, Ayacucho", "native_name": "Runasimi", "max_tokens": 12}, + "qvc": {"name": "Quechua, Cajamarca", "native_name": "Runasimi", "max_tokens": 12}, + "quz": {"name": "Quechua, Cusco", "native_name": "Runasimi", "max_tokens": 12}, + "qve": {"name": "Quechua, Eastern Apurímac", "native_name": "Runasimi", "max_tokens": 12}, + "qub": {"name": "Quechua, Huallaga", "native_name": "Runasimi", "max_tokens": 12}, + "qvh": {"name": "Quechua, Huamalíes-Dos de Mayo Huánuco", "native_name": "Runasimi", "max_tokens": 12}, + "qwh": {"name": "Quechua, Huaylas Ancash", "native_name": "Runasimi", "max_tokens": 12}, + "qvw": {"name": "Quechua, Huaylla Wanca", "native_name": "Runasimi", "max_tokens": 12}, + "quf": {"name": "Quechua, Lambayeque", "native_name": "Runasimi", "max_tokens": 12}, + "qvm": {"name": "Quechua, Margos-Yarowilca-Lauricocha", "native_name": "Runasimi", "max_tokens": 12}, + "qul": {"name": "Quechua, North Bolivian", "native_name": "Runasimi", "max_tokens": 12}, + "qvn": {"name": "Quechua, North Junín", "native_name": "Runasimi", "max_tokens": 12}, + "qxn": {"name": "Quechua, Northern Conchucos Ancash", "native_name": "Runasimi", "max_tokens": 12}, + "qxh": {"name": "Quechua, Panao", "native_name": "Runasimi", "max_tokens": 12}, + "qvs": {"name": "Quechua, San Martín", "native_name": "Runasimi", "max_tokens": 12}, + "quh": {"name": "Quechua, South Bolivian", "native_name": "Runasimi", "max_tokens": 12}, + "qxo": {"name": "Quechua, Southern Conchucos", "native_name": "Runasimi", "max_tokens": 12}, + "qxr": {"name": "Quichua, Cañar Highland", "native_name": "Runasimi", "max_tokens": 12}, + "qvo": {"name": "Quichua, Napo", "native_name": "Runasimi", "max_tokens": 12}, + "qvz": {"name": "Quichua, Northern Pastaza", "native_name": "Runasimi", "max_tokens": 12}, + "qxl": {"name": "Quichua, Salasaca Highland", "native_name": "Runasimi", "max_tokens": 12}, + "quw": {"name": "Quichua, Tena Lowland", "native_name": "Runasimi", "max_tokens": 12}, + "kjb": {"name": "Q’anjob’al", "native_name": "Q’anjob’al", "max_tokens": 25}, + "kek": {"name": "Q’eqchi’", "native_name": "Q’eqchi’", "max_tokens": 25}, + "rah": {"name": "Rabha", "native_name": "Rabha", "max_tokens": 12}, + "rjs": {"name": "Rajbanshi", "native_name": "Rajbanshi", "max_tokens": 12}, + "rai": {"name": "Ramoaaina", "native_name": "Ramoaaina", "max_tokens": 12}, + "lje": {"name": "Rampi", "native_name": "Rampi", "max_tokens": 25}, + "rnl": {"name": "Ranglong", "native_name": "Ranglong", "max_tokens": 25}, + "rkt": {"name": "Rangpuri", "native_name": "Rangpuri", "max_tokens": 25}, + "rap": {"name": "Rapa Nui", "native_name": "Rapa Nui", "max_tokens": 25}, + "yea": {"name": "Ravula", "native_name": "Ravula", "max_tokens": 12}, + "raw": {"name": "Rawang", "native_name": "Rawang", "max_tokens": 25}, + "rej": {"name": "Rejang", "native_name": "Rejang", "max_tokens": 25}, + "rel": {"name": "Rendille", "native_name": "Rendille", "max_tokens": 12}, + "ril": {"name": "Riang Lang", "native_name": "Riang Lang", "max_tokens": 25}, + "iri": {"name": "Rigwe", "native_name": "Rigwe", "max_tokens": 12}, + "rgu": {"name": "Rikou", "native_name": "Rikou", "max_tokens": 12}, + "rhg": {"name": "Rohingya", "native_name": "Ruáingga", "max_tokens": 12}, + "rmc-script_latin": {"name": "Romani, Carpathian - Latin", "native_name": "Romani Čhib", "max_tokens": 25}, + "rmc-script_cyrillic": {"name": "Romani, Carpathian - Cyrillic", "native_name": "Романи Чхиб", "max_tokens": 12}, + "rmo": {"name": "Romani, Sinte", "native_name": "Romanes", "max_tokens": 25}, + "rmy-script_latin": {"name": "Romani, Vlax - Latin", "native_name": "Romani Čhib", "max_tokens": 25}, + "rmy-script_cyrillic": {"name": "Romani, Vlax - Cyrillic", "native_name": "Романи Чхиб", "max_tokens": 12}, + "ron": {"name": "Romanian", "native_name": "Română", "max_tokens": 25}, + "rol": {"name": "Romblomanon", "native_name": "Romblomanon", "max_tokens": 12}, + "cla": {"name": "Ron", "native_name": "Ron", "max_tokens": 25}, + "rng": {"name": "Ronga", "native_name": "Ronga", "max_tokens": 25}, + "rug": {"name": "Roviana", "native_name": "Roviana", "max_tokens": 12}, + "run": {"name": "Rundi", "native_name": "Ikirundi", "max_tokens": 12}, + "lsm": {"name": "Saamya-Gwe", "native_name": "Saamya-Gwe", "max_tokens": 25}, + "spy": {"name": "Sabaot", "native_name": "Sabaot", "max_tokens": 25}, + "sck": {"name": "Sadri", "native_name": "Sadri", "max_tokens": 25}, + "saj": {"name": "Sahu", "native_name": "Sahu", "max_tokens": 25}, + "sch": {"name": "Sakachep", "native_name": "Sakachep", "max_tokens": 12}, + "sml": {"name": "Sama, Central", "native_name": "Sama", "max_tokens": 25}, + "xsb": {"name": "Sambal", "native_name": "Sambal", "max_tokens": 25}, + "sbl": {"name": "Sambal, Botolan", "native_name": "Sambal Botolan", "max_tokens": 12}, + "saq": {"name": "Samburu", "native_name": "Samburu", "max_tokens": 25}, + "sbd": {"name": "Samo, Southern", "native_name": "Samo", "max_tokens": 25}, + "smo": {"name": "Samoan", "native_name": "Gagana fa'a Samoa", "max_tokens": 25}, + "rav": {"name": "Sampang", "native_name": "Sampang", "max_tokens": 25}, + "sxn": {"name": "Sangir", "native_name": "Sangir", "max_tokens": 25}, + "sag": {"name": "Sango", "native_name": "Sängö", "max_tokens": 12}, + "sbp": {"name": "Sangu", "native_name": "Sangu", "max_tokens": 25}, + "xsu": {"name": "Sanumá", "native_name": "Sanumá", "max_tokens": 12}, + "srm": {"name": "Saramaccan", "native_name": "Saramaccan", "max_tokens": 12}, + "sas": {"name": "Sasak", "native_name": "Sasak", "max_tokens": 25}, + "apb": {"name": "Sa’a", "native_name": "Sa’a", "max_tokens": 25}, + "sgw": {"name": "Sebat Bet Gurage", "native_name": "Sebat Bet Gurage", "max_tokens": 25}, + "tvw": {"name": "Sedoa", "native_name": "Sedoa", "max_tokens": 12}, + "lip": {"name": "Sekpele", "native_name": "Sekpele", "max_tokens": 12}, + "slu": {"name": "Selaru", "native_name": "Selaru", "max_tokens": 12}, + "snw": {"name": "Selee", "native_name": "Selee", "max_tokens": 25}, + "sea": {"name": "Semai", "native_name": "Semai", "max_tokens": 25}, + "sza": {"name": "Semelai", "native_name": "Semelai", "max_tokens": 12}, + "seh": {"name": "Sena", "native_name": "Sena", "max_tokens": 25}, + "crs": {"name": "Seychelles French Creole", "native_name": "Kreol Seselwa", "max_tokens": 12}, + "ksb": {"name": "Shambala", "native_name": "Kishambala", "max_tokens": 12}, + "shn": {"name": "Shan", "native_name": "Shan", "max_tokens": 25}, + "sho": {"name": "Shanga", "native_name": "Shanga", "max_tokens": 25}, + "mcd": {"name": "Sharanahua", "native_name": "Sharanahua", "max_tokens": 12}, + "cbt": {"name": "Shawi", "native_name": "Shawi", "max_tokens": 25}, + "xsr": {"name": "Sherpa", "native_name": "ཤར་པཱ", "max_tokens": 25}, + "shk": {"name": "Shilluk", "native_name": "Shilluk", "max_tokens": 12}, + "shp": {"name": "Shipibo-Conibo", "native_name": "Shipibo-Conibo", "max_tokens": 25}, + "sna": {"name": "Shona", "native_name": "ChiShona", "max_tokens": 12}, + "cjs": {"name": "Shor", "native_name": "Шор тили", "max_tokens": 25}, + "jiv": {"name": "Shuar", "native_name": "Shuar", "max_tokens": 25}, + "snp": {"name": "Siane", "native_name": "Siane", "max_tokens": 25}, + "sya": {"name": "Siang", "native_name": "Siang", "max_tokens": 25}, + "sid": {"name": "Sidamo", "native_name": "Sidamo", "max_tokens": 25}, + "snn": {"name": "Siona", "native_name": "Siona", "max_tokens": 25}, + "sri": {"name": "Siriano", "native_name": "Siriano", "max_tokens": 25}, + "srx": {"name": "Sirmauri", "native_name": "Sirmauri", "max_tokens": 12}, + "sil": {"name": "Sisaala, Tumulung", "native_name": "Sisaala, Tumulung", "max_tokens": 12}, + "sld": {"name": "Sissala", "native_name": "Sissala", "max_tokens": 12}, + "akp": {"name": "Siwu", "native_name": "Siwu", "max_tokens": 25}, + "slk": {"name": "Slovak", "native_name": "Slovenčina", "max_tokens": 25}, + "sln": {"name": "Slovenian", "native_name": "Slovenščina", "max_tokens": 25}, + "xog": {"name": "Soga", "native_name": "Soga", "max_tokens": 25}, + "som": {"name": "Somali", "native_name": "Soomaali", "max_tokens": 12}, + "bmu": {"name": "Somba-Siawari", "native_name": "Somba-Siawari", "max_tokens": 25}, + "khq": {"name": "Songhay, Koyra Chiini", "native_name": "Songhay, Koyra Chiini", "max_tokens": 25}, + "ses": {"name": "Songhay, Koyraboro Senni", "native_name": "Songhay, Koyraboro Senni", "max_tokens": 25}, + "mnx": {"name": "Sougb", "native_name": "Sougb", "max_tokens": 12}, + "srn": {"name": "Sranan Tongo", "native_name": "Sranan Tongo", "max_tokens": 25}, + "sxb": {"name": "Suba", "native_name": "Suba", "max_tokens": 25}, + "suc": {"name": "Subanon, Western", "native_name": "Subanon, Western", "max_tokens": 25}, + "tgo": {"name": "Sudest", "native_name": "Sudest", "max_tokens": 25}, + "suk": {"name": "Sukuma", "native_name": "Sukuma", "max_tokens": 25}, + "sun": {"name": "Sunda", "native_name": "Basa Sunda", "max_tokens": 25}, + "suz": {"name": "Sunwar", "native_name": "Sunwar", "max_tokens": 25}, + "sgj": {"name": "Surgujia", "native_name": "Surgujia", "max_tokens": 12}, + "sus": {"name": "Susu", "native_name": "Susu", "max_tokens": 25}, + "swh": {"name": "Swahili", "native_name": "Kiswahili", "max_tokens": 25}, + "swe": {"name": "Swedish", "native_name": "Svenska", "max_tokens": 25}, + "syl": {"name": "Sylheti", "native_name": "Sylheti", "max_tokens": 12}, + "dyi": {"name": "Sénoufo, Djimini", "native_name": "Sénoufo, Djimini", "max_tokens": 12}, + "myk": {"name": "Sénoufo, Mamara", "native_name": "Sénoufo, Mamara", "max_tokens": 12}, + "spp": {"name": "Sénoufo, Supyire", "native_name": "Sénoufo, Supyire", "max_tokens": 12}, + "tap": {"name": "Taabwa", "native_name": "Taabwa", "max_tokens": 12}, + "tby": {"name": "Tabaru", "native_name": "Tabaru", "max_tokens": 25}, + "tna": {"name": "Tacana", "native_name": "Tacana", "max_tokens": 25}, + "shi": {"name": "Tachelhit", "native_name": "Tashelḥiyt", "max_tokens": 12}, + "klw": {"name": "Tado", "native_name": "Tado", "max_tokens": 25}, + "tgl": {"name": "Tagalog", "native_name": "Tagalog", "max_tokens": 25}, + "tbk": {"name": "Tagbanwa, Calamian", "native_name": "Tagbanwa", "max_tokens": 12}, + "tgj": {"name": "Tagin", "native_name": "Tagin", "max_tokens": 25}, + "blt": {"name": "Tai Dam", "native_name": "Táy Dăm", "max_tokens": 25}, + "tbg": {"name": "Tairora, North", "native_name": "Tairora", "max_tokens": 12}, + "omw": {"name": "Tairora, South", "native_name": "Tairora", "max_tokens": 12}, + "tgk": {"name": "Tajik", "native_name": "Тоҷикӣ", "max_tokens": 12}, + "tdj": {"name": "Tajio", "native_name": "Tajio", "max_tokens": 25}, + "tbc": {"name": "Takia", "native_name": "Takia", "max_tokens": 25}, + "tlj": {"name": "Talinga-Bwisi", "native_name": "Talinga-Bwisi", "max_tokens": 25}, + "tly": {"name": "Talysh", "native_name": "Толыши", "max_tokens": 12}, + "ttq-script_tifinagh": {"name": "Tamajaq, Tawallammat", "native_name": "ⵜⴰⵎⴰⵌⴰⵇ", "max_tokens": 25}, + "taj": {"name": "Tamang, Eastern", "native_name": "तामाङ", "max_tokens": 12}, + "taq": {"name": "Tamasheq", "native_name": "ⵜⴰⵎⴰⵛⵍⵈⵜ", "max_tokens": 12}, + "tpm": {"name": "Tampulma", "native_name": "Tampulma", "max_tokens": 12}, + "tgp": {"name": "Tangoa", "native_name": "Tangoa", "max_tokens": 25}, + "tnn": {"name": "Tanna, North", "native_name": "Tanna", "max_tokens": 25}, + "tac": {"name": "Tarahumara, Western", "native_name": "Tarahumara", "max_tokens": 12}, + "rif-script_latin": {"name": "Tarifit - Latin", "native_name": "Tarifit", "max_tokens": 12}, + "rif-script_arabic": {"name": "Tarifit - Arabic", "native_name": "ⵜⴰⵔⵉⴼⵉⵜ", "max_tokens": 25}, + "tat": {"name": "Tatar", "native_name": "татар теле", "max_tokens": 25}, + "tav": {"name": "Tatuyo", "native_name": "Tatuyo", "max_tokens": 12}, + "twb": {"name": "Tawbuid", "native_name": "Tawbuid", "max_tokens": 12}, + "tbl": {"name": "Tboli", "native_name": "Tboli", "max_tokens": 12}, + "kps": {"name": "Tehit", "native_name": "Tehit", "max_tokens": 25}, + "twe": {"name": "Teiwa", "native_name": "Teiwa", "max_tokens": 25}, + "ttc": {"name": "Tektiteko", "native_name": "Tektiteko", "max_tokens": 12}, + "kdh": {"name": "Tem", "native_name": "Tem", "max_tokens": 25}, + "tes": {"name": "Tengger", "native_name": "Tengger", "max_tokens": 25}, + "tex": {"name": "Tennet", "native_name": "Tennet", "max_tokens": 25}, + "tee": {"name": "Tepehua, Huehuetla", "native_name": "Tepehua", "max_tokens": 12}, + "tpp": {"name": "Tepehua, Pisaflores", "native_name": "Tepehua Pisaflores", "max_tokens": 12}, + "tpt": {"name": "Tepehua, Tlachichilco", "native_name": "Tepehua Tlachichilco", "max_tokens": 12}, + "stp": {"name": "Tepehuan, Southeastern", "native_name": "Tepehuan Southeastern", "max_tokens": 12}, + "tfr": {"name": "Teribe", "native_name": "Teribe", "max_tokens": 25}, + "twu": {"name": "Termanu", "native_name": "Termanu", "max_tokens": 25}, + "ter": {"name": "Terêna", "native_name": "Terêna", "max_tokens": 12}, + "tew": {"name": "Tewa", "native_name": "Tewa", "max_tokens": 25}, + "tha": {"name": "Thai", "native_name": "ไทย", "max_tokens": 12}, + "nod": {"name": "Thai, Northern", "native_name": "คำเมือง", "max_tokens": 12}, + "thl": {"name": "Tharu, Dangaura", "native_name": "थारू", "max_tokens": 12}, + "tem": {"name": "Themne", "native_name": "Themne", "max_tokens": 25}, + "adx": {"name": "Tibetan, Amdo", "native_name": "ཨ་མདོ", "max_tokens": 25}, + "bod": {"name": "Tibetan, Central", "native_name": "བོད", "max_tokens": 12}, + "khg": {"name": "Tibetan, Khams", "native_name": "ཁམས", "max_tokens": 25}, + "tca": {"name": "Ticuna", "native_name": "Ticuna", "max_tokens": 12}, + "tir": {"name": "Tigrigna", "native_name": "ትግርኛ", "max_tokens": 25}, + "txq": {"name": "Tii", "native_name": "Tii", "max_tokens": 25}, + "tik": {"name": "Tikar", "native_name": "Tikar", "max_tokens": 25}, + "dgr": {"name": "Tlicho", "native_name": "Tlicho", "max_tokens": 12}, + "tob": {"name": "Toba", "native_name": "Toba", "max_tokens": 25}, + "tmf": {"name": "Toba-Maskoy", "native_name": "Toba-Maskoy", "max_tokens": 25}, + "tng": {"name": "Tobanga", "native_name": "Tobanga", "max_tokens": 12}, + "tlb": {"name": "Tobelo", "native_name": "Tobelo", "max_tokens": 12}, + "ood": {"name": "Tohono O’odham", "native_name": "Tohono O’odham", "max_tokens": 25}, + "tpi": {"name": "Tok Pisin", "native_name": "Tok Pisin", "max_tokens": 25}, + "jic": {"name": "Tol", "native_name": "Tol", "max_tokens": 25}, + "lbw": {"name": "Tolaki", "native_name": "Tolaki", "max_tokens": 25}, + "txa": {"name": "Tombonuo", "native_name": "Tombonuo", "max_tokens": 12}, + "tom": {"name": "Tombulu", "native_name": "Tombulu", "max_tokens": 25}, + "toh": {"name": "Tonga", "native_name": "Tonga", "max_tokens": 25}, + "tnt": {"name": "Tontemboan", "native_name": "Tontemboan", "max_tokens": 12}, + "sda": {"name": "Toraja-Sa’dan", "native_name": "Toraja-Sa’dan", "max_tokens": 25}, + "tcs": {"name": "Torres Strait Creole", "native_name": "Torres Strait Creole", "max_tokens": 25}, + "toc": {"name": "Totonac, Coyutla", "native_name": "Totonac, Coyutla", "max_tokens": 25}, + "tos": {"name": "Totonac, Highland", "native_name": "Totonac, Highland", "max_tokens": 25}, + "neb": {"name": "Toura", "native_name": "Toura", "max_tokens": 25}, + "trn": {"name": "Trinitario", "native_name": "Trinitario", "max_tokens": 12}, + "trs": {"name": "Triqui, Chicahuaxtla", "native_name": "Triqui, Chicahuaxtla", "max_tokens": 12}, + "trc": {"name": "Triqui, Copala", "native_name": "Triqui, Copala", "max_tokens": 25}, + "tri": {"name": "Trió", "native_name": "Trió", "max_tokens": 25}, + "cof": {"name": "Tsafiki", "native_name": "Tsafiki", "max_tokens": 12}, + "tkr": {"name": "Tsakhur", "native_name": "Tsakhur", "max_tokens": 12}, + "kdl": {"name": "Tsikimba", "native_name": "Tsikimba", "max_tokens": 12}, + "cas": {"name": "Tsimané", "native_name": "Tsimané", "max_tokens": 12}, + "tso": {"name": "Tsonga", "native_name": "Tsonga", "max_tokens": 12}, + "tuo": {"name": "Tucano", "native_name": "Tucano", "max_tokens": 25}, + "iou": {"name": "Tuma-Irumu", "native_name": "Tuma-Irumu", "max_tokens": 25}, + "tmc": {"name": "Tumak", "native_name": "Tumak", "max_tokens": 25}, + "tuf": {"name": "Tunebo, Central", "native_name": "Tunebo, Central", "max_tokens": 25}, + "tuk-script_latin": {"name": "Turkmen - Latin", "native_name": "Türkmençe", "max_tokens": 12}, + "tuk-script_arabic": {"name": "Turkmen - Arabic", "native_name": "تركمن", "max_tokens": 12}, + "bov": {"name": "Tuwuli", "native_name": "Tuwuli", "max_tokens": 12}, + "tue": {"name": "Tuyuca", "native_name": "Tuyuca", "max_tokens": 25}, + "tw_akuapem": {"name": "Twi (Akuapem)", "native_name": "Twi (Akuapem)", "max_tokens": 25}, + "tw_asante": {"name": "Twi (Asante)", "native_name": "Twi (Asante)", "max_tokens": 25}, + "kcg": {"name": "Tyap", "native_name": "Tyap", "max_tokens": 25}, + "tzh-dialect_bachajón": {"name": "Tzeltal - dialect Bachajón", "native_name": "Tzeltal", "max_tokens": 12}, + "tzh-dialect_tenejapa": {"name": "Tzeltal - dialect Tenejapa", "native_name": "Tzeltal", "max_tokens": 12}, + "tzo-dialect_chenalhó": {"name": "Tzotzil - dialect Chenalhó", "native_name": "Tzotzil", "max_tokens": 12}, + "tzo-dialect_chamula": {"name": "Tzotzil - dialect Chamula", "native_name": "Tzotzil", "max_tokens": 12}, + "tzj-dialect_western": {"name": "Tz’utujil - dialect Western", "native_name": "Tz’utujil", "max_tokens": 25}, + "tzj-dialect_eastern": {"name": "Tz’utujil - dialect Eastern", "native_name": "Tz’utujil", "max_tokens": 25}, + "aoz": {"name": "Uab Meto", "native_name": "Uab Meto", "max_tokens": 25}, + "udm": {"name": "Udmurt", "native_name": "Udmurt", "max_tokens": 12}, + "udu": {"name": "Uduk", "native_name": "Uduk", "max_tokens": 25}, + "ukr": {"name": "Ukrainian", "native_name": "Українська", "max_tokens": 25}, + "ppk": {"name": "Uma", "native_name": "Uma", "max_tokens": 25}, + "ubu": {"name": "Umbu-Ungu", "native_name": "Umbu-Ungu", "max_tokens": 25}, + "urk": {"name": "Urak Lawoi’", "native_name": "Urak Lawoi’", "max_tokens": 25}, + "ura": {"name": "Urarina", "native_name": "Urarina", "max_tokens": 12}, + "urt": {"name": "Urat", "native_name": "Urat", "max_tokens": 25}, + "urd-script_devanagari": {"name": "Urdu - Devanagari", "native_name": "उर्दू", "max_tokens": 25}, + "urd-script_arabic": {"name": "Urdu - Arabic", "native_name": "اردو", "max_tokens": 25}, + "urd-script_latin": {"name": "Urdu - Latin", "native_name": "Urdu", "max_tokens": 25}, + "upv": {"name": "Uripiv-Wala-Rano-Atchin", "native_name": "Uripiv-Wala-Rano-Atchin", "max_tokens": 25}, + "usp": {"name": "Uspanteko", "native_name": "Uspanteko", "max_tokens": 12}, + "uig-script_arabic": {"name": "Uyghur - Arabic", "native_name": "ئۇيغۇر", "max_tokens": 12}, + "uig-script_cyrillic": {"name": "Uyghur - Cyrillic", "native_name": "Уйғур", "max_tokens": 12}, + "uzb-script_cyrillic": {"name": "Uzbek", "native_name": "Ўзбек", "max_tokens": 12}, + "vag": {"name": "Vagla", "native_name": "Vagla", "max_tokens": 25}, + "bav": {"name": "Vengo", "native_name": "Vengo", "max_tokens": 25}, + "vid": {"name": "Vidunda", "native_name": "Vidunda", "max_tokens": 25}, + "vie": {"name": "Vietnamese", "native_name": "Tiếng Việt", "max_tokens": 25}, + "vif": {"name": "Vili", "native_name": "Vili", "max_tokens": 25}, + "vun": {"name": "Vunjo", "native_name": "Vunjo", "max_tokens": 25}, + "vut": {"name": "Vute", "native_name": "Vute", "max_tokens": 25}, + "prk": {"name": "Wa, Parauk", "native_name": "Wa, Parauk", "max_tokens": 25}, + "wwa": {"name": "Waama", "native_name": "Waama", "max_tokens": 12}, + "rro": {"name": "Waima", "native_name": "Waima", "max_tokens": 12}, + "bao": {"name": "Waimaha", "native_name": "Waimaha", "max_tokens": 12}, + "waw": {"name": "Waiwai", "native_name": "Waiwai", "max_tokens": 12}, + "lgl": {"name": "Wala", "native_name": "Wala", "max_tokens": 25}, + "wlx": {"name": "Wali", "native_name": "Wali", "max_tokens": 25}, + "cou": {"name": "Wamey", "native_name": "Wamey", "max_tokens": 12}, + "hub": {"name": "Wampís", "native_name": "Wampís", "max_tokens": 12}, + "gvc": {"name": "Wanano", "native_name": "Wanano", "max_tokens": 25}, + "mfi": {"name": "Wandala", "native_name": "Wandala", "max_tokens": 25}, + "wap": {"name": "Wapishana", "native_name": "Wapishana", "max_tokens": 12}, + "wba": {"name": "Warao", "native_name": "Warao", "max_tokens": 25}, + "war": {"name": "Waray-Waray", "native_name": "Waray-Waray", "max_tokens": 25}, + "way": {"name": "Wayana", "native_name": "Wayana", "max_tokens": 25}, + "guc": {"name": "Wayuu", "native_name": "Wayuu", "max_tokens": 25}, + "cym": {"name": "Welsh", "native_name": "Cymraeg", "max_tokens": 25}, + "kvw": {"name": "Wersing", "native_name": "Wersing", "max_tokens": 25}, + "tnp": {"name": "Whitesands", "native_name": "Whitesands", "max_tokens": 12}, + "hto": {"name": "Witoto, Minika", "native_name": "Witoto, Minika", "max_tokens": 25}, + "huu": {"name": "Witoto, Murui", "native_name": "Witoto, Murui", "max_tokens": 25}, + "wal-script_latin": {"name": "Wolaytta - Latin", "native_name": "Wolaytta", "max_tokens": 12}, + "wal-script_ethiopic": {"name": "Wolaytta - Ethiopic", "native_name": "ወላይታ", "max_tokens": 25}, + "wlo": {"name": "Wolio", "native_name": "Wolio", "max_tokens": 25}, + "noa": {"name": "Woun Meu", "native_name": "Woun Meu", "max_tokens": 25}, + "wob": {"name": "Wè Northern", "native_name": "Wè", "max_tokens": 25}, + "kao": {"name": "Xaasongaxango", "native_name": "Xaasongaxango", "max_tokens": 12}, + "xer": {"name": "Xerénte", "native_name": "Xerénte", "max_tokens": 12}, + "yad": {"name": "Yagua", "native_name": "Yagua", "max_tokens": 25}, + "yka": {"name": "Yakan", "native_name": "Yakan", "max_tokens": 25}, + "sah": {"name": "Yakut", "native_name": "Саха", "max_tokens": 25}, + "yba": {"name": "Yala", "native_name": "Yala", "max_tokens": 25}, + "yli": {"name": "Yali, Angguruk", "native_name": "Yali, Angguruk", "max_tokens": 25}, + "nlk": {"name": "Yali, Ninia", "native_name": "Yali, Ninia", "max_tokens": 25}, + "yal": {"name": "Yalunka", "native_name": "Yalunka", "max_tokens": 12}, + "yam": {"name": "Yamba", "native_name": "Yamba", "max_tokens": 25}, + "yat": {"name": "Yambeta", "native_name": "Yambeta", "max_tokens": 12}, + "jmd": {"name": "Yamdena", "native_name": "Yamdena", "max_tokens": 12}, + "tao": {"name": "Yami", "native_name": "Yami", "max_tokens": 25}, + "yaa": {"name": "Yaminahua", "native_name": "Yaminahua", "max_tokens": 12}, + "ame": {"name": "Yanesha’", "native_name": "Yanesha’", "max_tokens": 25}, + "guu": {"name": "Yanomamö", "native_name": "Yanomamö", "max_tokens": 12}, + "yao": {"name": "Yao", "native_name": "Yao", "max_tokens": 25}, + "yre": {"name": "Yaouré", "native_name": "Yaouré", "max_tokens": 25}, + "yva": {"name": "Yawa", "native_name": "Yawa", "max_tokens": 25}, + "ybb": {"name": "Yemba", "native_name": "Yemba", "max_tokens": 25}, + "pib": {"name": "Yine", "native_name": "Yine", "max_tokens": 25}, + "byr": {"name": "Yipma", "native_name": "Yipma", "max_tokens": 12}, + "pil": {"name": "Yom", "native_name": "Yom", "max_tokens": 25}, + "ycn": {"name": "Yucuna", "native_name": "Yucuna", "max_tokens": 12}, + "ess": {"name": "Yupik, Saint Lawrence Island", "native_name": "Yupigestun", "max_tokens": 12}, + "yuz": {"name": "Yuracare", "native_name": "Yuracare", "max_tokens": 12}, + "atb": {"name": "Zaiwa", "native_name": "Zaiwa", "max_tokens": 25}, + "zne": {"name": "Zande", "native_name": "Zande", "max_tokens": 25}, + "zaq": {"name": "Zapotec, Aloápam", "native_name": "Aloápam Zapotec", "max_tokens": 12}, + "zpo": {"name": "Zapotec, Amatlán", "native_name": "Amatlán Zapotec", "max_tokens": 12}, + "zad": {"name": "Zapotec, Cajonos", "native_name": "Cajonos Zapotec", "max_tokens": 12}, + "zpc": {"name": "Zapotec, Choapan", "native_name": "Choapan Zapotec", "max_tokens": 12}, + "zca": {"name": "Zapotec, Coatecas Altas", "native_name": "Coatecas Altas Zapotec", "max_tokens": 12}, + "zpg": {"name": "Zapotec, Guevea de Humboldt", "native_name": "Guevea de Humboldt Zapotec", "max_tokens": 12}, + "zai": {"name": "Zapotec, Isthmus", "native_name": "Isthmus Zapotec", "max_tokens": 12}, + "zpl": {"name": "Zapotec, Lachixío", "native_name": "Lachixío Zapotec", "max_tokens": 12}, + "zam": {"name": "Zapotec, Miahuatlán", "native_name": "Miahuatlán Zapotec", "max_tokens": 12}, + "zaw": {"name": "Zapotec, Mitla", "native_name": "Mitla Zapotec", "max_tokens": 12}, + "zpm": {"name": "Zapotec, Mixtepec", "native_name": "Mixtepec Zapotec", "max_tokens": 12}, + "zac": {"name": "Zapotec, Ocotlán", "native_name": "Ocotlán Zapotec", "max_tokens": 12}, + "zao": {"name": "Zapotec, Ozolotepec", "native_name": "Ozolotepec Zapotec", "max_tokens": 12}, + "ztq": {"name": "Zapotec, Quioquitani-Quierí", "native_name": "Quioquitani-Quierí Zapotec", "max_tokens": 12}, + "zar": {"name": "Zapotec, Rincón", "native_name": "Rincón Zapotec", "max_tokens": 25}, + "zpt": {"name": "Zapotec, San Vicente Coatlán", "native_name": "San Vicente Coatlán Zapotec", "max_tokens": 25}, + "zpi": {"name": "Zapotec, Santa María Quiegolani", "native_name": "Santa María Quiegolani Zapotec", "max_tokens": 25}, + "zas": {"name": "Zapotec, Santo Domingo Albarradas", "native_name": "Santo Domingo Albarradas Zapotec", "max_tokens": 25}, + "zaa": {"name": "Zapotec, Sierra de Juárez", "native_name": "Sierra de Juárez Zapotec", "max_tokens": 25}, + "zpz": {"name": "Zapotec, Texmelucan", "native_name": "Texmelucan Zapotec", "max_tokens": 12}, + "zab": {"name": "Zapotec, Western Tlacolula Valley", "native_name": "Western Tlacolula Valley Zapotec", "max_tokens": 12}, + "zpu": {"name": "Zapotec, Yalálag", "native_name": "Yalálag Zapotec", "max_tokens": 12}, + "zae": {"name": "Zapotec, Yareni", "native_name": "Yareni Zapotec", "max_tokens": 12}, + "zty": {"name": "Zapotec, Yatee", "native_name": "Yatee Zapotec", "max_tokens": 12}, + "zav": {"name": "Zapotec, Yatzachi", "native_name": "Yatzachi Zapotec", "max_tokens": 12}, + "zza": {"name": "Zaza", "native_name": "Zazaki", "max_tokens": 25}, + "zyb": {"name": "Zhuang, Yongbei", "native_name": "Yongbei Zhuang", "max_tokens": 25}, + "ziw": {"name": "Zigula", "native_name": "Zigula", "max_tokens": 25}, + "zos": {"name": "Zoque, Francisco León", "native_name": "Francisco León Zoque", "max_tokens": 25}, + "gnd": {"name": "Zulgo-Gemzek", "native_name": "Zulgo-Gemzek", "max_tokens": 25} } diff --git a/lib/models.py b/lib/models.py index db204ae52858c29c74e268d89466c358371b369c..4538f68e350f0a938f916e7ad8e38ca0fce9d418 100644 --- a/lib/models.py +++ b/lib/models.py @@ -40,32 +40,32 @@ default_xtts_settings = { "use_deepspeed": False, "files": ['config.json', 'model.pth', 'vocab.json', 'ref.wav'], "voices": { - 'ClaribelDervla': 'Claribel Dervla', 'DaisyStudious': 'Daisy Studious', 'GracieWise': 'Gracie Wise', - 'TammieEma': 'Tammie Ema', 'AlisonDietlinde': 'Alison Dietlinde', 'AnaFlorence': 'Ana Florence', - 'AnnmarieNele': 'Annmarie Nele', 'AsyaAnara': 'Asya Anara', 'BrendaStern': 'Brenda Stern', - 'GittaNikolina': 'Gitta Nikolina', 'HenrietteUsha': 'Henriette Usha', 'SofiaHellen': 'Sofia Hellen', - 'TammyGrit': 'Tammy Grit', 'TanjaAdelina': 'Tanja Adelina', 'VjollcaJohnnie': 'Vjollca Johnnie', - 'AndrewChipper': 'Andrew Chipper', 'BadrOdhiambo': 'Badr Odhiambo', 'DionisioSchuyler': 'Dionisio Schuyler', - 'RoystonMin': 'Royston Min', 'ViktorEka': 'Viktor Eka', 'AbrahanMack': 'Abrahan Mack', - 'AddeMichal': 'Adde Michal', 'BaldurSanjin': 'Baldur Sanjin', 'CraigGutsy': 'Craig Gutsy', - 'DamienBlack': 'Damien Black', 'GilbertoMathias': 'Gilberto Mathias', 'IlkinUrbano': 'Ilkin Urbano', - 'KazuhikoAtallah': 'Kazuhiko Atallah', 'LudvigMilivoj': 'Ludvig Milivoj', 'SuadQasim': 'Suad Qasim', - 'TorcullDiarmuid': 'Torcull Diarmuid', 'ViktorMenelaos': 'Viktor Menelaos', 'ZacharieAimilios': 'Zacharie Aimilios', - 'NovaHogarth': 'Nova Hogarth', 'MajaRuoho': 'Maja Ruoho', 'UtaObando': 'Uta Obando', - 'LidiyaSzekeres': 'Lidiya Szekeres', 'ChandraMacFarland': 'Chandra MacFarland', 'SzofiGranger': 'Szofi Granger', - 'CamillaHolmström': 'Camilla Holmström', 'LilyaStainthorpe': 'Lilya Stainthorpe', 'ZofijaKendrick': 'Zofija Kendrick', - 'NarelleMoon': 'Narelle Moon', 'BarboraMacLean': 'Barbora MacLean', 'AlexandraHisakawa': 'Alexandra Hisakawa', - 'AlmaMaría': 'Alma María', 'RosemaryOkafor': 'Rosemary Okafor', 'IgeBehringer': 'Ige Behringer', - 'FilipTraverse': 'Filip Traverse', 'DamjanChapman': 'Damjan Chapman', 'WulfCarlevaro': 'Wulf Carlevaro', - 'AaronDreschner': 'Aaron Dreschner', 'KumarDahl': 'Kumar Dahl', 'EugenioMataracı': 'Eugenio Mataracı', - 'FerranSimen': 'Ferran Simen', 'XavierHayasaka': 'Xavier Hayasaka', 'LuisMoray': 'Luis Moray', - 'MarcosRudaski': 'Marcos Rudaski' + "ClaribelDervla": "Claribel Dervla", "DaisyStudious": "Daisy Studious", "GracieWise": "Gracie Wise", + "TammieEma": "Tammie Ema", "AlisonDietlinde": "Alison Dietlinde", "AnaFlorence": "Ana Florence", + "AnnmarieNele": "Annmarie Nele", "AsyaAnara": "Asya Anara", "BrendaStern": "Brenda Stern", + "GittaNikolina": "Gitta Nikolina", "HenrietteUsha": "Henriette Usha", "SofiaHellen": "Sofia Hellen", + "TammyGrit": "Tammy Grit", "TanjaAdelina": "Tanja Adelina", "VjollcaJohnnie": "Vjollca Johnnie", + "AndrewChipper": "Andrew Chipper", "BadrOdhiambo": "Badr Odhiambo", "DionisioSchuyler": "Dionisio Schuyler", + "RoystonMin": "Royston Min", "ViktorEka": "Viktor Eka", "AbrahanMack": "Abrahan Mack", + "AddeMichal": "Adde Michal", "BaldurSanjin": "Baldur Sanjin", "CraigGutsy": "Craig Gutsy", + "DamienBlack": "Damien Black", "GilbertoMathias": "Gilberto Mathias", "IlkinUrbano": "Ilkin Urbano", + "KazuhikoAtallah": "Kazuhiko Atallah", "LudvigMilivoj": "Ludvig Milivoj", "SuadQasim": "Suad Qasim", + "TorcullDiarmuid": "Torcull Diarmuid", "ViktorMenelaos": "Viktor Menelaos", "ZacharieAimilios": "Zacharie Aimilios", + "NovaHogarth": "Nova Hogarth", "MajaRuoho": "Maja Ruoho", "UtaObando": "Uta Obando", + "LidiyaSzekeres": "Lidiya Szekeres", "ChandraMacFarland": "Chandra MacFarland", "SzofiGranger": "Szofi Granger", + "CamillaHolmström": "Camilla Holmström", "LilyaStainthorpe": "Lilya Stainthorpe", "ZofijaKendrick": "Zofija Kendrick", + "NarelleMoon": "Narelle Moon", "BarboraMacLean": "Barbora MacLean", "AlexandraHisakawa": "Alexandra Hisakawa", + "AlmaMaría": "Alma María", "RosemaryOkafor": "Rosemary Okafor", "IgeBehringer": "Ige Behringer", + "FilipTraverse": "Filip Traverse", "DamjanChapman": "Damjan Chapman", "WulfCarlevaro": "Wulf Carlevaro", + "AaronDreschner": "Aaron Dreschner", "KumarDahl": "Kumar Dahl", "EugenioMataracı": "Eugenio Mataracı", + "FerranSimen": "Ferran Simen", "XavierHayasaka": "Xavier Hayasaka", "LuisMoray": "Luis Moray", + "MarcosRudaski": "Marcos Rudaski" } } default_bark_settings = { "samplerate": 24000, "files": ['coarse_2.pt'], - "voices": {} + "voices": {"KumarDahl": os.path.join(voices_dir, "eng", "adult", "male", "bark","KumarDahl", "KumarDahl.npz")} } default_vits_settings = { "samplerate": 22050, @@ -212,7 +212,17 @@ models = { "internal": { "lang": "multi", "repo": "tts_models/[lang_iso1]/[xxx]", - "sub": {"cv/vits":["bg","cs","da","et","ga","hr","lt","lv","mt","pt","ro","sk","sl","sv"], "css10/vits":["es","fr","nl","hu","fi","ru","el","ja","zh"], "ljspeech/vits": ["en"], "thorsten/tacotron2-DDC": ["de"]}, + "sub": { + "css10/vits": ['es','hu','fi','fr','nl','ru','el'], + "custom/vits": ['ca'], + "custom/vits-female": ['bn', 'fa'], + "cv/vits":['bg','cs','da','et','ga','hr','lt','lv','mt','pt','ro','sk','sl','sv'], + "mai/vits": ['uk'], + "mai_female/vits": ['pl'], + "openbible/vits": ['ewe','hau','lin','tw_akuapem','tw_asante','yor'], + "thorsten/tacotron2-DDC": ['de'], + "vctk/vits": ['en'] + }, "voice": None, "files": default_vits_settings['files'], "samplerate": default_vits_settings['samplerate'] diff --git a/pyproject.toml b/pyproject.toml index fd2d5525f2e1cc44b1ca267984ffb49407493440..8d01746783a77b6f6593f32b550486013d010a0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,7 @@ authors = [ { name = "Drew Thomasson" } ] dependencies = [ + "argostranslate", "beautifulsoup4", "cutlet", "deep_translator", @@ -24,33 +25,31 @@ dependencies = [ "docker", "ebooklib", "fastapi", - "ffmpeg-python", "gensim", "gradio", "hangul-romanize", "indic-nlp-library", "iso-639", "jieba", - "m4b-util", "mecab", - "mecab-python3", + "mecab-python3", + "konlpy", + "pythainlp", "pydub", + "m4b-util", "nvidia-ml-py", "PyOpenGL", "pypinyin", "ray", "regex", "sentencepiece", - "transformers", "translate", "tqdm", "unidic", - "torchvggish", - "pymupdf4llm", - "torch==2.4.1", - "torchaudio==2.4.1", - "torchvision==0.19.1", - "coqui-tts==0.25.3" + "pymupdf4llm", + "coqui-tts==0.25.3", + "torchvision", + "torchvggish" ] readme = "README.md" requires-python = ">3.11,<3.13" diff --git a/requirements.txt b/requirements.txt index c1296a023f3d0cd8e75f58bc03ccb87fa981923f..d8bbbee549ec794a77f590b2f9163a4a613e51d0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +argostranslate beautifulsoup4 cutlet deep_translator @@ -5,16 +6,17 @@ demucs docker ebooklib fastapi -ffmpeg-python gensim gradio hangul-romanize indic-nlp-library iso-639 -jieba -m4b-util +jieba mecab mecab-python3 +konlpy +pythainlp +m4b-util pydub nvidia-ml-py PyOpenGL @@ -22,13 +24,10 @@ pypinyin ray regex sentencepiece -transformers translate tqdm unidic -torchvggish pymupdf4llm -torch==2.4.1 -torchaudio==2.4.1 -torchvision==0.19.1 -coqui-tts==0.26.0 \ No newline at end of file +coqui-tts +torchvision +torchvggish \ No newline at end of file diff --git a/tools/createEXE.ps1 b/tools/createEXE.ps1 deleted file mode 100644 index d4b3363f3ab5e04dffa273bfaaf6fe3f59aa9cb8..0000000000000000000000000000000000000000 --- a/tools/createEXE.ps1 +++ /dev/null @@ -1,38 +0,0 @@ -# .ps1 -# Script to run ebook2audiobook.cmd without administrator privileges - -# Paste contents into https://ps2exe.azurewebsites.net to create exe - -# Determine script/exe directory -$scriptDirectory = if ($PSScriptRoot) { - $PSScriptRoot -} else { - Split-Path -Parent (Convert-Path -LiteralPath ([System.Environment]::GetCommandLineArgs()[0])) -} - -# Full path to the ebook2audiobook.cmd -$cmdPath = Join-Path $scriptDirectory "ebook2audiobook.cmd" - -# Check if the command file exists -if (Test-Path $cmdPath) { - # Create a process start info - $psi = New-Object System.Diagnostics.ProcessStartInfo - $psi.FileName = "cmd.exe" - $psi.Arguments = "/c `"$cmdPath`"" - $psi.Verb = "runas" # Run as administrator - $psi.WorkingDirectory = $scriptDirectory - $psi.UseShellExecute = $false - - # Start the process - try { - [System.Diagnostics.Process]::Start($psi) - } - catch { - Write-Host "Failed to run the command as administrator: $_" - pause - } -} -else { - Write-Host "ebook2audiobook.cmd not found in the script directory." - pause -} diff --git a/tools/workflow-testing/long_test.txt b/tools/workflow-testing/long_test.txt new file mode 100644 index 0000000000000000000000000000000000000000..8928be33ed57b4ae953102dda9109df0ffaf49c2 --- /dev/null +++ b/tools/workflow-testing/long_test.txt @@ -0,0 +1 @@ +Alright here you go just a long stream of words flowing endlessly without any stops or breaks just moving forward like a river that never ends carrying thoughts and ideas without pause or hesitation like a mind racing through the night trying to grasp onto something solid but finding only more thoughts and more words and more movement like a dream that never quite settles into focus always shifting always changing always just beyond reach like running through a field with the wind in your hair feeling free and untethered by the rules of language or structure or anything at all just existing in the purest form of expression where nothing has to make perfect sense and yet it all still feels like it does in some strange and beautiful way like the way music can make you feel something without ever needing words at all just rhythm and motion and the way it carries you forward into something bigger than yourself into something vast and infinite and endless. diff --git a/voices/aka/.gitkeep b/voices/aka/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/aka/default.txt b/voices/aka/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..d074a01a93d46d21e9eb2b88022187352d235158 --- /dev/null +++ b/voices/aka/default.txt @@ -0,0 +1 @@ +An xtts engine built-in voice , a wɔasiesie sɛ wɔbɛkasa ama nsɛm biara ! Mpataa kɛse bi a nsu wom huruw ntɛmntɛm ; Vexed , dwarf no de me zippered adaka no bɔ … \ No newline at end of file diff --git a/voices/amh/.gitkeep b/voices/amh/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/amh/default.txt b/voices/amh/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..dfa97535ea3eaa920f8e76d53aaf9a92b822e5fe --- /dev/null +++ b/voices/amh/default.txt @@ -0,0 +1 @@ +ለማንኛውም ጽሑፍ ለመናገር ዝግጁ የሆነ የ "XXTS ሞተር አብሮ ድምጽ… አንድ ትልቅ ጭማቂ ዓሦች በፍጥነት ይንሸራተታል; የተዘበራረቀ, የ ZARPADED ሳጥኖች \ No newline at end of file diff --git a/voices/ara/.gitkeep b/voices/ara/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/ara/child/male/AndrewChipper.npz b/voices/ara/child/male/AndrewChipper.npz new file mode 100644 index 0000000000000000000000000000000000000000..2b325b897764360c21a8eb14695a1a40e92a4f2b Binary files /dev/null and b/voices/ara/child/male/AndrewChipper.npz differ diff --git a/voices/ara/child/male/AndrewChipper_16000.wav b/voices/ara/child/male/AndrewChipper_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..ff59052805118a142b75553072dc0452adee58da Binary files /dev/null and b/voices/ara/child/male/AndrewChipper_16000.wav differ diff --git a/voices/ara/child/male/AndrewChipper_24000.wav b/voices/ara/child/male/AndrewChipper_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..dc6c14927c1831fb7e6a2fd20ba3ce8da57aa8f3 Binary files /dev/null and b/voices/ara/child/male/AndrewChipper_24000.wav differ diff --git a/voices/ara/default.txt b/voices/ara/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..c080a073a441913e642823d28ce3f79a7f8df8d1 --- /dev/null +++ b/voices/ara/default.txt @@ -0,0 +1 @@ +صوت محرك XTTS مدمج ، جاهز للتحدث عن أي نوع من النص! سمكة عصير كبيرة تقفز بسرعة… غاضب ، القزم يضيء الصندوق السحري \ No newline at end of file diff --git a/voices/ara/teen/female/AlisonDietlinde.npz b/voices/ara/teen/female/AlisonDietlinde.npz new file mode 100644 index 0000000000000000000000000000000000000000..e0d61f9627735a63cce46fc3f5062186f7d2c9ff Binary files /dev/null and b/voices/ara/teen/female/AlisonDietlinde.npz differ diff --git a/voices/ara/teen/female/AlisonDietlinde_16000.wav b/voices/ara/teen/female/AlisonDietlinde_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..064f208878aafdb53338033c8c952cc1af7408fb Binary files /dev/null and b/voices/ara/teen/female/AlisonDietlinde_16000.wav differ diff --git a/voices/ara/teen/female/AlisonDietlinde_24000.wav b/voices/ara/teen/female/AlisonDietlinde_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..37f02655ef698fa1269c1789e811e720b05e7f15 Binary files /dev/null and b/voices/ara/teen/female/AlisonDietlinde_24000.wav differ diff --git a/voices/asm/.gitkeep b/voices/asm/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/asm/default.txt b/voices/asm/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..46bea39fa3d7833cf5696ee8d0d1e42a4b6e985a --- /dev/null +++ b/voices/asm/default.txt @@ -0,0 +1 @@ +এটা XTTS ইঞ্জিন বিল্ট-ইন ভয়েচ , যিকোনো ধৰণৰ লিখনীৰ বাবে কথা ক'বলৈ সাজু ! এটা ডাঙৰ ৰসাল মাছ সোনকালে জপিয়াই উঠে ; , dwarf whacks my zippered box \ No newline at end of file diff --git a/voices/bam/.gitkeep b/voices/bam/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/bam/default.txt b/voices/bam/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..bb859fabb227dbd66306962832e15a9f5529342b --- /dev/null +++ b/voices/bam/default.txt @@ -0,0 +1 @@ +An XTTS motɛri bɛ se ka don a kɔnɔ , a labɛnnen don ka kuma sɛbɛn suguya o suguya kan ! Jɛgɛba min bɛ ji la, o bɛ pan joona ; A bɛ tɔɔrɔ , a bɛ ka n ka zipuw ka kɛsu gosi … \ No newline at end of file diff --git a/voices/ben/.gitkeep b/voices/ben/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/ben/default.txt b/voices/ben/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..7ce503ed82a500c49d96a6dd3c3dca9f3698a6de --- /dev/null +++ b/voices/ben/default.txt @@ -0,0 +1 @@ +একটি এক্সটিটিএস ইঞ্জিন অন্তর্নির্মিত ভয়েস, যে কোনও ধরণের পাঠ্যের জন্য কথা বলতে প্রস্তুত! একটি বড় রসালো মাছ দ্রুত লাফ দেয়; ভেসে উঠেছে, বামন আমার জিপ্পারড বাক্সটি হ্যাক করে \ No newline at end of file diff --git a/voices/bul/.gitkeep b/voices/bul/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/bul/default.txt b/voices/bul/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..3dd85ef7c8c3680de48f0db662785c3402894982 --- /dev/null +++ b/voices/bul/default.txt @@ -0,0 +1 @@ +Вграден глас на двигателя XTTS, готов да говори за всякакъв вид текст! Голяма сочна риба скача бързо; vexed, джуджето разбива кутията ми с цип \ No newline at end of file diff --git a/voices/cat/.gitkeep b/voices/cat/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/cat/default.txt b/voices/cat/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..6be1e8ad5ba7242b0f3c54ca09cdf59bde78edd1 --- /dev/null +++ b/voices/cat/default.txt @@ -0,0 +1 @@ +Un motor XTTS, amb veu integrada, a punt per parlar per a qualsevol tipus de text… Un gran peix sucós salta ràpidament; Vexat, el nan em fa malbé la caixa de cremallera \ No newline at end of file diff --git a/voices/ceb/.gitkeep b/voices/ceb/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/ceb/default.txt b/voices/ceb/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..c99efcc37341082ddb9173525f48e4e84bf42ac4 --- /dev/null +++ b/voices/ceb/default.txt @@ -0,0 +1 @@ +Usa ka XTS Engine nga gitukod nga tingog, andam nga mosulti alang sa bisan unsang matang sa teksto! Usa ka dako nga juicy fish nga dali nga paglukso; nasamok, ang Dwarf Whacks ang akong zippered box \ No newline at end of file diff --git a/voices/ces/adult/male/AaronDreschner.wav b/voices/ces/adult/male/AaronDreschner.wav new file mode 100644 index 0000000000000000000000000000000000000000..f5a5b590f7ec6c027380182d447d157b552d5607 Binary files /dev/null and b/voices/ces/adult/male/AaronDreschner.wav differ diff --git a/voices/deu/.gitkeep b/voices/deu/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/deu/default.txt b/voices/deu/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..b2248a98172295bef8ac52c7f263eb00323021c0 --- /dev/null +++ b/voices/deu/default.txt @@ -0,0 +1 @@ +Eine integrierte Sprache der XTTS Engine, bereit, für jede Art von Text zu sprechen! Ein großer saftiger Fisch springt schnell; Verärgert, der Zwerg schlägt meine Reißverschlusstasche aus \ No newline at end of file diff --git a/voices/eng/.gitkeep b/voices/eng/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/eng/adult/female/AlexandraHisakawa_16000.wav b/voices/eng/adult/female/AlexandraHisakawa_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..5523c24296e26f4de98e6e0590a0a920311cbfe9 Binary files /dev/null and b/voices/eng/adult/female/AlexandraHisakawa_16000.wav differ diff --git a/voices/eng/adult/female/AlexandraHisakawa_24000.wav b/voices/eng/adult/female/AlexandraHisakawa_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..cf0910f14d9fce2bb999a05539c3f2d2017179c6 Binary files /dev/null and b/voices/eng/adult/female/AlexandraHisakawa_24000.wav differ diff --git a/voices/eng/adult/female/AnaFlorence_16000.wav b/voices/eng/adult/female/AnaFlorence_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..fa5df793510729ccb0c583833cb82c2746c0b509 Binary files /dev/null and b/voices/eng/adult/female/AnaFlorence_16000.wav differ diff --git a/voices/eng/adult/female/AnaFlorence_24000.wav b/voices/eng/adult/female/AnaFlorence_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..61c771b8940b4fd5e99918e886d71d8f9de556fe Binary files /dev/null and b/voices/eng/adult/female/AnaFlorence_24000.wav differ diff --git a/voices/eng/adult/female/AnnmarieNele_16000.wav b/voices/eng/adult/female/AnnmarieNele_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..5726b992ff1e610e1c4d09065624fc997cb69d81 Binary files /dev/null and b/voices/eng/adult/female/AnnmarieNele_16000.wav differ diff --git a/voices/eng/adult/female/AnnmarieNele_24000.wav b/voices/eng/adult/female/AnnmarieNele_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..6bb768e93c4d047f580eca317fb8e786a93d3e2e Binary files /dev/null and b/voices/eng/adult/female/AnnmarieNele_24000.wav differ diff --git "a/voices/eng/adult/female/CamillaHolmstr\303\266m_16000.wav" "b/voices/eng/adult/female/CamillaHolmstr\303\266m_16000.wav" new file mode 100644 index 0000000000000000000000000000000000000000..6bdf801144dfae7e6b033453b060d7c1fbd2708d Binary files /dev/null and "b/voices/eng/adult/female/CamillaHolmstr\303\266m_16000.wav" differ diff --git "a/voices/eng/adult/female/CamillaHolmstr\303\266m_24000.wav" "b/voices/eng/adult/female/CamillaHolmstr\303\266m_24000.wav" new file mode 100644 index 0000000000000000000000000000000000000000..8a2c2f8a07de73279482a71452908f103a6f269a Binary files /dev/null and "b/voices/eng/adult/female/CamillaHolmstr\303\266m_24000.wav" differ diff --git a/voices/eng/adult/female/ChandraMacFarland_16000.wav b/voices/eng/adult/female/ChandraMacFarland_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..4efb6b578df404e596e3397bc74a3ce485df010a Binary files /dev/null and b/voices/eng/adult/female/ChandraMacFarland_16000.wav differ diff --git a/voices/eng/adult/female/ChandraMacFarland_24000.wav b/voices/eng/adult/female/ChandraMacFarland_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..8104174792fe693c5ef2de505a8f7c2b7df50421 Binary files /dev/null and b/voices/eng/adult/female/ChandraMacFarland_24000.wav differ diff --git a/voices/eng/adult/female/ClaribelDervla_16000.wav b/voices/eng/adult/female/ClaribelDervla_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..9466279d37f0a9886a3d60c5e63afd045e3589a0 Binary files /dev/null and b/voices/eng/adult/female/ClaribelDervla_16000.wav differ diff --git a/voices/eng/adult/female/ClaribelDervla_24000.wav b/voices/eng/adult/female/ClaribelDervla_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..fd993469b74a919731892b847c6885c8939e3961 Binary files /dev/null and b/voices/eng/adult/female/ClaribelDervla_24000.wav differ diff --git a/voices/eng/adult/female/GittaNikolina_16000.wav b/voices/eng/adult/female/GittaNikolina_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..4ebb97a184aad8746fe18bcbee644464164579ac Binary files /dev/null and b/voices/eng/adult/female/GittaNikolina_16000.wav differ diff --git a/voices/eng/adult/female/GittaNikolina_24000.wav b/voices/eng/adult/female/GittaNikolina_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..27793c0722f8e992d5a8a51a9327a6662aad8a4a Binary files /dev/null and b/voices/eng/adult/female/GittaNikolina_24000.wav differ diff --git a/voices/eng/adult/female/GracieWise_16000.wav b/voices/eng/adult/female/GracieWise_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..d54ff982cbc0366c7cac0aee60e1fc573d2b0b5e Binary files /dev/null and b/voices/eng/adult/female/GracieWise_16000.wav differ diff --git a/voices/eng/adult/female/GracieWise_24000.wav b/voices/eng/adult/female/GracieWise_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..7ec7f10e6337deedcc222a74455f289c02fbf493 Binary files /dev/null and b/voices/eng/adult/female/GracieWise_24000.wav differ diff --git a/voices/eng/adult/female/HenrietteUsha_16000.wav b/voices/eng/adult/female/HenrietteUsha_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..91dc4534127a0035488d163a79e52862d05261fa Binary files /dev/null and b/voices/eng/adult/female/HenrietteUsha_16000.wav differ diff --git a/voices/eng/adult/female/HenrietteUsha_24000.wav b/voices/eng/adult/female/HenrietteUsha_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..ca2bd454961e4558a1666a60a16b7a340907706d Binary files /dev/null and b/voices/eng/adult/female/HenrietteUsha_24000.wav differ diff --git a/voices/eng/adult/female/LidiyaSzekeres_16000.wav b/voices/eng/adult/female/LidiyaSzekeres_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..c2fe1b3e7b926ab10ced67dbda6d3f32246af97c Binary files /dev/null and b/voices/eng/adult/female/LidiyaSzekeres_16000.wav differ diff --git a/voices/eng/adult/female/LidiyaSzekeres_24000.wav b/voices/eng/adult/female/LidiyaSzekeres_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..0f01f1d68158299b1c6fb3331aa01b0e4a65a40d Binary files /dev/null and b/voices/eng/adult/female/LidiyaSzekeres_24000.wav differ diff --git a/voices/eng/adult/female/LilyaStainthorpe_16000.wav b/voices/eng/adult/female/LilyaStainthorpe_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..c9cefbd1d94410911687ccdec19386626333f358 Binary files /dev/null and b/voices/eng/adult/female/LilyaStainthorpe_16000.wav differ diff --git a/voices/eng/adult/female/LilyaStainthorpe_24000.wav b/voices/eng/adult/female/LilyaStainthorpe_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..ea59e95d8c0b2d8e270a3843e353bc55c71eac16 Binary files /dev/null and b/voices/eng/adult/female/LilyaStainthorpe_24000.wav differ diff --git a/voices/eng/adult/female/MajaRuoho_16000.wav b/voices/eng/adult/female/MajaRuoho_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..83d2dbb3f446292c364d961f369d28b715c7241d Binary files /dev/null and b/voices/eng/adult/female/MajaRuoho_16000.wav differ diff --git a/voices/eng/adult/female/MajaRuoho_24000.wav b/voices/eng/adult/female/MajaRuoho_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..f79e393415005f1321a42dcdab344fa9ca5f7018 Binary files /dev/null and b/voices/eng/adult/female/MajaRuoho_24000.wav differ diff --git a/voices/eng/adult/female/NarelleMoon_16000.wav b/voices/eng/adult/female/NarelleMoon_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..b64375e6abbdd16d5599f9b58fe6880b1c3933a7 Binary files /dev/null and b/voices/eng/adult/female/NarelleMoon_16000.wav differ diff --git a/voices/eng/adult/female/NarelleMoon_24000.wav b/voices/eng/adult/female/NarelleMoon_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..bd4d1e16f70cbf781ad776cf128bb24bc1d412b1 Binary files /dev/null and b/voices/eng/adult/female/NarelleMoon_24000.wav differ diff --git a/voices/eng/adult/female/NovaHogarth_16000.wav b/voices/eng/adult/female/NovaHogarth_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..1eed5caa7caeaa2f58a7c8a4eeb5a6438b2432bd Binary files /dev/null and b/voices/eng/adult/female/NovaHogarth_16000.wav differ diff --git a/voices/eng/adult/female/NovaHogarth_24000.wav b/voices/eng/adult/female/NovaHogarth_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..868a14a759f3e6abdf3eaadbee03092a982afdea Binary files /dev/null and b/voices/eng/adult/female/NovaHogarth_24000.wav differ diff --git a/voices/eng/adult/female/RosemaryOkafor_16000.wav b/voices/eng/adult/female/RosemaryOkafor_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..5051ac66e121275b69c449673d710b4e3582ba82 Binary files /dev/null and b/voices/eng/adult/female/RosemaryOkafor_16000.wav differ diff --git a/voices/eng/adult/female/RosemaryOkafor_24000.wav b/voices/eng/adult/female/RosemaryOkafor_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..98a9267c0bb35b0b862367157a64ebdd66e361f1 Binary files /dev/null and b/voices/eng/adult/female/RosemaryOkafor_24000.wav differ diff --git a/voices/eng/adult/female/SofiaHellen_16000.wav b/voices/eng/adult/female/SofiaHellen_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..c2cbc4e54821e0c0b5eab430c028a9c82ef4338d Binary files /dev/null and b/voices/eng/adult/female/SofiaHellen_16000.wav differ diff --git a/voices/eng/adult/female/SofiaHellen_24000.wav b/voices/eng/adult/female/SofiaHellen_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..46a969874578bfeb2cb64acc99fb9ed5f311a32b Binary files /dev/null and b/voices/eng/adult/female/SofiaHellen_24000.wav differ diff --git a/voices/eng/adult/female/SuadQasim_16000.wav b/voices/eng/adult/female/SuadQasim_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..b2ddf95eace8cea9a191a9a86aab36f02190fe36 Binary files /dev/null and b/voices/eng/adult/female/SuadQasim_16000.wav differ diff --git a/voices/eng/adult/female/SuadQasim_24000.wav b/voices/eng/adult/female/SuadQasim_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..99a2a1e8bea95f0eeb4377b39fb8fb142c7d5e31 Binary files /dev/null and b/voices/eng/adult/female/SuadQasim_24000.wav differ diff --git a/voices/eng/adult/female/SzofiGranger_16000.wav b/voices/eng/adult/female/SzofiGranger_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..b77d8d3bd33968af26ffd1d132d1a94a23b9b1f4 Binary files /dev/null and b/voices/eng/adult/female/SzofiGranger_16000.wav differ diff --git a/voices/eng/adult/female/SzofiGranger_24000.wav b/voices/eng/adult/female/SzofiGranger_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..fb3d8f4fc1b887d8943228401574616cbfa1b309 Binary files /dev/null and b/voices/eng/adult/female/SzofiGranger_24000.wav differ diff --git a/voices/eng/adult/female/TammieEma_16000.wav b/voices/eng/adult/female/TammieEma_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..bdfceb6bcd68f0b6f370bf48a2217dd25d8aae8d Binary files /dev/null and b/voices/eng/adult/female/TammieEma_16000.wav differ diff --git a/voices/eng/adult/female/TammieEma_24000.wav b/voices/eng/adult/female/TammieEma_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..2982e28261c9ba266b45fbdbf822fca60b6ce52d Binary files /dev/null and b/voices/eng/adult/female/TammieEma_24000.wav differ diff --git a/voices/eng/adult/female/TammyGrit_16000.wav b/voices/eng/adult/female/TammyGrit_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..f9d8de4f8b544a3adfb95da18501d3004d575146 Binary files /dev/null and b/voices/eng/adult/female/TammyGrit_16000.wav differ diff --git a/voices/eng/adult/female/TammyGrit_24000.wav b/voices/eng/adult/female/TammyGrit_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..8e227622fd7089b3ff16f5ad7b491a9f52c13fba Binary files /dev/null and b/voices/eng/adult/female/TammyGrit_24000.wav differ diff --git a/voices/eng/adult/female/TanjaAdelina_16000.wav b/voices/eng/adult/female/TanjaAdelina_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..6b26db1b2f02cd593276576f0e07da1ed7513345 Binary files /dev/null and b/voices/eng/adult/female/TanjaAdelina_16000.wav differ diff --git a/voices/eng/adult/female/TanjaAdelina_24000.wav b/voices/eng/adult/female/TanjaAdelina_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..412d804b720f4c5b18a9268b91ce344606ea2b9c Binary files /dev/null and b/voices/eng/adult/female/TanjaAdelina_24000.wav differ diff --git a/voices/eng/adult/female/UtaObando_16000.wav b/voices/eng/adult/female/UtaObando_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..936db12a5ebd93bea217f011f07b9f4480d6a6cd Binary files /dev/null and b/voices/eng/adult/female/UtaObando_16000.wav differ diff --git a/voices/eng/adult/female/UtaObando_24000.wav b/voices/eng/adult/female/UtaObando_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..a5af7a70471a1d7582478aa91633efb6faeef4f0 Binary files /dev/null and b/voices/eng/adult/female/UtaObando_24000.wav differ diff --git a/voices/eng/adult/female/VjollcaJohnnie_16000.wav b/voices/eng/adult/female/VjollcaJohnnie_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..b9105aed56ca6bd021f8c9f113baf4c20c9fe1fa Binary files /dev/null and b/voices/eng/adult/female/VjollcaJohnnie_16000.wav differ diff --git a/voices/eng/adult/female/VjollcaJohnnie_24000.wav b/voices/eng/adult/female/VjollcaJohnnie_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..b9c7b79bf30155f63272cb6792e27a1533d04db8 Binary files /dev/null and b/voices/eng/adult/female/VjollcaJohnnie_24000.wav differ diff --git a/voices/eng/adult/female/bark/AlexandraHisakawa/AlexandraHisakawa.npz b/voices/eng/adult/female/bark/AlexandraHisakawa/AlexandraHisakawa.npz new file mode 100644 index 0000000000000000000000000000000000000000..ffebd599fbc05141d2d715758e9357e3bb13fdf7 Binary files /dev/null and b/voices/eng/adult/female/bark/AlexandraHisakawa/AlexandraHisakawa.npz differ diff --git a/voices/eng/adult/female/bark/AnaFlorence/AnaFlorence.npz b/voices/eng/adult/female/bark/AnaFlorence/AnaFlorence.npz new file mode 100644 index 0000000000000000000000000000000000000000..bd78714106751feddea0cd4f83aa98e2a10d5484 Binary files /dev/null and b/voices/eng/adult/female/bark/AnaFlorence/AnaFlorence.npz differ diff --git a/voices/eng/adult/female/bark/AnnmarieNele/AnnmarieNele.npz b/voices/eng/adult/female/bark/AnnmarieNele/AnnmarieNele.npz new file mode 100644 index 0000000000000000000000000000000000000000..d129ddd186cb0ce58468309648aa65792596bf18 Binary files /dev/null and b/voices/eng/adult/female/bark/AnnmarieNele/AnnmarieNele.npz differ diff --git "a/voices/eng/adult/female/bark/CamillaHolmstr\303\266m/CamillaHolmstr\303\266m.npz" "b/voices/eng/adult/female/bark/CamillaHolmstr\303\266m/CamillaHolmstr\303\266m.npz" new file mode 100644 index 0000000000000000000000000000000000000000..22e3b64844b3ac42b9cfcf0a0852a66c2b58d0b6 Binary files /dev/null and "b/voices/eng/adult/female/bark/CamillaHolmstr\303\266m/CamillaHolmstr\303\266m.npz" differ diff --git a/voices/eng/adult/female/bark/ChandraMacFarland/ChandraMacFarland.npz b/voices/eng/adult/female/bark/ChandraMacFarland/ChandraMacFarland.npz new file mode 100644 index 0000000000000000000000000000000000000000..be79af18a6a1c8d5ac215eeabfca7d868bfc2613 Binary files /dev/null and b/voices/eng/adult/female/bark/ChandraMacFarland/ChandraMacFarland.npz differ diff --git a/voices/eng/adult/female/bark/ClaribelDervla/ClaribelDervla.npz b/voices/eng/adult/female/bark/ClaribelDervla/ClaribelDervla.npz new file mode 100644 index 0000000000000000000000000000000000000000..c0277704c138fa5274c963ad047e9ae23997cd7d Binary files /dev/null and b/voices/eng/adult/female/bark/ClaribelDervla/ClaribelDervla.npz differ diff --git a/voices/eng/adult/female/bark/GittaNikolina/GittaNikolina.npz b/voices/eng/adult/female/bark/GittaNikolina/GittaNikolina.npz new file mode 100644 index 0000000000000000000000000000000000000000..286d21c6823d0ba5a8614f65feed15ad34215f03 Binary files /dev/null and b/voices/eng/adult/female/bark/GittaNikolina/GittaNikolina.npz differ diff --git a/voices/eng/adult/female/bark/GracieWise/GracieWise.npz b/voices/eng/adult/female/bark/GracieWise/GracieWise.npz new file mode 100644 index 0000000000000000000000000000000000000000..346d38b508735d4befe74f652692e4a706ef2a45 Binary files /dev/null and b/voices/eng/adult/female/bark/GracieWise/GracieWise.npz differ diff --git a/voices/eng/adult/female/bark/HenrietteUsha/HenrietteUsha.npz b/voices/eng/adult/female/bark/HenrietteUsha/HenrietteUsha.npz new file mode 100644 index 0000000000000000000000000000000000000000..0594f53ca03deb86474fe54209eca6c3c7889492 Binary files /dev/null and b/voices/eng/adult/female/bark/HenrietteUsha/HenrietteUsha.npz differ diff --git a/voices/eng/adult/female/bark/LidiyaSzekeres/LidiyaSzekeres.npz b/voices/eng/adult/female/bark/LidiyaSzekeres/LidiyaSzekeres.npz new file mode 100644 index 0000000000000000000000000000000000000000..f0ec9017be4582a89d933bd223dda50792178d88 Binary files /dev/null and b/voices/eng/adult/female/bark/LidiyaSzekeres/LidiyaSzekeres.npz differ diff --git a/voices/eng/adult/female/bark/LilyaStainthorpe/LilyaStainthorpe.npz b/voices/eng/adult/female/bark/LilyaStainthorpe/LilyaStainthorpe.npz new file mode 100644 index 0000000000000000000000000000000000000000..81f4b6f658bcb41db9142e9518e11160c6b3a034 Binary files /dev/null and b/voices/eng/adult/female/bark/LilyaStainthorpe/LilyaStainthorpe.npz differ diff --git a/voices/eng/adult/female/bark/MajaRuoho/MajaRuoho.npz b/voices/eng/adult/female/bark/MajaRuoho/MajaRuoho.npz new file mode 100644 index 0000000000000000000000000000000000000000..0a0c9daaf4655ee1cf9160194fb4591e22032238 Binary files /dev/null and b/voices/eng/adult/female/bark/MajaRuoho/MajaRuoho.npz differ diff --git a/voices/eng/adult/female/bark/NarelleMoon/NarelleMoon.npz b/voices/eng/adult/female/bark/NarelleMoon/NarelleMoon.npz new file mode 100644 index 0000000000000000000000000000000000000000..ccb2503d3130f9f82f2196cd4fbf6e7f0ddcdca6 Binary files /dev/null and b/voices/eng/adult/female/bark/NarelleMoon/NarelleMoon.npz differ diff --git a/voices/eng/adult/female/bark/NovaHogarth/NovaHogarth.npz b/voices/eng/adult/female/bark/NovaHogarth/NovaHogarth.npz new file mode 100644 index 0000000000000000000000000000000000000000..f5c8115603f52fbaca4144745d010b7ea3771068 Binary files /dev/null and b/voices/eng/adult/female/bark/NovaHogarth/NovaHogarth.npz differ diff --git a/voices/eng/adult/female/bark/RosemaryOkafor/RosemaryOkafor.npz b/voices/eng/adult/female/bark/RosemaryOkafor/RosemaryOkafor.npz new file mode 100644 index 0000000000000000000000000000000000000000..7aa0739711ad296ba3a4d2a980083c145a63b0f1 Binary files /dev/null and b/voices/eng/adult/female/bark/RosemaryOkafor/RosemaryOkafor.npz differ diff --git a/voices/eng/adult/female/bark/SofiaHellen/SofiaHellen.npz b/voices/eng/adult/female/bark/SofiaHellen/SofiaHellen.npz new file mode 100644 index 0000000000000000000000000000000000000000..7257ecfd12fc7e9109483b221a702c79c2f85c02 Binary files /dev/null and b/voices/eng/adult/female/bark/SofiaHellen/SofiaHellen.npz differ diff --git a/voices/eng/adult/female/bark/SuadQasim/SuadQasim.npz b/voices/eng/adult/female/bark/SuadQasim/SuadQasim.npz new file mode 100644 index 0000000000000000000000000000000000000000..1a96996478dd9b2d1b40bae7bb98c4fa86f64783 Binary files /dev/null and b/voices/eng/adult/female/bark/SuadQasim/SuadQasim.npz differ diff --git a/voices/eng/adult/female/bark/SzofiGranger/SzofiGranger.npz b/voices/eng/adult/female/bark/SzofiGranger/SzofiGranger.npz new file mode 100644 index 0000000000000000000000000000000000000000..857d9dd30e9877dc3f314d1c62c556a15edf4309 Binary files /dev/null and b/voices/eng/adult/female/bark/SzofiGranger/SzofiGranger.npz differ diff --git a/voices/eng/adult/female/bark/TammieEma/TammieEma.npz b/voices/eng/adult/female/bark/TammieEma/TammieEma.npz new file mode 100644 index 0000000000000000000000000000000000000000..c9ae5ec3f93f96065e12dbcac138cd0faa0284c1 Binary files /dev/null and b/voices/eng/adult/female/bark/TammieEma/TammieEma.npz differ diff --git a/voices/eng/adult/female/bark/TammyGrit/TammyGrit.npz b/voices/eng/adult/female/bark/TammyGrit/TammyGrit.npz new file mode 100644 index 0000000000000000000000000000000000000000..11cd1395f7e1a0c2adac86a9b8e5be5fd9f8c5a9 Binary files /dev/null and b/voices/eng/adult/female/bark/TammyGrit/TammyGrit.npz differ diff --git a/voices/eng/adult/female/bark/TanjaAdelina/TanjaAdelina.npz b/voices/eng/adult/female/bark/TanjaAdelina/TanjaAdelina.npz new file mode 100644 index 0000000000000000000000000000000000000000..2e48e97fddae5b4e953c334e8557d17ae4f0e993 Binary files /dev/null and b/voices/eng/adult/female/bark/TanjaAdelina/TanjaAdelina.npz differ diff --git a/voices/eng/adult/female/bark/UtaObando/UtaObando.npz b/voices/eng/adult/female/bark/UtaObando/UtaObando.npz new file mode 100644 index 0000000000000000000000000000000000000000..bf8cb6ed7facc58d822e1f8753c9aeb06852a9f1 Binary files /dev/null and b/voices/eng/adult/female/bark/UtaObando/UtaObando.npz differ diff --git a/voices/eng/adult/female/bark/VjollcaJohnnie/VjollcaJohnnie.npz b/voices/eng/adult/female/bark/VjollcaJohnnie/VjollcaJohnnie.npz new file mode 100644 index 0000000000000000000000000000000000000000..e561cd0f641d26f07ef5981ce3d9e3019ed11c83 Binary files /dev/null and b/voices/eng/adult/female/bark/VjollcaJohnnie/VjollcaJohnnie.npz differ diff --git a/voices/eng/adult/male/AaronDreschner_16000.wav b/voices/eng/adult/male/AaronDreschner_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..9af8fc5201b19d5d9fb4855e917ef23282ccd4af Binary files /dev/null and b/voices/eng/adult/male/AaronDreschner_16000.wav differ diff --git a/voices/eng/adult/male/AaronDreschner_24000.wav b/voices/eng/adult/male/AaronDreschner_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..186d52596fcea09daa2e4204cb24c03bee24c251 Binary files /dev/null and b/voices/eng/adult/male/AaronDreschner_24000.wav differ diff --git a/voices/eng/adult/male/AbrahanMack_16000.wav b/voices/eng/adult/male/AbrahanMack_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..ae58522598e0739b81862cc69f537a5b4bb9e7d1 Binary files /dev/null and b/voices/eng/adult/male/AbrahanMack_16000.wav differ diff --git a/voices/eng/adult/male/AbrahanMack_24000.wav b/voices/eng/adult/male/AbrahanMack_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..97bd373f0e3b3eb0e7f9fac87029d874f52007ba Binary files /dev/null and b/voices/eng/adult/male/AbrahanMack_24000.wav differ diff --git a/voices/eng/adult/male/AddeMichal_16000.wav b/voices/eng/adult/male/AddeMichal_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..dad56f8f645a79b86b2a20ea3ef2fbb8c3268201 Binary files /dev/null and b/voices/eng/adult/male/AddeMichal_16000.wav differ diff --git a/voices/eng/adult/male/AddeMichal_24000.wav b/voices/eng/adult/male/AddeMichal_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..2f0a5e4f07aa4ed7c9f66b39abffe95cbb3d395b Binary files /dev/null and b/voices/eng/adult/male/AddeMichal_24000.wav differ diff --git a/voices/eng/adult/male/BaldurSanjin_16000.wav b/voices/eng/adult/male/BaldurSanjin_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..367482bb96003fed0d325400b2d0455df6cb9d13 Binary files /dev/null and b/voices/eng/adult/male/BaldurSanjin_16000.wav differ diff --git a/voices/eng/adult/male/BaldurSanjin_24000.wav b/voices/eng/adult/male/BaldurSanjin_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..34e4c240fd80b59d13fc44b78cc8e8c412adebcf Binary files /dev/null and b/voices/eng/adult/male/BaldurSanjin_24000.wav differ diff --git a/voices/eng/adult/male/DionisioSchuyler_16000.wav b/voices/eng/adult/male/DionisioSchuyler_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..f80660274baddaa93a5583dd6f6a45f070cec83e Binary files /dev/null and b/voices/eng/adult/male/DionisioSchuyler_16000.wav differ diff --git a/voices/eng/adult/male/DionisioSchuyler_24000.wav b/voices/eng/adult/male/DionisioSchuyler_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..0e019e3b75566648324404a4c892e6cf5b4f5c7f Binary files /dev/null and b/voices/eng/adult/male/DionisioSchuyler_24000.wav differ diff --git "a/voices/eng/adult/male/EugenioMatarac\304\261_16000.wav" "b/voices/eng/adult/male/EugenioMatarac\304\261_16000.wav" new file mode 100644 index 0000000000000000000000000000000000000000..1cef2a91e6d1e539c49689745fd05cbeb9ae7585 Binary files /dev/null and "b/voices/eng/adult/male/EugenioMatarac\304\261_16000.wav" differ diff --git "a/voices/eng/adult/male/EugenioMatarac\304\261_24000.wav" "b/voices/eng/adult/male/EugenioMatarac\304\261_24000.wav" new file mode 100644 index 0000000000000000000000000000000000000000..ad84aefa9c6bf6ba4ec06def66ddf91fbad59239 Binary files /dev/null and "b/voices/eng/adult/male/EugenioMatarac\304\261_24000.wav" differ diff --git a/voices/eng/adult/male/FerranSimen_16000.wav b/voices/eng/adult/male/FerranSimen_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..f4406a7ed857d5df6f92995863e31a438053410b Binary files /dev/null and b/voices/eng/adult/male/FerranSimen_16000.wav differ diff --git a/voices/eng/adult/male/FerranSimen_24000.wav b/voices/eng/adult/male/FerranSimen_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..3c069a5d70cfc92684287248ec49095e7949ea4f Binary files /dev/null and b/voices/eng/adult/male/FerranSimen_24000.wav differ diff --git a/voices/eng/adult/male/FilipTraverse_16000.wav b/voices/eng/adult/male/FilipTraverse_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..31db01edc2125836ae3b6eb81f20970266a9a8d1 Binary files /dev/null and b/voices/eng/adult/male/FilipTraverse_16000.wav differ diff --git a/voices/eng/adult/male/FilipTraverse_24000.wav b/voices/eng/adult/male/FilipTraverse_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..3b5fff974d67381283c9ee0d51ee12b70d2c3ac1 Binary files /dev/null and b/voices/eng/adult/male/FilipTraverse_24000.wav differ diff --git a/voices/eng/adult/male/GilbertoMathias_16000.wav b/voices/eng/adult/male/GilbertoMathias_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..690407427819f1f41ed600aed81579502a3c276e Binary files /dev/null and b/voices/eng/adult/male/GilbertoMathias_16000.wav differ diff --git a/voices/eng/adult/male/GilbertoMathias_24000.wav b/voices/eng/adult/male/GilbertoMathias_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..afc81476d9980193f9cd92b58045acd97138a425 Binary files /dev/null and b/voices/eng/adult/male/GilbertoMathias_24000.wav differ diff --git a/voices/eng/adult/male/IgeBehringer_16000.wav b/voices/eng/adult/male/IgeBehringer_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..59bfd937ea38bd2ebc75b5708b97e3e0a5683013 Binary files /dev/null and b/voices/eng/adult/male/IgeBehringer_16000.wav differ diff --git a/voices/eng/adult/male/IgeBehringer_24000.wav b/voices/eng/adult/male/IgeBehringer_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..0f1aafc508539d8ed2647a80939faa8a761c3639 Binary files /dev/null and b/voices/eng/adult/male/IgeBehringer_24000.wav differ diff --git a/voices/eng/adult/male/IlkinUrbano_16000.wav b/voices/eng/adult/male/IlkinUrbano_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..7aa36f951146c03aa85c5108cda12fdeb9ec254a Binary files /dev/null and b/voices/eng/adult/male/IlkinUrbano_16000.wav differ diff --git a/voices/eng/adult/male/IlkinUrbano_24000.wav b/voices/eng/adult/male/IlkinUrbano_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..c1eec2e69a4968219be6606dc8802c4ae5114622 Binary files /dev/null and b/voices/eng/adult/male/IlkinUrbano_24000.wav differ diff --git a/voices/eng/adult/male/KumarDahl_16000.wav b/voices/eng/adult/male/KumarDahl_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..72b03672b05cb833efb0db2a2d6db0061a94aa4f Binary files /dev/null and b/voices/eng/adult/male/KumarDahl_16000.wav differ diff --git a/voices/eng/adult/male/KumarDahl_24000.wav b/voices/eng/adult/male/KumarDahl_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..ac9e568828878eb5397c99c9d915185bd537e146 Binary files /dev/null and b/voices/eng/adult/male/KumarDahl_24000.wav differ diff --git a/voices/eng/adult/male/LudvigMilivoj_16000.wav b/voices/eng/adult/male/LudvigMilivoj_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..649528536aeeaf10b498256c28d97ba82a92382b Binary files /dev/null and b/voices/eng/adult/male/LudvigMilivoj_16000.wav differ diff --git a/voices/eng/adult/male/LudvigMilivoj_24000.wav b/voices/eng/adult/male/LudvigMilivoj_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..7a8081d4542ccfa6030ed48fefac6829ea8acb64 Binary files /dev/null and b/voices/eng/adult/male/LudvigMilivoj_24000.wav differ diff --git a/voices/eng/adult/male/LuisMoray_16000.wav b/voices/eng/adult/male/LuisMoray_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..199760c7e18b7524c86b6f0106a8dcdaf5f5eb3d Binary files /dev/null and b/voices/eng/adult/male/LuisMoray_16000.wav differ diff --git a/voices/eng/adult/male/LuisMoray_24000.wav b/voices/eng/adult/male/LuisMoray_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..2b4d3a9fe03397c4f490b21714be4923686ecc48 Binary files /dev/null and b/voices/eng/adult/male/LuisMoray_24000.wav differ diff --git a/voices/eng/adult/male/MarcosRudaski_16000.wav b/voices/eng/adult/male/MarcosRudaski_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..7087a41e6160caa84036781ffd5d6ab1998248a3 Binary files /dev/null and b/voices/eng/adult/male/MarcosRudaski_16000.wav differ diff --git a/voices/eng/adult/male/MarcosRudaski_24000.wav b/voices/eng/adult/male/MarcosRudaski_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..6c68027fdd89087644be27e85e5519057902647b Binary files /dev/null and b/voices/eng/adult/male/MarcosRudaski_24000.wav differ diff --git a/voices/eng/adult/male/RoystonMin_16000.wav b/voices/eng/adult/male/RoystonMin_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..88bbc0e2925f76fec5de0da1b29fb1ffb64d0291 Binary files /dev/null and b/voices/eng/adult/male/RoystonMin_16000.wav differ diff --git a/voices/eng/adult/male/RoystonMin_24000.wav b/voices/eng/adult/male/RoystonMin_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..b375d72df1b574b79b1b275804b33d90db1e39f2 Binary files /dev/null and b/voices/eng/adult/male/RoystonMin_24000.wav differ diff --git a/voices/eng/adult/male/TorcullDiarmuid_16000.wav b/voices/eng/adult/male/TorcullDiarmuid_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..1fe4e4d777d0b8f0ad928c85f9bb2f76871c518d Binary files /dev/null and b/voices/eng/adult/male/TorcullDiarmuid_16000.wav differ diff --git a/voices/eng/adult/male/TorcullDiarmuid_24000.wav b/voices/eng/adult/male/TorcullDiarmuid_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..d037907221e6ce36f568790d3cc287500088fb7a Binary files /dev/null and b/voices/eng/adult/male/TorcullDiarmuid_24000.wav differ diff --git a/voices/eng/adult/male/ViktorEka_16000.wav b/voices/eng/adult/male/ViktorEka_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..d2bd41035e72ef14a44a5a8d3d5cc70a6797185e Binary files /dev/null and b/voices/eng/adult/male/ViktorEka_16000.wav differ diff --git a/voices/eng/adult/male/ViktorEka_24000.wav b/voices/eng/adult/male/ViktorEka_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..c394661d8e0c69c22aa608b7bdd437003b152bc6 Binary files /dev/null and b/voices/eng/adult/male/ViktorEka_24000.wav differ diff --git a/voices/eng/adult/male/ViktorMenelaos_16000.wav b/voices/eng/adult/male/ViktorMenelaos_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..e31e5229b06bc68a267cee9917e7f3ef285f7432 Binary files /dev/null and b/voices/eng/adult/male/ViktorMenelaos_16000.wav differ diff --git a/voices/eng/adult/male/ViktorMenelaos_24000.wav b/voices/eng/adult/male/ViktorMenelaos_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..d764a1fe8f78dca18ab0b9d0d3833355c250472b Binary files /dev/null and b/voices/eng/adult/male/ViktorMenelaos_24000.wav differ diff --git a/voices/eng/adult/male/WulfCarlevaro_16000.wav b/voices/eng/adult/male/WulfCarlevaro_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..833fc5f10ad49701512129dbb99325a98755bbff Binary files /dev/null and b/voices/eng/adult/male/WulfCarlevaro_16000.wav differ diff --git a/voices/eng/adult/male/WulfCarlevaro_24000.wav b/voices/eng/adult/male/WulfCarlevaro_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..9b183516d89c6781d347e3f44a2cd9ebef46fce6 Binary files /dev/null and b/voices/eng/adult/male/WulfCarlevaro_24000.wav differ diff --git a/voices/eng/adult/male/XavierHayasaka_16000.wav b/voices/eng/adult/male/XavierHayasaka_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..f5064d1d90680d3d443e0dc63dcaea11f59ae74a Binary files /dev/null and b/voices/eng/adult/male/XavierHayasaka_16000.wav differ diff --git a/voices/eng/adult/male/XavierHayasaka_24000.wav b/voices/eng/adult/male/XavierHayasaka_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..14763591a43e2a89da183e4e1ae118cb4cf4bee3 Binary files /dev/null and b/voices/eng/adult/male/XavierHayasaka_24000.wav differ diff --git a/voices/eng/adult/male/ZacharieAimilios_16000.wav b/voices/eng/adult/male/ZacharieAimilios_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..4375d81787b66e1dd782fb8e27afc02c66e5faff Binary files /dev/null and b/voices/eng/adult/male/ZacharieAimilios_16000.wav differ diff --git a/voices/eng/adult/male/ZacharieAimilios_24000.wav b/voices/eng/adult/male/ZacharieAimilios_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..158b1d52a621ead5e852b824b09f780dc9059c80 Binary files /dev/null and b/voices/eng/adult/male/ZacharieAimilios_24000.wav differ diff --git a/voices/eng/adult/male/ZofijaKendrick_16000.wav b/voices/eng/adult/male/ZofijaKendrick_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..542061477fda18c0cb610bc769cd77d17134c51f Binary files /dev/null and b/voices/eng/adult/male/ZofijaKendrick_16000.wav differ diff --git a/voices/eng/adult/male/ZofijaKendrick_24000.wav b/voices/eng/adult/male/ZofijaKendrick_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..52b43e0b99f6f17dda264f93d0ac50f0cd076cc1 Binary files /dev/null and b/voices/eng/adult/male/ZofijaKendrick_24000.wav differ diff --git a/voices/eng/adult/male/bark/AaronDreschner/AaronDreschner.npz b/voices/eng/adult/male/bark/AaronDreschner/AaronDreschner.npz new file mode 100644 index 0000000000000000000000000000000000000000..c8384a97a6a82d032b6544a51345926deb6ae4eb Binary files /dev/null and b/voices/eng/adult/male/bark/AaronDreschner/AaronDreschner.npz differ diff --git a/voices/eng/adult/male/bark/AbrahanMack/AbrahanMack.npz b/voices/eng/adult/male/bark/AbrahanMack/AbrahanMack.npz new file mode 100644 index 0000000000000000000000000000000000000000..70fb851e8cbebd53d8e60c297ac610e06c772bea Binary files /dev/null and b/voices/eng/adult/male/bark/AbrahanMack/AbrahanMack.npz differ diff --git a/voices/eng/adult/male/bark/AddeMichal/AddeMichal.npz b/voices/eng/adult/male/bark/AddeMichal/AddeMichal.npz new file mode 100644 index 0000000000000000000000000000000000000000..d3ad5cd1e0955f4c36df7aeb6e04814624253dde Binary files /dev/null and b/voices/eng/adult/male/bark/AddeMichal/AddeMichal.npz differ diff --git a/voices/eng/adult/male/bark/BaldurSanjin/BaldurSanjin.npz b/voices/eng/adult/male/bark/BaldurSanjin/BaldurSanjin.npz new file mode 100644 index 0000000000000000000000000000000000000000..e0cfb26d84d7e62b81e2544e939c458077fc375c Binary files /dev/null and b/voices/eng/adult/male/bark/BaldurSanjin/BaldurSanjin.npz differ diff --git a/voices/eng/adult/male/bark/DionisioSchuyler/DionisioSchuyler.npz b/voices/eng/adult/male/bark/DionisioSchuyler/DionisioSchuyler.npz new file mode 100644 index 0000000000000000000000000000000000000000..0deb94b17753eda5089b7ce1f2c3e529cebedcd0 Binary files /dev/null and b/voices/eng/adult/male/bark/DionisioSchuyler/DionisioSchuyler.npz differ diff --git "a/voices/eng/adult/male/bark/EugenioMatarac\304\261/EugenioMatarac\304\261.npz" "b/voices/eng/adult/male/bark/EugenioMatarac\304\261/EugenioMatarac\304\261.npz" new file mode 100644 index 0000000000000000000000000000000000000000..ec0dd172271aadaf9682ec008126297941cbd170 Binary files /dev/null and "b/voices/eng/adult/male/bark/EugenioMatarac\304\261/EugenioMatarac\304\261.npz" differ diff --git a/voices/eng/adult/male/bark/FerranSimen/FerranSimen.npz b/voices/eng/adult/male/bark/FerranSimen/FerranSimen.npz new file mode 100644 index 0000000000000000000000000000000000000000..45807a4c7c6384591e2271bd6ce4c0f092e2a11b Binary files /dev/null and b/voices/eng/adult/male/bark/FerranSimen/FerranSimen.npz differ diff --git a/voices/eng/adult/male/bark/FilipTraverse/FilipTraverse.npz b/voices/eng/adult/male/bark/FilipTraverse/FilipTraverse.npz new file mode 100644 index 0000000000000000000000000000000000000000..6da94fb739c237161c10914d8f671782b35496dd Binary files /dev/null and b/voices/eng/adult/male/bark/FilipTraverse/FilipTraverse.npz differ diff --git a/voices/eng/adult/male/bark/GilbertoMathias/GilbertoMathias.npz b/voices/eng/adult/male/bark/GilbertoMathias/GilbertoMathias.npz new file mode 100644 index 0000000000000000000000000000000000000000..20a312378673c298551cce7a4286cad5bbfd7e14 Binary files /dev/null and b/voices/eng/adult/male/bark/GilbertoMathias/GilbertoMathias.npz differ diff --git a/voices/eng/adult/male/bark/IgeBehringer/IgeBehringer.npz b/voices/eng/adult/male/bark/IgeBehringer/IgeBehringer.npz new file mode 100644 index 0000000000000000000000000000000000000000..bee402d83a8b0035ef89de1f5e83feea96af28f3 Binary files /dev/null and b/voices/eng/adult/male/bark/IgeBehringer/IgeBehringer.npz differ diff --git a/voices/eng/adult/male/bark/IlkinUrbano/IlkinUrbano.npz b/voices/eng/adult/male/bark/IlkinUrbano/IlkinUrbano.npz new file mode 100644 index 0000000000000000000000000000000000000000..23baa65111c6b2e089cd014882c11430b1db7407 Binary files /dev/null and b/voices/eng/adult/male/bark/IlkinUrbano/IlkinUrbano.npz differ diff --git a/voices/eng/adult/male/bark/KumarDahl/KumarDahl.npz b/voices/eng/adult/male/bark/KumarDahl/KumarDahl.npz new file mode 100644 index 0000000000000000000000000000000000000000..e9c255c06d049a95e5aa5de9843b207ec644e1af Binary files /dev/null and b/voices/eng/adult/male/bark/KumarDahl/KumarDahl.npz differ diff --git a/voices/eng/adult/male/bark/LudvigMilivoj/LudvigMilivoj.npz b/voices/eng/adult/male/bark/LudvigMilivoj/LudvigMilivoj.npz new file mode 100644 index 0000000000000000000000000000000000000000..70d17b7e55830797f4cb18aa9bd3c8d464012353 Binary files /dev/null and b/voices/eng/adult/male/bark/LudvigMilivoj/LudvigMilivoj.npz differ diff --git a/voices/eng/adult/male/bark/LuisMoray/LuisMoray.npz b/voices/eng/adult/male/bark/LuisMoray/LuisMoray.npz new file mode 100644 index 0000000000000000000000000000000000000000..a5b179ab191a23375f8fc2bdddc7155b0c85be1a Binary files /dev/null and b/voices/eng/adult/male/bark/LuisMoray/LuisMoray.npz differ diff --git a/voices/eng/adult/male/bark/MarcosRudaski/MarcosRudaski.npz b/voices/eng/adult/male/bark/MarcosRudaski/MarcosRudaski.npz new file mode 100644 index 0000000000000000000000000000000000000000..a0941329ddca97797353314c80cb85d019551338 Binary files /dev/null and b/voices/eng/adult/male/bark/MarcosRudaski/MarcosRudaski.npz differ diff --git a/voices/eng/adult/male/bark/RoystonMin/RoystonMin.npz b/voices/eng/adult/male/bark/RoystonMin/RoystonMin.npz new file mode 100644 index 0000000000000000000000000000000000000000..3b6a119244d32fc46e009d043125beab6ac82cb0 Binary files /dev/null and b/voices/eng/adult/male/bark/RoystonMin/RoystonMin.npz differ diff --git a/voices/eng/adult/male/bark/TorcullDiarmuid/TorcullDiarmuid.npz b/voices/eng/adult/male/bark/TorcullDiarmuid/TorcullDiarmuid.npz new file mode 100644 index 0000000000000000000000000000000000000000..e0447c8b26fd2d7d1993191fdf2381f1517ee97a Binary files /dev/null and b/voices/eng/adult/male/bark/TorcullDiarmuid/TorcullDiarmuid.npz differ diff --git a/voices/eng/adult/male/bark/ViktorEka/ViktorEka.npz b/voices/eng/adult/male/bark/ViktorEka/ViktorEka.npz new file mode 100644 index 0000000000000000000000000000000000000000..5e0e6267bf868e68748e2291a31d56d2f69254c7 Binary files /dev/null and b/voices/eng/adult/male/bark/ViktorEka/ViktorEka.npz differ diff --git a/voices/eng/adult/male/bark/ViktorMenelaos/ViktorMenelaos.npz b/voices/eng/adult/male/bark/ViktorMenelaos/ViktorMenelaos.npz new file mode 100644 index 0000000000000000000000000000000000000000..1df663518d66c8704de411b3cf1b32acd1021c72 Binary files /dev/null and b/voices/eng/adult/male/bark/ViktorMenelaos/ViktorMenelaos.npz differ diff --git a/voices/eng/adult/male/bark/WulfCarlevaro/WulfCarlevaro.npz b/voices/eng/adult/male/bark/WulfCarlevaro/WulfCarlevaro.npz new file mode 100644 index 0000000000000000000000000000000000000000..f5abddaf80027832db3faf48d56dad0a05562113 Binary files /dev/null and b/voices/eng/adult/male/bark/WulfCarlevaro/WulfCarlevaro.npz differ diff --git a/voices/eng/adult/male/bark/XavierHayasaka/XavierHayasaka.npz b/voices/eng/adult/male/bark/XavierHayasaka/XavierHayasaka.npz new file mode 100644 index 0000000000000000000000000000000000000000..ade21de58298d36dd5bfd1f63faffa3a6b62d6ff Binary files /dev/null and b/voices/eng/adult/male/bark/XavierHayasaka/XavierHayasaka.npz differ diff --git a/voices/eng/adult/male/bark/ZacharieAimilios/ZacharieAimilios.npz b/voices/eng/adult/male/bark/ZacharieAimilios/ZacharieAimilios.npz new file mode 100644 index 0000000000000000000000000000000000000000..b135243e2ac6ae96c923c5a8ae3b2d8459e629d8 Binary files /dev/null and b/voices/eng/adult/male/bark/ZacharieAimilios/ZacharieAimilios.npz differ diff --git a/voices/eng/adult/male/bark/ZofijaKendrick/ZofijaKendrick.npz b/voices/eng/adult/male/bark/ZofijaKendrick/ZofijaKendrick.npz new file mode 100644 index 0000000000000000000000000000000000000000..e6bc5da03ec16100c27c414645db0c7cc02e8164 Binary files /dev/null and b/voices/eng/adult/male/bark/ZofijaKendrick/ZofijaKendrick.npz differ diff --git a/voices/eng/child/female/DaisyStudious_16000.wav b/voices/eng/child/female/DaisyStudious_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..bba8e971f50163a7029832f77717d0d35e96104f Binary files /dev/null and b/voices/eng/child/female/DaisyStudious_16000.wav differ diff --git a/voices/eng/child/female/DaisyStudious_24000.wav b/voices/eng/child/female/DaisyStudious_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..f3aca2538756d11f882e773a0133e6af32bfd65e Binary files /dev/null and b/voices/eng/child/female/DaisyStudious_24000.wav differ diff --git a/voices/eng/child/female/bark/DaisyStudious/DaisyStudious.npz b/voices/eng/child/female/bark/DaisyStudious/DaisyStudious.npz new file mode 100644 index 0000000000000000000000000000000000000000..71b82ac1c4dd26abc0c5bcd58c07ddd709da95b2 Binary files /dev/null and b/voices/eng/child/female/bark/DaisyStudious/DaisyStudious.npz differ diff --git a/voices/eng/child/male/AndrewChipper_16000.wav b/voices/eng/child/male/AndrewChipper_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..9fc5802762532b5cd5264f5f742e16a65610bc8d Binary files /dev/null and b/voices/eng/child/male/AndrewChipper_16000.wav differ diff --git a/voices/eng/child/male/AndrewChipper_24000.wav b/voices/eng/child/male/AndrewChipper_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..18182d7335c50a6820e87b380076b69d98012926 Binary files /dev/null and b/voices/eng/child/male/AndrewChipper_24000.wav differ diff --git a/voices/eng/child/male/bark/AndrewChipper/AndrewChipper.npz b/voices/eng/child/male/bark/AndrewChipper/AndrewChipper.npz new file mode 100644 index 0000000000000000000000000000000000000000..745f2cdd5af8dccdaca2c8473aac68dba049962d Binary files /dev/null and b/voices/eng/child/male/bark/AndrewChipper/AndrewChipper.npz differ diff --git a/voices/eng/default.txt b/voices/eng/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..7bcf293d3d96777805a180f4e4d0b1929aeb2fc1 --- /dev/null +++ b/voices/eng/default.txt @@ -0,0 +1 @@ +an Xtts engine built-in voice , ready to speak for any kind of text ! A big juicy fish jumps quickly ; vexed , the dwarf whacks my zippered box \ No newline at end of file diff --git a/voices/eng/elder/male/CraigGutsy_16000.wav b/voices/eng/elder/male/CraigGutsy_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..cd9d5e58583a5722fcf81a38ace83ac4a3540676 Binary files /dev/null and b/voices/eng/elder/male/CraigGutsy_16000.wav differ diff --git a/voices/eng/elder/male/CraigGutsy_24000.wav b/voices/eng/elder/male/CraigGutsy_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..755200ea6eabd68bc9413b83ab6d39ad4048e198 Binary files /dev/null and b/voices/eng/elder/male/CraigGutsy_24000.wav differ diff --git a/voices/eng/elder/male/DamienBlack_16000.wav b/voices/eng/elder/male/DamienBlack_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..27cfd3b2d9880de83d91e6a12e914f12314ff570 Binary files /dev/null and b/voices/eng/elder/male/DamienBlack_16000.wav differ diff --git a/voices/eng/elder/male/DamienBlack_24000.wav b/voices/eng/elder/male/DamienBlack_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..84a4075f630c0a6ba185c0e36a41a00952815bcf Binary files /dev/null and b/voices/eng/elder/male/DamienBlack_24000.wav differ diff --git a/voices/eng/elder/male/bark/CraigGutsy/CraigGutsy.npz b/voices/eng/elder/male/bark/CraigGutsy/CraigGutsy.npz new file mode 100644 index 0000000000000000000000000000000000000000..3f98ca2bd51e7cb7884bd0c4083ed0f759a4cc10 Binary files /dev/null and b/voices/eng/elder/male/bark/CraigGutsy/CraigGutsy.npz differ diff --git a/voices/eng/elder/male/bark/DamienBlack/DamienBlack.npz b/voices/eng/elder/male/bark/DamienBlack/DamienBlack.npz new file mode 100644 index 0000000000000000000000000000000000000000..db2305a959bc5c572c17338f79a80b06d2c0aa31 Binary files /dev/null and b/voices/eng/elder/male/bark/DamienBlack/DamienBlack.npz differ diff --git a/voices/eng/teen/female/AlisonDietlinde_16000.wav b/voices/eng/teen/female/AlisonDietlinde_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..9e32d357915c15525900d3289713b7569873f375 Binary files /dev/null and b/voices/eng/teen/female/AlisonDietlinde_16000.wav differ diff --git a/voices/eng/teen/female/AlisonDietlinde_24000.wav b/voices/eng/teen/female/AlisonDietlinde_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..dcb983247b8519013d3eb55ff622401be1874683 Binary files /dev/null and b/voices/eng/teen/female/AlisonDietlinde_24000.wav differ diff --git a/voices/eng/teen/female/BadrOdhiambo_16000.wav b/voices/eng/teen/female/BadrOdhiambo_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..633dc927894a60df9f9cd47e732f3e930534f986 Binary files /dev/null and b/voices/eng/teen/female/BadrOdhiambo_16000.wav differ diff --git a/voices/eng/teen/female/BadrOdhiambo_24000.wav b/voices/eng/teen/female/BadrOdhiambo_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..dcef6b178363b13731e148143f2d791f8a65ec48 Binary files /dev/null and b/voices/eng/teen/female/BadrOdhiambo_24000.wav differ diff --git a/voices/eng/teen/female/BarboraMacLean_16000.wav b/voices/eng/teen/female/BarboraMacLean_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..9efc87e2baa92743d2b937e2aade71288cb46980 Binary files /dev/null and b/voices/eng/teen/female/BarboraMacLean_16000.wav differ diff --git a/voices/eng/teen/female/BarboraMacLean_24000.wav b/voices/eng/teen/female/BarboraMacLean_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..6c6603f790f2a68061b3317cd28cd60be3159264 Binary files /dev/null and b/voices/eng/teen/female/BarboraMacLean_24000.wav differ diff --git a/voices/eng/teen/female/BrendaStern_16000.wav b/voices/eng/teen/female/BrendaStern_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..3439e67b280f4d71f618c7504d270a1a42bd1dc2 Binary files /dev/null and b/voices/eng/teen/female/BrendaStern_16000.wav differ diff --git a/voices/eng/teen/female/BrendaStern_24000.wav b/voices/eng/teen/female/BrendaStern_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..4a1fd5797357d484c651916eee2f75c4eb6af2e0 Binary files /dev/null and b/voices/eng/teen/female/BrendaStern_24000.wav differ diff --git a/voices/eng/teen/female/bark/AlisonDietlinde/AlisonDietlinde.npz b/voices/eng/teen/female/bark/AlisonDietlinde/AlisonDietlinde.npz new file mode 100644 index 0000000000000000000000000000000000000000..35acb316ba4ca7176456a74aa75bc4d73bc0a94b Binary files /dev/null and b/voices/eng/teen/female/bark/AlisonDietlinde/AlisonDietlinde.npz differ diff --git a/voices/eng/teen/female/bark/BadrOdhiambo/BadrOdhiambo.npz b/voices/eng/teen/female/bark/BadrOdhiambo/BadrOdhiambo.npz new file mode 100644 index 0000000000000000000000000000000000000000..54e69ec1464414c7ff864152d96ee4f8d8eb1589 Binary files /dev/null and b/voices/eng/teen/female/bark/BadrOdhiambo/BadrOdhiambo.npz differ diff --git a/voices/eng/teen/female/bark/BarboraMacLean/BarboraMacLean.npz b/voices/eng/teen/female/bark/BarboraMacLean/BarboraMacLean.npz new file mode 100644 index 0000000000000000000000000000000000000000..a03112810008c1e78453986dc7a7545d12c0e1b6 Binary files /dev/null and b/voices/eng/teen/female/bark/BarboraMacLean/BarboraMacLean.npz differ diff --git a/voices/eng/teen/female/bark/BrendaStern/BrendaStern.npz b/voices/eng/teen/female/bark/BrendaStern/BrendaStern.npz new file mode 100644 index 0000000000000000000000000000000000000000..f3ca2969d838197c6cabbd704300b7adce02d8de Binary files /dev/null and b/voices/eng/teen/female/bark/BrendaStern/BrendaStern.npz differ diff --git a/voices/eng/teen/male/DamjanChapman_16000.wav b/voices/eng/teen/male/DamjanChapman_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..c6adf36476a23935b00c9f2c6756a9d0d95d0e0d Binary files /dev/null and b/voices/eng/teen/male/DamjanChapman_16000.wav differ diff --git a/voices/eng/teen/male/DamjanChapman_24000.wav b/voices/eng/teen/male/DamjanChapman_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..ee57287597c729a15e21863d2e4bf07d36624cc6 Binary files /dev/null and b/voices/eng/teen/male/DamjanChapman_24000.wav differ diff --git a/voices/eng/teen/male/bark/DamjanChapman/DamjanChapman.npz b/voices/eng/teen/male/bark/DamjanChapman/DamjanChapman.npz new file mode 100644 index 0000000000000000000000000000000000000000..daca45391905baa88e922d94d33ee3cee8c9255b Binary files /dev/null and b/voices/eng/teen/male/bark/DamjanChapman/DamjanChapman.npz differ diff --git a/voices/eus/.gitkeep b/voices/eus/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/eus/default.txt b/voices/eus/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..3295ca32e26341429cd5382ca848a46ad169653b --- /dev/null +++ b/voices/eus/default.txt @@ -0,0 +1 @@ +XTTS motor bat ahots integratua, edozein motatako testurako hitz egiteko prest! Arrain urtsu handi batek azkar jauzi egiten du; Bihurritu, nanoen kaxa kaxa \ No newline at end of file diff --git a/voices/fas/.gitkeep b/voices/fas/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/fas/adult/female/ParisaDaryanavard_16000.wav b/voices/fas/adult/female/ParisaDaryanavard_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..6727ec90e154c0fe381f599c4917f14d1101da2c Binary files /dev/null and b/voices/fas/adult/female/ParisaDaryanavard_16000.wav differ diff --git a/voices/fas/adult/female/ParisaDaryanavard_24000.wav b/voices/fas/adult/female/ParisaDaryanavard_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..1f55db8eae302888eb65eb29dc71876b117068c9 Binary files /dev/null and b/voices/fas/adult/female/ParisaDaryanavard_24000.wav differ diff --git a/voices/fas/adult/male/KianSaharkhiz_16000.wav b/voices/fas/adult/male/KianSaharkhiz_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..f310827f9b30f5e8e51c0cecebd05498a3d96e65 Binary files /dev/null and b/voices/fas/adult/male/KianSaharkhiz_16000.wav differ diff --git a/voices/fas/adult/male/KianSaharkhiz_24000.wav b/voices/fas/adult/male/KianSaharkhiz_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..06eff93f480f7a777eae990522cf4dcbba3d8950 Binary files /dev/null and b/voices/fas/adult/male/KianSaharkhiz_24000.wav differ diff --git a/voices/fas/default.txt b/voices/fas/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..c6626bf97e29c543471b00de9e68f54dfddec071 --- /dev/null +++ b/voices/fas/default.txt @@ -0,0 +1 @@ +یک موتور XTTS با صدای داخلی ، آماده صحبت کردن برای هر نوع متن! یک ماهی بزرگ آبدار به سرعت پرش می کند… با صدای جنجال ، کوتوله جعبه زیپ من \ No newline at end of file diff --git a/voices/fra/.gitkeep b/voices/fra/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/fra/adult/male/PierreBellemare_16000.wav b/voices/fra/adult/male/PierreBellemare_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..47b65d958c34316695d404134ccc68eaa8433b50 Binary files /dev/null and b/voices/fra/adult/male/PierreBellemare_16000.wav differ diff --git a/voices/fra/adult/male/PierreBellemare_24000.wav b/voices/fra/adult/male/PierreBellemare_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..37bdab240714c0417fd5abb20cfe33877b081ad9 Binary files /dev/null and b/voices/fra/adult/male/PierreBellemare_24000.wav differ diff --git a/voices/fra/child/male/AndrewChipper_16000.wav b/voices/fra/child/male/AndrewChipper_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..8c140cf7344c672434176185834832c03463f827 Binary files /dev/null and b/voices/fra/child/male/AndrewChipper_16000.wav differ diff --git a/voices/fra/child/male/AndrewChipper_24000.wav b/voices/fra/child/male/AndrewChipper_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..a5cac385b5a18713227e8f104d51e44812580c44 Binary files /dev/null and b/voices/fra/child/male/AndrewChipper_24000.wav differ diff --git a/voices/fra/child/male/bark/AndrewChipper/AndrewChipper.npz b/voices/fra/child/male/bark/AndrewChipper/AndrewChipper.npz new file mode 100644 index 0000000000000000000000000000000000000000..b3349c0d0c90a114767c1d96bb105f935ccd5492 Binary files /dev/null and b/voices/fra/child/male/bark/AndrewChipper/AndrewChipper.npz differ diff --git a/voices/fra/default.txt b/voices/fra/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..2938eba1cb1070292b4e116647d55acdd893b694 --- /dev/null +++ b/voices/fra/default.txt @@ -0,0 +1 @@ +Une voix intégrée de moteur XTTS, prêt à parler pour tout type de texte! Un gros poisson juteux saute rapidement; vexé, le nain frappe ma boîte à fermeture éclair \ No newline at end of file diff --git a/voices/fra/elder/female/MashaBeranger_16000.wav b/voices/fra/elder/female/MashaBeranger_16000.wav new file mode 100644 index 0000000000000000000000000000000000000000..f59794337104f9cf569020bda853bc432fa916da Binary files /dev/null and b/voices/fra/elder/female/MashaBeranger_16000.wav differ diff --git a/voices/fra/elder/female/MashaBeranger_24000.wav b/voices/fra/elder/female/MashaBeranger_24000.wav new file mode 100644 index 0000000000000000000000000000000000000000..8913bca3d23cad6463c50623ba48898701f3bb9d Binary files /dev/null and b/voices/fra/elder/female/MashaBeranger_24000.wav differ diff --git a/voices/hin/.gitkeep b/voices/hin/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/hin/default.txt b/voices/hin/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..edf935c5cc87a4375abee91a09dfdd6a5418310e --- /dev/null +++ b/voices/hin/default.txt @@ -0,0 +1 @@ +एक XTTS इंजन निर्मित आवाज, किसी भी तरह के पाठ के लिए बोलने के लिए तैयार! एक बड़ी रसदार मछली जल्दी से कूद जाती है; vexed, बौना मेरे ज़िप्ड बॉक्स को मारता है \ No newline at end of file diff --git a/voices/hun/.gitkeep b/voices/hun/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/hun/default.txt b/voices/hun/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..3986d7fb1ce52e03d7ddce3a058ff02b61681e8c --- /dev/null +++ b/voices/hun/default.txt @@ -0,0 +1 @@ +Egy XTTS motor beépített hangja, készen áll arra, hogy bármilyen szövegért beszéljen! Egy nagy lédús hal gyorsan ugrik; bosszantott, a törpe üti a cipzáras dobozomat \ No newline at end of file diff --git a/voices/ind/.gitkeep b/voices/ind/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/ind/default.txt b/voices/ind/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..eeed13035282ee74d64eb2983f27555c1884713f --- /dev/null +++ b/voices/ind/default.txt @@ -0,0 +1 @@ +Suara built-in mesin XTTS, siap berbicara untuk segala jenis teks! Ikan berair besar melompat dengan cepat; jengkel, kurcaci itu memukul kotak ritsleting saya \ No newline at end of file diff --git a/voices/ita/.gitkeep b/voices/ita/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/ita/default.txt b/voices/ita/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..d86e932d762caa25a45c295e57b55a1e74d083c5 --- /dev/null +++ b/voices/ita/default.txt @@ -0,0 +1 @@ +Una voce integrata del motore XTTS, pronta a parlare per qualsiasi tipo di testo! Un grande pesce succoso salta rapidamente; VESSED, il nano colpisce la mia scatola con cerniera \ No newline at end of file diff --git a/voices/jpn/.gitkeep b/voices/jpn/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/jpn/default.txt b/voices/jpn/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..b7dea23063241a12b18aa09fdbec5559bf998932 --- /dev/null +++ b/voices/jpn/default.txt @@ -0,0 +1 @@ +XTTSエンジンが組み込まれた音声、あらゆる種類のテキストについて話す準備ができています!大きなジューシーな魚がすぐにジャンプします。悩まされて、ドワーフは私のジッパーボックスを叩きます \ No newline at end of file diff --git a/voices/kor/.gitkeep b/voices/kor/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/kor/default.txt b/voices/kor/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..718bb0effb776202da7d8b6a018c698778832ab5 --- /dev/null +++ b/voices/kor/default.txt @@ -0,0 +1 @@ +XTTS 엔진 내장 음성, 모든 종류의 텍스트에 대해 말할 준비가되었습니다! 큰 육즙이 많은 물고기가 빨리 점프합니다… vexed, 난쟁이가 내 지퍼가 달린 상자를 whack습니다 \ No newline at end of file diff --git a/voices/mya/.gitkeep b/voices/mya/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/mya/default.txt b/voices/mya/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..f3a369222d430d79d7b9eb28bd1a9f0671c4df41 --- /dev/null +++ b/voices/mya/default.txt @@ -0,0 +1 @@ +တစ် ဦး xtts အင်ဂျင် built-in အသံ, မည်သည့်စာသားအတွက်စကားပြောဆိုရန်အဆင်သင့်! ကြီးမားတဲ့အရည်ရွှမ်းတဲ့ငါးကြီးကမြန်မြန်ခုန်တတ်တယ်။ ဝေဒနာသည်ကျွန်ုပ်၏ဇစ်သေတ္တာကိုဝေမျှသည် \ No newline at end of file diff --git a/voices/nya/.gitkeep b/voices/nya/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/nya/default.txt b/voices/nya/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..4736200eecf06a22817e0776250a9b32ce77d8fb --- /dev/null +++ b/voices/nya/default.txt @@ -0,0 +1 @@ +Ma XTTTS Injini Omangidwa-mu Mawu, okonzeka kuyankhula za mawu amtundu uliwonse! Nsomba yayikulu yodukiza mwachangu; Votekisi, kanyedwe kakang'ono kambiri \ No newline at end of file diff --git a/voices/pol/.gitkeep b/voices/pol/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/pol/default.txt b/voices/pol/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..bc29627d09abdda2d1350ded2804be3dff8470da --- /dev/null +++ b/voices/pol/default.txt @@ -0,0 +1 @@ +Wbudowany głos silnika XTTTS, gotowy mówić o dowolnym tekście! Wielka soczysta ryba szybko skacze; Zirygnie, krasnolud walczy z moim zamkiem błyskawicznym \ No newline at end of file diff --git a/voices/por/.gitkeep b/voices/por/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/por/default.txt b/voices/por/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..10bd56d9b0fc135aab75acb43f2d2bc12941f783 --- /dev/null +++ b/voices/por/default.txt @@ -0,0 +1 @@ +Um mecanismo XTTS, voz embutida, pronta para falar para qualquer tipo de texto! Um grande peixe suculento pula rapidamente; irritado, o anão bate minha caixa com zíper \ No newline at end of file diff --git a/voices/rus/.gitkeep b/voices/rus/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/rus/default.txt b/voices/rus/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..75a9a5d728528bcd4cd2867e5095591311fecf05 --- /dev/null +++ b/voices/rus/default.txt @@ -0,0 +1 @@ +Встроенный голос двигателя XTTS, готовый говорить за любой текст! Большая сочная рыба быстро прыгает; расстраивается, гномо \ No newline at end of file diff --git a/voices/spa/.gitkeep b/voices/spa/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/spa/default.txt b/voices/spa/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..90d50515551b611bcaa97095584502f950ff64e5 --- /dev/null +++ b/voices/spa/default.txt @@ -0,0 +1 @@ +¡Una voz incorporada con motor XTTS, listo para hablar por cualquier tipo de texto! Un gran pescado jugoso salta rápidamente; molesto, el enano golpea mi caja con cremallera \ No newline at end of file diff --git a/voices/sqi/.gitkeep b/voices/sqi/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/sqi/default.txt b/voices/sqi/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..600df7d9cf880e209d35d2b623a82910e1c153c6 --- /dev/null +++ b/voices/sqi/default.txt @@ -0,0 +1 @@ +Një zë i integruar i motorit XTTS, i gatshëm për të folur për çdo lloj teksti! Një peshk i madh me lëng kërcen shpejt; Vexed, xhuxhët më tërheq kutinë time me zinxhir \ No newline at end of file diff --git a/voices/tam/.gitkeep b/voices/tam/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/tam/default.txt b/voices/tam/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..a10adadb19afa686b166c623b1103e1a3a3a87a6 --- /dev/null +++ b/voices/tam/default.txt @@ -0,0 +1 @@ +ஒரு XTTS இன்ஜின் உள்ளமைக்கப்பட்ட குரல், எந்த விதமான உரைக்கும் பேச தயாராக உள்ளது! ஒரு பெரிய ஜூசி மீன் விரைவாக குதிக்கிறது; சுறுசுறுப்பானது, குள்ள என் சிப்பர்டு பெட்டியை துடைக்கிறது \ No newline at end of file diff --git a/voices/tel/.gitkeep b/voices/tel/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/tel/default.txt b/voices/tel/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..01eaed508e9f4e910c0b2236eba196c8830f8b29 --- /dev/null +++ b/voices/tel/default.txt @@ -0,0 +1 @@ +XTTS ఇంజిన్ అంతర్నిర్మిత వాయిస్, ఎలాంటి వచనం కోసం మాట్లాడటానికి సిద్ధంగా ఉంది! ఒక పెద్ద జ్యుసి చేపలు త్వరగా దూకుతాయి; బాధ, మరగుజ్జు నా జిప్పర్డ్ బాక్స్ను కొట్టాడు \ No newline at end of file diff --git a/voices/tur/.gitkeep b/voices/tur/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/tur/default.txt b/voices/tur/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..a9b0c74522c68f4eecf6d7154bd18710cafe829b --- /dev/null +++ b/voices/tur/default.txt @@ -0,0 +1 @@ +Her türlü metin için konuşmaya hazır bir XTTS motoru yerleşik ses! Büyük bir sulu balık hızla atlar; sıkıntılı, cüce fermuarlı kutumu vuruyor \ No newline at end of file diff --git a/voices/yor/.gitkeep b/voices/yor/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/voices/yor/default.txt b/voices/yor/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..f502a9d7bf1dee8a102c726ac311ca2acc955fe3 --- /dev/null +++ b/voices/yor/default.txt @@ -0,0 +1 @@ +Ẹrọ XTTS ti o wa ninu ohun, ṣetan lati sọrọ fun eyikeyi iru ọrọ! Ẹja igbona nla ti n bọ yarayara; vexed, awọn arara whackf pample apoti zippered mi \ No newline at end of file