diff --git a/voicevox_engine/.gitattributes b/voicevox_engine/.gitattributes deleted file mode 100644 index c0428316d9beebb0ecc6d2450b2e5df4709cf6c9..0000000000000000000000000000000000000000 --- a/voicevox_engine/.gitattributes +++ /dev/null @@ -1,5 +0,0 @@ -test/**/__snapshots__/**/*.json linguist-generated=true - -* text=auto -*.png -text -*.wav -text diff --git a/voicevox_engine/.github/CODEOWNERS b/voicevox_engine/.github/CODEOWNERS deleted file mode 100644 index bdf8e506b195f90dbf3d8f7b645576cdc4292e84..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @VOICEVOX/main-reviewer diff --git a/voicevox_engine/.github/ISSUE_TEMPLATE/bugreport.md b/voicevox_engine/.github/ISSUE_TEMPLATE/bugreport.md deleted file mode 100644 index 28337b5ae64eb44750f1912b58d47d1adbdcb359..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/ISSUE_TEMPLATE/bugreport.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -name: Bug Report -about: 不具合の報告 -labels: バグ ---- - -## 不具合の内容 - - - -### 現象・ログ - - - -### 再現手順 - - - -### 期待動作 - - - -## VOICEVOXのバージョン - -0.?.0 - - - -## OSの種類/ディストリ/バージョン - - - -- [ ] Windows -- [ ] macOS -- [ ] Linux - - - -## その他 - - diff --git a/voicevox_engine/.github/ISSUE_TEMPLATE/featurerequest.md b/voicevox_engine/.github/ISSUE_TEMPLATE/featurerequest.md deleted file mode 100644 index 78a3af90c9b5ef4dd6eb145cb18ef08a9ae37904..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/ISSUE_TEMPLATE/featurerequest.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -name: Feature Request -about: 機能要望・改善提案 -labels: 機能向上 ---- - -## 内容 - - - - -### Pros 良くなる点 - - - -### Cons 悪くなる点 - - - -### 実現方法 - - - -## VOICEVOXのバージョン - -0.?.0 - - - -## OSの種類/ディストリ/バージョン - - - -- [ ] Windows -- [ ] macOS -- [ ] Linux - - - -## その他 - - diff --git a/voicevox_engine/.github/ISSUE_TEMPLATE/question.md b/voicevox_engine/.github/ISSUE_TEMPLATE/question.md deleted file mode 100644 index 856a031e1ed10ef80b45a683c42c998dc5d341cd..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/ISSUE_TEMPLATE/question.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -name: Question -about: 質問 (既存のIssueや一般事例を良く調べてからしてください) -labels: 要議論 ---- - -## 質問の内容 - - - -## VOICEVOXのバージョン - -0.?.0 - - - -## OSの種類/ディストリ/バージョン - - - -- [ ] Windows -- [ ] macOS -- [ ] Linux - - - -## その他 - - diff --git a/voicevox_engine/.github/PULL_REQUEST_TEMPLATE.md b/voicevox_engine/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 74557f83eb10bf696c8670545723b270b743d5b4..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,24 +0,0 @@ -## 内容 - - - -## 関連 Issue - - - -## スクリーンショット・動画など - - - -## その他 diff --git a/voicevox_engine/.github/actions/prepare_python/action.yml b/voicevox_engine/.github/actions/prepare_python/action.yml deleted file mode 100644 index e76a8bba11ba46845f2f53250be48437a1459d3e..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/actions/prepare_python/action.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: "Prepare Python" -description: "Python ランタイムと依存パッケージをインストールし、Python バージョンを出力する" - -inputs: - only-export-python-version: - description: "Python バージョンの出力のみをおこなうか否か" - required: false - default: "false" - requirements-suffix: - description: "依存パッケージインストール時に `rquirements` へ付ける接尾語" - required: false - default: "" - python-version: - description: "インストールされる Python ランタイムのバージョン。デフォルト値はこのリポジトリが想定する Python バージョン。" - required: false - default: "3.11.3" -outputs: - python-version: - description: "Python version" - value: ${{ steps.export-python-version.outputs.python-version }} - -runs: - using: "composite" - steps: - - name: Set up Python - if: ${{ inputs.only-export-python-version == 'false' }} - uses: actions/setup-python@v5 - with: - python-version: ${{ inputs.python-version }} - cache: pip - - - name: Install Python dependencies - if: ${{ inputs.only-export-python-version == 'false' }} - run: pip install -r requirements${{ inputs.requirements-suffix }}.txt - shell: bash - - - name: Export Python version - id: export-python-version - run: echo "python-version=${{ inputs.python-version }}" >> $GITHUB_OUTPUT - shell: bash diff --git a/voicevox_engine/.github/workflows/build-docs.yml b/voicevox_engine/.github/workflows/build-docs.yml deleted file mode 100644 index 79ed1de52f137b5f101aa67f2e12d179e9886a93..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/workflows/build-docs.yml +++ /dev/null @@ -1,38 +0,0 @@ -# API docs HTML ファイルを生成し、`gh-pages` ブランチへの push によって GitHub Pages 上のドキュメントとして公開 - -name: upload-docs - -on: - push: - branches: - - "master" - -env: - PUBLISH_DIR: "./docs/api" - PUBLISH_BRANCH: "gh-pages" - DESTINATION_DIR: "api" - -defaults: - run: - shell: bash - -jobs: - upload-doc: - runs-on: ubuntu-20.04 - steps: - - name: Check out the repository - uses: actions/checkout@v4 - - - name: Prepare Python Runtime / Python Dependencies - uses: ./.github/actions/prepare_python - - - name: Make documents - run: PYTHONPATH=. python tools/make_docs.py - - - name: Deploy documents to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ${{ env.PUBLISH_DIR }} - publish_branch: ${{ env.PUBLISH_BRANCH }} - destination_dir: ${{ env.DESTINATION_DIR }} diff --git a/voicevox_engine/.github/workflows/build-engine-container.yml b/voicevox_engine/.github/workflows/build-engine-container.yml deleted file mode 100644 index f37d14fe5dab4a47d11f53a74bada34684bc9552..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/workflows/build-engine-container.yml +++ /dev/null @@ -1,178 +0,0 @@ -name: build-docker -on: - push: - branches: - - master - release: - types: - - created - workflow_dispatch: - inputs: - version: - description: "バージョン情報(A.BB.C / A.BB.C-preview.D)" - required: true - -env: - IMAGE_NAME: ${{ vars.DOCKERHUB_USERNAME }}/voicevox_engine - VOICEVOX_RESOURCE_VERSION: "0.19.1" - VOICEVOX_CORE_VERSION: "0.15.4" - -defaults: - run: - shell: bash - -jobs: - config: # 全 jobs で利用する定数の定義. `env` が利用できないコンテキストでも利用できる. - runs-on: ubuntu-latest - outputs: - version_or_latest: ${{ steps.vars.outputs.version_or_latest }} - steps: - - name: Declare variables - id: vars - run: | - : # releaseタグ名か、workflow_dispatchでのバージョン名か、latestが入る - echo "version_or_latest=${{ github.event.release.tag_name || github.event.inputs.version || 'latest' }}" >> "$GITHUB_OUTPUT" - - build-docker: - needs: [config] - runs-on: ${{ matrix.os }} - - strategy: - matrix: - os: [ubuntu-latest] - tag: - - "" - - cpu - - cpu-ubuntu20.04 - - nvidia - - nvidia-ubuntu20.04 - include: - # Ubuntu 20.04 - - tag: "" - target: runtime-env - base_image: ubuntu:20.04 - base_runtime_image: ubuntu:20.04 - onnxruntime_version: 1.13.1 - platforms: linux/amd64,linux/arm64/v8 - - tag: cpu - target: runtime-env - base_image: ubuntu:20.04 - base_runtime_image: ubuntu:20.04 - onnxruntime_version: 1.13.1 - platforms: linux/amd64,linux/arm64/v8 - - tag: cpu-ubuntu20.04 - target: runtime-env - base_image: ubuntu:20.04 - base_runtime_image: ubuntu:20.04 - onnxruntime_version: 1.13.1 - platforms: linux/amd64,linux/arm64/v8 - - tag: nvidia - target: runtime-nvidia-env - base_image: ubuntu:20.04 - base_runtime_image: nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04 - onnxruntime_version: 1.13.1 - platforms: linux/amd64 - - tag: nvidia-ubuntu20.04 - target: runtime-nvidia-env - base_image: ubuntu:20.04 - base_runtime_image: nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04 - onnxruntime_version: 1.13.1 - platforms: linux/amd64 - - steps: - - name: Check out the repository - uses: actions/checkout@v4 - - - name: Prepare Python version - id: prepare-python - uses: ./.github/actions/prepare_python - with: - only-export-python-version: true - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to DockerHub - uses: docker/login-action@v3 - with: - username: ${{ vars.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Prepare VOICEVOX RESOURCE cache - uses: actions/cache@v4 - id: voicevox-resource-cache - with: - key: voicevox-resource-${{ env.VOICEVOX_RESOURCE_VERSION }} - path: download/resource - - - name: Check out the VOICEVOX RESOURCE repository - if: steps.voicevox-resource-cache.outputs.cache-hit != 'true' - uses: actions/checkout@v4 - with: - repository: VOICEVOX/voicevox_resource - ref: ${{ env.VOICEVOX_RESOURCE_VERSION }} - path: download/resource - - - name: Merge VOICEVOX RESOURCE - env: - DOWNLOAD_RESOURCE_PATH: download/resource - run: bash tools/process_voicevox_resource.bash - - - name: Build and Deploy Docker image - uses: docker/build-push-action@v5 - env: - IMAGE_TAG: - |- # If it's a release, add the version, otherwise add the `latest` - ${{ ( - matrix.tag != '' && ( - format('{0}:{1}-{2}', env.IMAGE_NAME, matrix.tag, needs.config.outputs.version_or_latest) - ) || format('{0}:{1}', env.IMAGE_NAME, needs.config.outputs.version_or_latest) - ) }} - IMAGE_CACHE_FROM: - |- # Always use the `latest` buildcache. :latest-buildcache or :{tag}-latest-buildcache - ${{ ( - matrix.tag != '' && ( - format('type=registry,ref={0}:{1}-latest-buildcache', env.IMAGE_NAME, matrix.tag) - ) || format('type=registry,ref={0}:latest-buildcache', env.IMAGE_NAME) - ) }} - IMAGE_CACHE_TO: - |- # If it's a release, do not create buildcache, otherwise create the `latest` buildcache. :latest-buildcache or :{tag}-latest-buildcache - ${{ ( - needs.config.outputs.version_or_latest == 'latest' && ( - matrix.tag != '' && ( - format('type=registry,ref={0}:{1}-latest-buildcache,mode=max', env.IMAGE_NAME, matrix.tag) - ) || format('type=registry,ref={0}:latest-buildcache,mode=max', env.IMAGE_NAME) - ) || '' - ) }} - with: - context: . - builder: ${{ steps.buildx.outputs.name }} - file: ./Dockerfile - build-args: | - BASE_IMAGE=${{ matrix.base_image }} - BASE_RUNTIME_IMAGE=${{ matrix.base_runtime_image }} - PYTHON_VERSION=${{ steps.prepare-python.outputs.python-version }} - VOICEVOX_ENGINE_VERSION=${{ needs.config.outputs.version_or_latest }} - VOICEVOX_CORE_VERSION=${{ env.VOICEVOX_CORE_VERSION }} - VOICEVOX_RESOURCE_VERSION=${{ env.VOICEVOX_RESOURCE_VERSION }} - USE_GPU=${{ matrix.target == 'runtime-nvidia-env' }} - ONNXRUNTIME_VERSION=${{ matrix.onnxruntime_version }} - target: ${{ matrix.target }} - push: true - tags: ${{ env.IMAGE_TAG }} - cache-from: ${{ env.IMAGE_CACHE_FROM }} - cache-to: ${{ env.IMAGE_CACHE_TO }} - platforms: ${{ matrix.platforms }} - - run-release-test-workflow: - # version が指定されている場合のみ実行する - if: needs.config.outputs.version_or_latest != 'latest' - needs: [config, build-docker] - uses: ./.github/workflows/test-engine-container.yml - with: - version: ${{ needs.config.outputs.version_or_latest }} - repo_url: ${{ format('{0}/{1}', github.server_url, github.repository) }} # このリポジトリのURL diff --git a/voicevox_engine/.github/workflows/build-engine-package.yml b/voicevox_engine/.github/workflows/build-engine-package.yml deleted file mode 100644 index 01f1956ad6de9eb4b8ec80c7e640752c7ffd8c1b..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/workflows/build-engine-package.yml +++ /dev/null @@ -1,668 +0,0 @@ -name: build -on: - push: - branches: - - master - release: - types: - - created - workflow_dispatch: - inputs: - version: - description: "バージョン情報(A.BB.C / A.BB.C-preview.D)" - required: true - prerelease: - description: "プレリリースかどうか" - type: boolean - default: true - code_signing: - description: "コード署名する" - type: boolean - default: false - upload_artifact: - description: "デバッグ用に成果物をartifactにアップロードするか" - type: boolean - default: false - -env: - VOICEVOX_RESOURCE_VERSION: "0.19.1" - VOICEVOX_CORE_VERSION: "0.15.4" - -defaults: - run: - shell: bash - -jobs: - config: # 全 jobs で利用する定数の定義. `env` が利用できないコンテキストでも利用できる. - runs-on: ubuntu-latest - outputs: - version: ${{ steps.vars.outputs.version }} - version_or_latest: ${{ steps.vars.outputs.version_or_latest }} - steps: - - name: Declare variables - id: vars - run: | - : # release タグ名, または workflow_dispatch でのバージョン名. リリースでない (push event) 場合は空文字列 - echo "version=${{ github.event.release.tag_name || github.event.inputs.version }}" >> "$GITHUB_OUTPUT" - : # release タグ名, または workflow_dispatch でのバージョン名, または 'latest' - echo "version_or_latest=${{ github.event.release.tag_name || github.event.inputs.version || 'latest' }}" >> "$GITHUB_OUTPUT" - - build-and-upload: - needs: [config] - environment: ${{ github.event.inputs.code_signing == 'true' && 'code_signing' || '' }} # コード署名用のenvironment - strategy: - matrix: - include: - # Windows CPU - - os: windows-2019 - architecture: "x64" - voicevox_core_asset_prefix: voicevox_core-windows-x64-cpu - onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.13.1/onnxruntime-win-x64-1.13.1.zip - target: windows-cpu - # Windows DirectML - - os: windows-2019 - architecture: "x64" - voicevox_core_asset_prefix: voicevox_core-windows-x64-directml - onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.13.1/Microsoft.ML.OnnxRuntime.DirectML.1.13.1.zip - directml_url: https://www.nuget.org/api/v2/package/Microsoft.AI.DirectML/1.10.0 - target: windows-directml - # Windows NVIDIA GPU - - os: windows-2019 - architecture: "x64" - voicevox_core_asset_prefix: voicevox_core-windows-x64-cuda - onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.13.1/onnxruntime-win-x64-gpu-1.13.1.zip - cuda_version: "11.8.0" - cudnn_url: https://developer.download.nvidia.com/compute/cudnn/redist/cudnn/windows-x86_64/cudnn-windows-x86_64-8.9.2.26_cuda11-archive.zip - zlib_url: http://www.winimage.com/zLibDll/zlib123dllx64.zip - target: windows-nvidia - # Mac CPU (x64 arch) - - os: macos-12 - architecture: "x64" - voicevox_core_asset_prefix: voicevox_core-osx-x64-cpu - onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.13.1/onnxruntime-osx-x86_64-1.13.1.tgz - target: macos-x64 - # Mac CPU (arm64 arch) - - os: macos-14 - architecture: "arm64" - voicevox_core_asset_prefix: voicevox_core-osx-arm64-cpu - onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.13.1/onnxruntime-osx-arm64-1.13.1.tgz - target: macos-arm64 - # Linux CPU - - os: ubuntu-20.04 - architecture: "x64" - voicevox_core_asset_prefix: voicevox_core-linux-x64-cpu - onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.13.1/onnxruntime-linux-x64-1.13.1.tgz - target: linux-cpu - # Linux NVIDIA GPU - - os: ubuntu-20.04 - architecture: "x64" - voicevox_core_asset_prefix: voicevox_core-linux-x64-gpu - onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.13.1/onnxruntime-linux-x64-gpu-1.13.1.tgz - cuda_version: "11.8.0" - cudnn_url: https://developer.download.nvidia.com/compute/cudnn/redist/cudnn/linux-x86_64/cudnn-linux-x86_64-8.9.2.26_cuda11-archive.tar.xz - target: linux-nvidia - - runs-on: ${{ matrix.os }} - - env: - # GNUコマンド - sed: ${{ startsWith(matrix.os, 'macos-') && 'gsed' || 'sed' }} - split: ${{ startsWith(matrix.os, 'macos-') && 'gsplit' || 'split' }} - - steps: - - name: Declare variables - id: vars - run: echo "package_name=voicevox_engine-${{ matrix.target }}-${{ needs.config.outputs.version }}" >> "$GITHUB_OUTPUT" - - - name: Check out the repository - uses: actions/checkout@v4 - - # NOTE: The default 'sed' and 'split' of macOS is BSD 'sed' and 'split'. - # There is a difference in specification between BSD 'sed' and 'split' and GNU 'sed' and 'split', - # so you need to install GNU 'sed' and 'split'. - - name: Install dependencies (macOS) - if: startsWith(matrix.os, 'macos-') - run: brew install gnu-sed coreutils - - # ONNX Runtime providersとCUDA周りをリンクするために使う - - name: Install ONNX Runtime dependencies (Linux) - if: startsWith(matrix.os, 'ubuntu-') && endsWith(matrix.target, 'nvidia') - run: | - sudo apt-get update - sudo apt-get install -y patchelf - - # CUDA - - name: Restore cached CUDA - if: matrix.cuda_version != '' - uses: actions/cache/restore@v4 - id: cuda-dll-cache-restore - with: - # update this key when ONNX Runtime CUDA dependency changed - key: ${{ matrix.os }}-cuda-dll-${{ matrix.cuda_version }}-v1 - path: download/cuda - - - name: Set up CUDA toolkit - if: matrix.cuda_version != '' && steps.cuda-dll-cache-restore.outputs.cache-hit != 'true' - uses: Jimver/cuda-toolkit@v0.2.15 - id: cuda-toolkit - with: - method: network - cuda: ${{ matrix.cuda_version }} - - - name: Extract CUDA Dynamic Libraries - if: matrix.cuda_version != '' && steps.cuda-dll-cache-restore.outputs.cache-hit != 'true' - run: | - set -eux - - # CUDA Toolkit へのパスを OS 非依存へ整形する - # NOTE: ダブルクォートでバックスラッシュを囲むと tr が可搬性関連の warning を出す - # shellcheck disable=SC1003 - CUDA_ROOT=$( echo "${{ steps.cuda-toolkit.outputs.CUDA_PATH }}" | tr '\\' '/' ) - - mkdir -p download/cuda/bin - # NOTE 1: actionlint による GitHub Actions 文法の暗示的 `________________` 置換が SchellCheck の `never be equal` エラーを起こさないように、変数代入する - # 一度代入して actionlint のエラー回避 (詳細: NOTE 1) - OS=${{ matrix.os }} - if [[ $OS == windows-* ]]; then - mv "${CUDA_ROOT}/bin/"*.dll download/cuda/bin/ - - # remove CUDA to reduce disk usage - rm -rf "${CUDA_ROOT}" - else - cp "${CUDA_ROOT}/lib64/"libcublas.so.* download/cuda/bin/ - cp "${CUDA_ROOT}/lib64/"libcublasLt.so.* download/cuda/bin/ - cp "${CUDA_ROOT}/lib64/"libcudart.so.* download/cuda/bin/ - cp "${CUDA_ROOT}/lib64/"libcufft.so.* download/cuda/bin/ - cp "${CUDA_ROOT}/lib64/"libcurand.so.* download/cuda/bin/ - - # remove unneed full version libraries - rm -f download/cuda/bin/libcublas.so.*.* - rm -f download/cuda/bin/libcublasLt.so.*.* - rm -f download/cuda/bin/libcufft.so.*.* - rm -f download/cuda/bin/libcurand.so.*.* - rm -f download/cuda/bin/libcudart.so.*.*.* - - # remove CUDA to reduce disk usage - sudo rm -rf "${CUDA_ROOT}" - fi - - - name: Save CUDA cache - if: matrix.cuda_version != '' - uses: actions/cache/save@v4 - with: - key: ${{ steps.cuda-dll-cache-restore.outputs.cache-primary-key }} - path: download/cuda - - # cuDNN - - name: Export cuDNN url to calc hash - if: matrix.cudnn_url != '' - run: echo "${{ matrix.cudnn_url }}" > download/cudnn_url.txt - - - name: Restore cached cuDNN - if: matrix.cudnn_url != '' - uses: actions/cache/restore@v4 - id: cudnn-dll-cache-restore - with: - # update this key when ONNX Runtime cuDNN dependency changed - key: ${{ matrix.os }}-cudnn-dll-${{ hashFiles('download/cudnn_url.txt') }}-v1 - path: download/cudnn - - - name: Download and extract cuDNN Dynamic Libraries - if: matrix.cudnn_url != '' && steps.cudnn-dll-cache-restore.outputs.cache-hit != 'true' - run: | - set -eux - - # 一度代入して actionlint のエラー回避 (詳細: NOTE 1) - OS=${{ matrix.os }} - if [[ $OS == windows-* ]]; then - curl -L "${{ matrix.cudnn_url }}" > download/cudnn.zip - - unzip download/cudnn.zip cudnn-*/bin/*.dll -d download/cudnn_tmp - - mkdir -p download/cudnn/bin - mv download/cudnn_tmp/cudnn-*/bin/*.dll download/cudnn/bin/ - rm -rf download/cudnn_tmp - - rm download/cudnn.zip - else - curl -L "${{ matrix.cudnn_url }}" > download/cudnn.tar.xz - - tar -Jxf download/cudnn.tar.xz -C download/ - - mkdir -p download/cudnn/bin - cp download/cudnn-*/lib/libcudnn.so.* download/cudnn/bin/ - cp download/cudnn-*/lib/libcudnn_*_infer.so.* download/cudnn/bin/ - - # remove unneed full version libraries - rm -f download/cudnn/bin/libcudnn.so.*.* - rm -f download/cudnn/bin/libcudnn_*_infer.so.*.* - - rm download/cudnn.tar.xz - fi - - - name: Save cuDNN cache - if: matrix.cudnn_url != '' - uses: actions/cache/save@v4 - with: - key: ${{ steps.cudnn-dll-cache-restore.outputs.cache-primary-key }} - path: download/cudnn - - # zlib - - name: Export zlib url to calc hash - if: matrix.zlib_url != '' - run: echo "${{ matrix.zlib_url }}" >> download/zlib_url.txt - - - name: Restore cached zlib - if: matrix.zlib_url != '' - uses: actions/cache/restore@v4 - id: zlib-cache-restore - with: - key: zlib-cache-v1-${{ hashFiles('download/zlib_url.txt') }} - path: download/zlib - - - name: Download zlib dynamic Library - if: steps.zlib-cache-restore.outputs.cache-hit != 'true' && matrix.zlib_url != '' - run: | - curl -L "${{ matrix.zlib_url }}" -o download/zlib.zip - mkdir -p download/zlib - - # extract only dlls - unzip download/zlib.zip dll_${{ matrix.architecture }}/zlibwapi.dll -d download/zlib - rm download/zlib.zip - mv download/zlib/dll_${{ matrix.architecture }}/zlibwapi.dll download/zlib/zlibwapi.dll - rm -r download/zlib/dll_${{ matrix.architecture }} - - - name: Save zlib cache - if: matrix.zlib_url != '' - uses: actions/cache/save@v4 - with: - key: ${{ steps.zlib-cache-restore.outputs.cache-primary-key }} - path: download/zlib - - - name: Set up MSVC - if: startsWith(matrix.os, 'windows-') - uses: ilammy/msvc-dev-cmd@v1 - - - name: Prepare Python Runtime / Python Dependencies - uses: ./.github/actions/prepare_python - with: - requirements-suffix: "-build" - - - name: Prepare custom PyInstaller - if: startsWith(matrix.os, 'windows-') - run: ./tools/modify_pyinstaller.bash - - - name: Download pyopenjtalk dictionary - run: | - # try 5 times, sleep 5 seconds before retry - for _ in $(seq 5); do - EXIT_CODE=0 - python3 -c "import pyopenjtalk; pyopenjtalk._lazy_init()" || EXIT_CODE=$? - - if [ "$EXIT_CODE" = "0" ]; then - break - fi - - sleep 5 - done - - if [ "$EXIT_CODE" != "0" ]; then - exit "$EXIT_CODE" - fi - - - name: Create download directory - run: mkdir -p download/ - - # DirectML - - name: Export DirectML url to calc hash - if: endswith(matrix.target, '-directml') - run: echo "${{ matrix.directml_url }}" >> download/directml_url.txt - - - name: Restore cached DirectML - if: endswith(matrix.target, '-directml') - uses: actions/cache/restore@v4 - id: directml-cache-restore - with: - key: directml-cache-v1-${{ hashFiles('download/directml_url.txt') }} - path: download/directml - - - name: Set up DirectML dynamic Library - if: steps.directml-cache-restore.outputs.cache-hit != 'true' && endswith(matrix.target, '-directml') - run: | - curl -L "${{ matrix.directml_url }}" -o download/directml.zip - mkdir -p download/directml - - # extract only dlls - unzip download/directml.zip bin/${{ matrix.architecture }}-win/DirectML.dll -d download/directml - rm download/directml.zip - mv download/directml/bin/${{ matrix.architecture }}-win/DirectML.dll download/directml/DirectML.dll - rm -r download/directml/bin - - - name: Save DirectML cache - if: endswith(matrix.target, '-directml') - uses: actions/cache/save@v4 - with: - key: ${{ steps.directml-cache-restore.outputs.cache-primary-key }} - path: download/directml - - # ONNX Runtime - - name: Export ONNX Runtime url to calc hash - run: echo "${{ matrix.onnxruntime_url }}" > download/onnxruntime_url.txt - - - name: Restore cached ONNX Runtime - uses: actions/cache/restore@v4 - id: onnxruntime-cache-restore - with: - key: ${{ matrix.os }}-onnxruntime-${{ hashFiles('download/onnxruntime_url.txt') }}-v1 - path: download/onnxruntime - - - name: Download ONNX Runtime (Windows) - if: steps.onnxruntime-cache-restore.outputs.cache-hit != 'true' && startsWith(matrix.os, 'windows-') - run: | - curl -L "${{ matrix.onnxruntime_url }}" > download/onnxruntime.zip - - # extract only dlls - # 一度代入して actionlint のエラー回避 (詳細: NOTE 1) - TARGET=${{ matrix.target }} - if [[ $TARGET != *-directml ]]; then - unzip download/onnxruntime.zip onnxruntime-*/lib/*.dll -d download/ - mv download/onnxruntime-* download/onnxruntime - else - mkdir -p download/onnxruntime/lib - unzip download/onnxruntime.zip runtimes/win-${{ matrix.architecture }}/native/*.dll -d download/onnxruntime - mv download/onnxruntime/runtimes/win-${{ matrix.architecture }}/native/*.dll download/onnxruntime/lib/ - rm -r download/onnxruntime/runtimes - fi - - rm download/onnxruntime.zip - - - name: Download ONNX Runtime (Mac/Linux) - if: steps.onnxruntime-cache-restore.outputs.cache-hit != 'true' && startsWith(matrix.os, 'windows-') != true - run: | - curl -L "${{ matrix.onnxruntime_url }}" > download/onnxruntime.tgz - mkdir -p download/onnxruntime - tar xf "download/onnxruntime.tgz" -C "download/onnxruntime" --strip-components 1 - rm download/onnxruntime.tgz - - - name: Save ONNX Runtime cache - uses: actions/cache/save@v4 - with: - key: ${{ steps.onnxruntime-cache-restore.outputs.cache-primary-key }} - path: download/onnxruntime - - # VOICEVOX RESOURCE - - name: Prepare RESOURCE cache - uses: actions/cache@v4 - id: voicevox-resource-cache - with: - key: voicevox-resource-${{ env.VOICEVOX_RESOURCE_VERSION }} - path: download/resource - - - name: Check out RESOURCE repository - if: steps.voicevox-resource-cache.outputs.cache-hit != 'true' - uses: actions/checkout@v4 - with: - repository: VOICEVOX/voicevox_resource - ref: ${{ env.VOICEVOX_RESOURCE_VERSION }} - path: download/resource - - - name: Merge RESOURCE - env: - DOWNLOAD_RESOURCE_PATH: download/resource - run: bash tools/process_voicevox_resource.bash - - # VOICEVOX CORE - - name: Prepare CORE cache - uses: actions/cache@v4 - id: voicevox-core-cache - with: - key: ${{ matrix.os }}-voicevox-core-${{ matrix.voicevox_core_asset_prefix }}-${{ env.VOICEVOX_CORE_VERSION }} - path: download/core - - - name: Download CORE - if: steps.voicevox-core-cache.outputs.cache-hit != 'true' - env: - VOICEVOX_CORE_ASSET_NAME: ${{ matrix.voicevox_core_asset_prefix }}-${{ env.VOICEVOX_CORE_VERSION }} - run: | - curl -L "https://github.com/VOICEVOX/voicevox_core/releases/download/${{ env.VOICEVOX_CORE_VERSION }}/${{ env.VOICEVOX_CORE_ASSET_NAME }}.zip" > download/${{ env.VOICEVOX_CORE_ASSET_NAME }}.zip - # 一度代入して actionlint のエラー回避 (詳細: NOTE 1) - OS=${{ matrix.os }} - if [[ $OS == mac-* ]]; then - ditto -x -k --sequesterRsrc --rsrc download/${{ env.VOICEVOX_CORE_ASSET_NAME }}.zip download/ - else - unzip download/${{ env.VOICEVOX_CORE_ASSET_NAME }}.zip -d download/ - fi - mkdir -p download/core - mv download/${{ env.VOICEVOX_CORE_ASSET_NAME }}/* download/core - rm -rf download/${{ env.VOICEVOX_CORE_ASSET_NAME }} - rm download/${{ env.VOICEVOX_CORE_ASSET_NAME }}.zip - - # Build - - name: Generate licenses.json - run: | - OUTPUT_LICENSE_JSON_PATH=resources/engine_manifest_assets/dependency_licenses.json \ - bash tools/create_venv_and_generate_licenses.bash - # FIXME: VOICEVOX (editor) cannot build without licenses.json - cp resources/engine_manifest_assets/dependency_licenses.json licenses.json - - - name: Generate filemap.json - run: python tools/generate_filemap.py --target_dir resources/character_info - - - name: Build VOICEVOX ENGINE run.py - run: | - set -eux - - jq '.version = "${{ needs.config.outputs.version_or_latest }}"' engine_manifest.json > engine_manifest.json.tmp - mv -f engine_manifest.json.tmp engine_manifest.json - - # Replace version & specify dynamic libraries - $sed -i "s/__version__ = \"latest\"/__version__ = \"${{ needs.config.outputs.version_or_latest }}\"/" voicevox_engine/__init__.py - # 一度代入して actionlint のエラー回避 (詳細: NOTE 1) - OS=${{ matrix.os }} - if [[ $OS == windows-* ]]; then - LIBCORE_PATH=download/core/voicevox_core.dll - LIBONNXRUNTIME_PATH=download/onnxruntime/lib/onnxruntime.dll - elif [[ $OS == macos-* ]]; then - LIBCORE_PATH=download/core/libvoicevox_core.dylib - LIBONNXRUNTIME_PATH=download/onnxruntime/lib/libonnxruntime.dylib - else - LIBCORE_PATH=download/core/libvoicevox_core.so - LIBONNXRUNTIME_PATH=download/onnxruntime/lib/libonnxruntime.so - fi - - CORE_MODEL_DIR_PATH="download/core/model" \ - LIBCORE_PATH="$LIBCORE_PATH" \ - LIBONNXRUNTIME_PATH="$LIBONNXRUNTIME_PATH" \ - pyinstaller --noconfirm run.spec - - # Because PyInstaller does not copy dynamic loaded libraries, - # manually move DLL dependencies into `dist/run/` (cache already saved) - - - name: Gather DLL dependencies (Windows) - if: startsWith(matrix.os, 'windows-') - run: | - set -eux - - # Windows CUDA - if [ -f "download/onnxruntime/lib/onnxruntime_providers_cuda.dll" ]; then - - # ONNX Runtime providers - mv download/onnxruntime/lib/onnxruntime_*.dll dist/run/ - - # CUDA - mv download/cuda/bin/cublas64_*.dll dist/run/ - mv download/cuda/bin/cublasLt64_*.dll dist/run/ - mv download/cuda/bin/cudart64_*.dll dist/run/ - mv download/cuda/bin/cufft64_*.dll dist/run/ - mv download/cuda/bin/curand64_*.dll dist/run/ - - # cuDNN - mv download/cudnn/bin/cudnn64_*.dll dist/run/ - mv download/cudnn/bin/cudnn_*_infer64*.dll dist/run/ - - # zlib - mv download/zlib/zlibwapi.dll dist/run/ - - # Clean source directories to reduce disk usage (already cached) - rm -rf download/onnxruntime - rm -rf download/cuda - rm -rf download/cudnn - rm -rf download/zlib - fi - - # Windows DirectML - # 一度代入して actionlint のエラー回避 (詳細: NOTE 1) - TARGET=${{ matrix.target }} - if [[ $TARGET == *-directml ]]; then - # DirectML - mv download/directml/DirectML.dll dist/run/ - - # Clean source directories (already cached) - rm -rf download/directml - fi - - - name: Gather DLL dependencies (Linux CUDA) - if: startsWith(matrix.os, 'ubuntu-') && endsWith(matrix.target, 'nvidia') - run: | - set -eux - - # ONNX Runtime providers - # NOTE: `$ORIGIN` は RPATH の特殊トークンであるため、bash 変数扱いされないために適切なエスケープが必要。 - # shellcheck disable=SC2016 - patchelf --set-rpath '$ORIGIN' "$(pwd)/download/onnxruntime/lib"/libonnxruntime_providers_*.so - mv download/onnxruntime/lib/libonnxruntime_*.so dist/run/ - - # CUDA - mv download/cuda/bin/libcublas.so.* dist/run/ - mv download/cuda/bin/libcublasLt.so.* dist/run/ - mv download/cuda/bin/libcudart.so.* dist/run/ - mv download/cuda/bin/libcufft.so.* dist/run/ - mv download/cuda/bin/libcurand.so.* dist/run/ - - # cuDNN - mv download/cudnn/bin/libcudnn.so.* dist/run/ - mv download/cudnn/bin/libcudnn_*_infer.so.* dist/run/ - - # Clean source directories to reduce disk usage (already cached) - rm -rf download/onnxruntime - rm -rf download/cuda - rm -rf download/cudnn - - - name: Code signing - if: github.event.inputs.code_signing == 'true' && startsWith(matrix.os, 'windows-') - run: bash tools/codesign.bash "dist/run/run.exe" - env: - ESIGNERCKA_USERNAME: ${{ secrets.ESIGNERCKA_USERNAME }} - ESIGNERCKA_PASSWORD: ${{ secrets.ESIGNERCKA_PASSWORD }} - ESIGNERCKA_TOTP_SECRET: ${{ secrets.ESIGNERCKA_TOTP_SECRET }} - - - name: Rename artifact directory to archive - run: mv dist/run/ "${{ matrix.target }}/" - - # 7z archives - - name: Create 7z archives - run: | - # Compress to artifact.7z.001, artifact.7z.002, ... - 7z -r -v1900m a "${{ steps.vars.outputs.package_name }}.7z" "${{ matrix.target }}/" - - # Output splitted archive list - ls ${{ steps.vars.outputs.package_name }}.7z.* > archives_7z.txt - mv archives_7z.txt "${{ steps.vars.outputs.package_name }}.7z.txt" - - - name: Upload 7z archives to artifact - if: github.event.inputs.upload_artifact == 'true' - uses: actions/upload-artifact@v4 - with: - name: ${{ steps.vars.outputs.package_name }}-7z - path: | - ${{ steps.vars.outputs.package_name }}.7z.* - - - name: Upload 7z archives to Release assets - if: needs.config.outputs.version != '' - uses: ncipollo/release-action@v1 - with: - allowUpdates: true - prerelease: ${{ github.event.inputs.prerelease }} - token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ needs.config.outputs.version }} - artifacts: > - ${{ steps.vars.outputs.package_name }}.7z.* - commit: ${{ github.sha }} - - - name: Clean 7z archives to reduce disk usage - run: rm -f ${{ steps.vars.outputs.package_name }}.7z.* - - # VVPP archives - - name: Create VVPP archives - run: | - # Compress to compressed.zip.001, compressed.zip.002, ... - # NOTE: 1000th archive will be "compressed.zip.1000" after "compressed.zip.999". This is unconsidered as an extreme case. - (cd "${{ matrix.target }}" && 7z -r -v1900M a "../compressed.zip") - - # Rename to artifact.001.vvppp, artifact.002.vvppp, ... - for FILE in compressed.zip.*; do - NUMBER=${FILE##*.} # 001 - mv "${FILE}" "${{ steps.vars.outputs.package_name }}.${NUMBER}.vvppp" - done - - # Rename to artifact.vvpp if there are only artifact.001.vvppp - if [ "$(find ${{ steps.vars.outputs.package_name }}.*.vvppp -maxdepth 1 | wc -l)" == 1 ]; then - mv ${{ steps.vars.outputs.package_name }}.001.vvppp ${{ steps.vars.outputs.package_name }}.vvpp - fi - - # Output splitted archive list - ls ${{ steps.vars.outputs.package_name }}*.vvppp ${{ steps.vars.outputs.package_name }}.vvpp > archives_vvpp.txt || true - mv archives_vvpp.txt "${{ steps.vars.outputs.package_name }}.vvpp.txt" - - - name: Upload VVPP archives to artifact - if: github.event.inputs.upload_artifact == 'true' - uses: actions/upload-artifact@v4 - with: - name: ${{ steps.vars.outputs.package_name }}-vvpp - path: | - ${{ steps.vars.outputs.package_name }}.vvpp - ${{ steps.vars.outputs.package_name }}*.vvppp - ${{ steps.vars.outputs.package_name }}.vvpp.txt - - - name: Upload VVPP archives to Release assets - if: needs.config.outputs.version != '' - uses: ncipollo/release-action@v1 - with: - allowUpdates: true - prerelease: ${{ github.event.inputs.prerelease }} - token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ needs.config.outputs.version }} - artifacts: > - ${{ steps.vars.outputs.package_name }}.vvpp, - ${{ steps.vars.outputs.package_name }}*.vvppp, - ${{ steps.vars.outputs.package_name }}.vvpp.txt - commit: ${{ github.sha }} - - - name: Merge artifacts - if: github.event.inputs.upload_artifact == 'true' - uses: actions/upload-artifact/merge@v4 - with: - name: ${{ steps.vars.outputs.package_name }} - pattern: ${{ steps.vars.outputs.package_name }}-* - delete-merged: true - - update-tag-to-current-commit: - if: needs.config.outputs.version != '' - needs: [config, build-and-upload] - runs-on: ubuntu-latest - steps: - - name: Check out the repository - uses: actions/checkout@v4 - - - name: Change tag to this commit for refreshing the release # c.f. voicevox_engine#854 - run: | - git tag -f ${{ needs.config.outputs.version }} - git push -f --tag - - run-release-test-workflow: - if: needs.config.outputs.version != '' - needs: [config, build-and-upload] - uses: ./.github/workflows/test-engine-package.yml - with: - version: ${{ needs.config.outputs.version }} - repo_url: ${{ format('{0}/{1}', github.server_url, github.repository) }} # このリポジトリのURL diff --git a/voicevox_engine/.github/workflows/build-latest-dev.yml b/voicevox_engine/.github/workflows/build-latest-dev.yml deleted file mode 100644 index 4f2afb6e57711125a7bd7775eea2dcfdc7097e33..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/workflows/build-latest-dev.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Release latest dev build - -# masterブランチが更新されるたびに開発版をビルドしてデプロイする。 -# バージョン(タグ)は最新リリースのバージョンを`X.Y.Z`としたときの`X.Y+1.0-dev`。 - -on: - push: - branches: - - master - paths-ignore: - - "docs/**" - - "test/**" - -jobs: - latest-dev-build: - runs-on: ubuntu-latest - if: github.repository_owner == 'VOICEVOX' - steps: - - name: Trigger workflow_dispatch - uses: actions/github-script@v7 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const latest_release = await github.rest.repos.getLatestRelease({ - owner: context.repo.owner, - repo: context.repo.repo - }); - const split_version = latest_release.data.tag_name.split('.'); - const dev_version = `${split_version[0]}.${parseInt(split_version[1]) + 1}.0-dev`; - github.rest.actions.createWorkflowDispatch({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'build-engine-package.yml', - ref: 'master', - inputs: { - version: dev_version, - prerelease: true - } - }) - github.rest.actions.createWorkflowDispatch({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'build-engine-container.yml', - ref: 'master', - inputs: { - version: dev_version - } - }) - console.log(`Triggered workflow_dispatch for ${dev_version}`); diff --git a/voicevox_engine/.github/workflows/test-engine-container.yml b/voicevox_engine/.github/workflows/test-engine-container.yml deleted file mode 100644 index 91163221ad7d6dad72f47104dca61cfe562e005a..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/workflows/test-engine-container.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: Test Docker Release Build - -on: - workflow_call: - inputs: - version: - type: string - required: true - repo_url: - type: string - required: false - workflow_dispatch: - inputs: - version: - type: string - description: "テストしたいタグ名" - required: true - -env: - IMAGE_NAME: ${{ vars.DOCKERHUB_USERNAME }}/voicevox_engine - VERSION: |- # version指定時はversionを、それ以外はタグ名を使用 - ${{ (github.event.inputs || inputs).version }} - -defaults: - run: - shell: bash - -jobs: - test: - runs-on: [ ubuntu-20.04 ] - strategy: - fail-fast: false - matrix: - tag: - - "" - - cpu - - cpu-ubuntu20.04 - - steps: - - name: Check out the repository - uses: actions/checkout@v4 - - - name: Prepare Python Runtime / Python Dependencies - uses: ./.github/actions/prepare_python - with: - requirements-suffix: "-dev" - - - name: Declare variables - id: docker_vars - run: | - if [ "${{ matrix.tag }}" != "" ]; then - echo "image_tag=${{ env.IMAGE_NAME }}:${{ matrix.tag }}-${{ env.VERSION }}" >> "$GITHUB_OUTPUT" - else - echo "image_tag=${{ env.IMAGE_NAME }}:${{ env.VERSION }}" >> "$GITHUB_OUTPUT" - fi - - - name: Pull ENGINE application docker image - run: docker pull "${{ steps.docker_vars.outputs.image_tag }}" - - - name: Run ENGINE application docker container - run: docker run -d -p 50021:50021 "${{ steps.docker_vars.outputs.image_tag }}" - - # Docker コンテナが起動してから、レスポンスが返ってくるまで待機する - # リトライは10回まで `/version` にアクセスしてレスポンスのステータスコードをチェック - # - ステータスコードが `200` の場合は正常終了します - # - ステータスコードが `200` 以外の場合は、5秒間スリープしてリトライします - - name: Warm up ENGINE server by waiting - run: | - set +e # curlのエラーを無視する - - url="http://127.0.0.1:50021/version" - max_attempts=10 - sleep_interval=5 - - for i in $(seq 1 "$max_attempts"); do - status=$(curl -o /dev/null -s -w '%{http_code}\n' "$url") - if [ "$status" -eq 200 ]; then - echo "Container is ready! Response status code: ${status}" - exit 0 - else - echo "Attempt ${i}/${max_attempts}: Response status code $status" - sleep "${sleep_interval}" - fi - done - exit 1 - - - name: Test ENGINE application docker container - run: python tools/check_release_build.py --skip_run_process --dist_dir dist/ diff --git a/voicevox_engine/.github/workflows/test-engine-package.yml b/voicevox_engine/.github/workflows/test-engine-package.yml deleted file mode 100644 index 3e9dc1a18166401fba413b53fb574f422c50d1cd..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/workflows/test-engine-package.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: Test Release Build - -on: - workflow_call: - inputs: - version: - type: string - required: true - repo_url: - type: string - required: false - workflow_dispatch: - inputs: - version: - type: string - description: "テストしたいタグ名" - required: true - repo_url: - type: string - description: "リポジトリのURL(省略可能)" - required: false - -env: - REPO_URL: - |- # repo_url指定時はrepo_urlを、それ以外はgithubのリポジトリURLを使用 - ${{ (github.event.inputs || inputs).repo_url || format('{0}/{1}', github.server_url, github.repository) }} - VERSION: |- # version指定時はversionを、それ以外はタグ名を使用 - ${{ (github.event.inputs || inputs).version }} - -defaults: - run: - shell: bash - -jobs: - test: - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-20.04 - target: linux-cpu - - os: ubuntu-20.04 - target: linux-nvidia - - os: macos-12 - target: macos-x64 - - os: macos-14 - target: macos-arm64 - - os: windows-2019 - target: windows-cpu - - os: windows-2019 - target: windows-nvidia - - os: windows-2019 - target: windows-directml - - runs-on: ${{ matrix.os }} - - steps: - - name: Declare variables - id: vars - run: | - echo "release_url=${{ env.REPO_URL }}/releases/download/${{ env.VERSION }}" >> "$GITHUB_OUTPUT" - echo "package_name=voicevox_engine-${{ matrix.target }}-${{ env.VERSION }}" >> "$GITHUB_OUTPUT" - - - name: Check out the repository - uses: actions/checkout@v4 - - - name: Prepare Python Runtime / Python Dependencies - uses: ./.github/actions/prepare_python - with: - requirements-suffix: "-dev" - - - name: Download ENGINE package - run: | - mkdir -p download - curl -L -o "download/list.txt" "${{ steps.vars.outputs.release_url }}/${{ steps.vars.outputs.package_name }}.7z.txt" - Set up permission - if: startsWith(matrix.target, 'linux') || startsWith(matrix.target, 'macos') - run: chmod +x dist/run - - - name: Test ENGINE package - run: python tools/check_release_build.py --dist_dir dist/ diff --git a/voicevox_engine/.github/workflows/test-issue-freshness.yml b/voicevox_engine/.github/workflows/test-issue-freshness.yml deleted file mode 100644 index 206c0ee160fed31fdb280130f9e3f4719d936c06..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/workflows/test-issue-freshness.yml +++ /dev/null @@ -1,37 +0,0 @@ -# Github Issue が停滞状態になっていないか確認する - -name: "Test issue freshness" -on: - schedule: - - cron: "0 3 * * *" - workflow_dispatch: - inputs: - dryrun: - type: boolean - required: true - description: "ドライランする" -jobs: - stale: - runs-on: ubuntu-latest - steps: - - name: Notify inactive 必要性議論 issues - uses: actions/stale@v9 - with: - # on.schedule で起動した場合は `inputs.dryrun == null` であるため `debug-only: false` となる - debug-only: ${{ inputs.dryrun == 'true' }} - any-of-labels: "状態:必要性議論" - days-before-stale: 30 - days-before-close: -1 - stale-issue-message: "本 Issue は直近 30 日間で活動がありません。今後の方針について VOICEVOX チームによる再検討がおこなわれる予定です。" - stale-issue-label: "非アクティブ" - - - name: Notify inactive 設計/実装者募集/実装 issues - uses: actions/stale@v9 - with: - # on.schedule で起動した場合は `inputs.dryrun == null` であるため `debug-only: false` となる - debug-only: ${{ inputs.dryrun == 'true' }} - any-of-labels: "状態:設計,状態:実装者募集,状態:実装" - days-before-stale: 180 - days-before-close: -1 - stale-issue-message: "本 Issue は直近 180 日間で活動がありません。今後の方針について VOICEVOX チームによる再検討がおこなわれる予定です。" - stale-issue-label: "非アクティブ" diff --git a/voicevox_engine/.github/workflows/test-security.yml b/voicevox_engine/.github/workflows/test-security.yml deleted file mode 100644 index 93e14121a6091436dba81d95c54b89f6c1e2bcd2..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/workflows/test-security.yml +++ /dev/null @@ -1,39 +0,0 @@ -# Python 依存パッケージの脆弱性診断を定期的に行う -# NOTE: 公式 Action は API key 等を必要とするため利用しない(https://github.com/pyupio/safety-action/tree/main) - -name: test-security - -on: - schedule: - - cron: "00 04 15 * *" # 毎月15日 13:00 JST - -defaults: - run: - shell: bash - -jobs: - test-security: - runs-on: ubuntu-20.04 - steps: - - name: Check out the repository - uses: actions/checkout@v4 - - - name: Prepare Python Runtime / Python Dependencies - uses: ./.github/actions/prepare_python - with: - requirements-suffix: "-dev" - - - name: Check Python dependency security - run: safety check -r requirements.txt -r requirements-dev.txt -r requirements-build.txt -o bare - - - name: Notify Discord of security testing result - uses: sarisia/actions-status-discord@v1 - if: always() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK_URL }} - username: GitHub Actions - title: "依存パッケージ脆弱性診断の結果" - status: ${{ job.status }} - color: ${{ job.status == 'success' && '0x00FF00' || '0xFF0000' }} - url: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" - diff --git a/voicevox_engine/.github/workflows/test.yml b/voicevox_engine/.github/workflows/test.yml deleted file mode 100644 index 7df025809f02b443ca591add7d7560c36a29f4a2..0000000000000000000000000000000000000000 --- a/voicevox_engine/.github/workflows/test.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: test - -on: - push: - pull_request: - workflow_dispatch: - -defaults: - run: - shell: bash - -jobs: - test: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-20.04, macos-latest, windows-latest] - - steps: - - name: Check out the repository - uses: actions/checkout@v4 - - - name: Prepare Python Runtime / Python Dependencies - uses: ./.github/actions/prepare_python - with: - requirements-suffix: "-dev" - - - name: Validate poetry.lock - run: | - poetry lock --no-update - git diff --exit-code - - - name: Check dependency lists - run: | - poetry export --without-hashes -o requirements.txt.check - poetry export --without-hashes --with dev -o requirements-dev.txt.check - poetry export --without-hashes --with build -o requirements-build.txt.check - - diff -q requirements.txt requirements.txt.check || \ - diff -q requirements-dev.txt requirements-dev.txt.check || \ - diff -q requirements-build.txt requirements-build.txt.check > /dev/null - if [ $? = 1 ]; then - echo "poetry export has some diff" - exit 1 - fi - - - name: Check format - run: pysen run lint - - - name: Test codes and coverage - run: coverage run --omit=test/* -m pytest - - - name: Submit coverage results to Coveralls - if: matrix.os == 'ubuntu-20.04' - run: coveralls --service=github - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Check licenses - run: OUTPUT_LICENSE_JSON_PATH=/dev/null bash tools/create_venv_and_generate_licenses.bash - - - name: Test names by checking typo - if: matrix.os == 'ubuntu-20.04' - uses: crate-ci/typos@v1.21.0 - - lint-builders: - runs-on: ubuntu-20.04 - steps: - - name: Check out the repository - uses: actions/checkout@v4 - - - name: Install ShellCheck - run: | - sudo apt-get update - sudo apt-get install -y shellcheck - - - name: Check shell files - run: git ls-files | grep -E '\.(ba)?sh' | xargs shellcheck - - - name: Check workflow files - run: | - bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) - ./actionlint diff --git a/voicevox_engine/.gitignore b/voicevox_engine/.gitignore deleted file mode 100644 index bfcae394d67f78e2b66bcd441dda1e630d198f0e..0000000000000000000000000000000000000000 --- a/voicevox_engine/.gitignore +++ /dev/null @@ -1,152 +0,0 @@ -# VOICEVOX specifics -## Artifact of generating licenses -/licenses.json -licenses_venv/ - -# Copied from `https://github.com/github/gitignore/blob/main/Python.gitignore` @2022-01-10 -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -# poetry.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintainted in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -.idea/ diff --git a/voicevox_engine/.pre-commit-config.yaml b/voicevox_engine/.pre-commit-config.yaml deleted file mode 100644 index b2029f9306d106bfd3da71c2d1f3a2d497268e9b..0000000000000000000000000000000000000000 --- a/voicevox_engine/.pre-commit-config.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# See https://pre-commit.com for more information -# See https://pre-commit.com/hooks.html for more hooks -repos: - - repo: local - hooks: - - id: pysen-lint - name: pysen-lint - entry: pysen run lint - language: python - types: [file, python] - stages: [push] - pass_filenames: false - - id: poetry-check # `pyproject.toml` と `poetry.lock` が整合する - name: poetry-check - entry: poetry check - language: python - stages: [push] - pass_filenames: false - - id: poetry-export - name: poetry-export - entry: poetry export --without-hashes -o requirements.txt - language: python - stages: [push] - pass_filenames: false - - id: poetry-export-dev - name: poetry-export-dev - entry: poetry export --without-hashes --with dev -o requirements-dev.txt - language: python - stages: [push] - pass_filenames: false - - id: poetry-export-build - name: poetry-export-build - entry: poetry export --without-hashes --with build -o requirements-build.txt - language: python - stages: [push] - pass_filenames: false diff --git a/voicevox_engine/CONTRIBUTING.md b/voicevox_engine/CONTRIBUTING.md deleted file mode 100644 index 42ea68fbad2213e3dac361b6b84a275cb6d62e1a..0000000000000000000000000000000000000000 --- a/voicevox_engine/CONTRIBUTING.md +++ /dev/null @@ -1,416 +0,0 @@ -# 貢献者ガイド - -VOICEVOX ENGINE はオープンソースプロジェクトです。本プロジェクトは活発に開発されており、その成果は製品版 VOICEVOX へも反映されています。VOICEVOX ENGINE はコミュニティの皆さんからのコントリビューションを歓迎しています。 -本ガイドは開発方針・プルリクエスト手順・レビュープロセスなど、コントリビュータの皆さんの一助となる情報を提供します。 - -## 目次 - -VOICEVOX ENGINE の方針に関するガイドは以下から確認できます。 - -- [開発ガバナンス](#開発ガバナンス) -- [バージョニング](#バージョニング) -- [ブランチ戦略](#ブランチ戦略) -- [プルリクエスト](#プルリクエスト) -- [レビュー](#レビュー) -- [バグ](#バグ) -- [機能向上](#機能向上) -- [静的解析](#静的解析) -- [テスト](#テスト) -- [ライセンス](#ライセンス) - -コントリビュータの目的に応じたガイドは以下から確認できます。 - -- [プルリクエストを送る](#プルリクエストを送る) -- バグ - - [バグを探す](#バグを探す) - - [バグを報告する](#バグを報告する) - - [バグを直す](#バグを直す) -- 機能向上 - - [機能向上タスクを探す](#機能向上タスクを探す) - - [機能を要望する](#機能を要望する) - - [機能を向上させる(実装する)](#機能を向上させる実装する) -- [環境構築](#環境構築) -- [コード実行](#コード実行) - -開発にあたって頻繁に利用されるコマンドは以下から確認できます。 - -- [依存ライブラリをインストールする](#依存ライブラリをインストールする) -- [音声ライブラリ無しで実行](#音声ライブラリ無しで実行) -- パッケージ - - [パッケージを追加する](#パッケージを追加する) - - [パッケージを更新する](#パッケージを更新する) - - [パッケージ情報を pip requirements.txt ファイルへ反映する](#パッケージ情報を-pip-requirementstxt-ファイルへ反映する) -- 静的解析 - - [タイポを検査する](#タイポを検査する) - - [静的解析を一括実行する](#静的解析を一括実行する) -- テスト - - [コードをテストする](#コードをテストする) - - [スナップショットを更新する](#スナップショットを更新する) - - [脆弱性を診断する](#脆弱性を診断する) - -## 開発ガバナンス - -VOICEVOX ENGINE は GitHub ベースのオープンな開発をおこなっています。 -コミュニティの皆さんからの機能要望・バグ報告・質問を GitHub Issues で受け付けています。またプルリクエストも歓迎しています。Issue を解決するプルリクエストを作成される際は、別の方と同じ Issue に取り組むことを避けるため、Issue 側で取り組み始めたことを伝えるか、最初に Draft プルリクエストを作成することを推奨しています。 - -より気軽な開発を可能にする目的で、[VOICEVOX 非公式 Discord サーバー](https://discord.gg/WMwWetrzuh)にて開発の議論や雑談を行っています。気軽にご参加ください。 - -## バージョニング - -セマンティックバージョニングを採用しています。 -現段階ではメジャーバージョンが 0 であり、破壊的変更を含むマイナーアップデートを許容しています。大きな機能追加・変更ではマイナーバージョンを、バグ修正やキャラクター追加ではパッチバージョンを更新しています。 - -変更内容の概要は各バージョンの [Releases](https://github.com/VOICEVOX/voicevox_engine/releases) にて確認できます。 - -## ブランチ戦略 - -ブランチ戦略としてリリースブランチ付き GitHub Flow を採用しています。 -プルリクエストは基本的に `master` ブランチへマージされます。例外として製品版 VOICEVOX の更新時期にはリリースブランチ `release-X.Y` が用意され、一時的に `master` から分岐します。リリースに必要なコミットが `release-X.Y` へおこなわれ、このブランチからリリースがおこなわれます。リリース直後の hotfix 等は `release-X.Y` に対してまずマージされ、リリースの後にブランチごと `master` へマージされます。 - -## プルリクエスト - -全てのコード変更はプルリクエストを介しておこなわれます。 -プルリクエストは [GitHub Pull requests](https://github.com/VOICEVOX/voicevox_engine/pulls) で一括管理され、[レビュー](#レビュー)を経てマージされます。VOICEVOX ENGINE はコミュニティの皆さんからのプルリクエストを歓迎しています。 - -### プルリクエストを送る - -以下の手順でプルリクエストを作成できます。 - -- [開発環境](#環境構築)を用意する -- このレポジトリをフォークし、`master` ブランチからプルリクエスト用ブランチを作る -- [依存ライブラリをインストールする](#依存ライブラリをインストールする) -- (任意)[音声ライブラリを導入する](#音声ライブラリを導入する) -- [コードを編集する](#コードを編集する) -- [静的解析を一括実行する](#静的解析を一括実行する)([型検査](#型検査)・[リント](#リント)・[整形](#整形)) -- [コードをテストする](#コードをテストする) -- ブランチをリモートへプッシュし、このレポジトリに対してプルリクエストを作成する - -## レビュー - -全てのプルリクエストはレビューを経てマージされます。 -レビューは [GitHub Pull requests](https://github.com/VOICEVOX/voicevox_engine/pulls) 上でオープンにおこなわれ、コミュニティの誰でもコメント等の形で参加可能です。レビューを経たのちに `master` (あるいは `release-X.Y`) ブランチへマージされます。マージには VOICEVOX チームによる approve が必須です。 - -## バグ - -GitHub Issues を用いてバグを一元管理しています。 - -### バグを探す - -[`バグ` ラベルでのフィルタリング](https://github.com/VOICEVOX/voicevox_engine/issues?q=is%3Aissue+is%3Aopen+label%3Aバグ)により既知バグの一覧にアクセスできます。バグの修正状況は各バグの issue にて確認できます。 - -### バグを報告する - -既知バグの一覧にないバグ(新規バグ)を見つけた場合、GitHub Issues で報告が可能です。VOICEVOX ENGINE は新規バグの報告を歓迎しています。 - -### バグを直す - -バグの修正は Issue 上で議論され、プルリクエストを用いて修正されます。プルリクエストを作成する手順は "[プルリクエストを送る](#プルリクエストを送る)" でガイドされています。VOICEVOX ENGINE はバグを修正するプルリクエストを歓迎しています。 - -## 機能向上 - -GitHub Issues を用いて機能向上を一元管理しています。 - -### 機能向上タスクを探す - -[`機能向上` ラベルでのフィルタリング](https://github.com/VOICEVOX/voicevox_engine/issues?q=is%3Aissue+is%3Aopen+label%3A機能向上)により新規機能追加や仕様変更の一覧にアクセスできます。機能向上の実装状況は各機能向上の issue にて確認できます。 - -### 機能を要望する - -既存提案一覧にない機能向上案がある場合、GitHub Issues で提案が可能です。VOICEVOX ENGINE は機能向上の提案を歓迎しています。 - -### 機能を向上させる(実装する) - -機能向上は Issue 上で議論され、プルリクエストを用いて実装されます。プルリクエストを作成する手順は "[プルリクエストを送る](#プルリクエストを送る)" でガイドされています。VOICEVOX ENGINE は機能向上を実装するプルリクエストを歓迎しています。 - -## 環境構築 - -`Python 3.11.3` を用いて開発されています。 -インストールするには、各 OS ごとの C/C++ コンパイラ、CMake が必要になります。 - -### 依存ライブラリをインストールする - -シェルで以下のコマンドを実行することで依存ライブラリがインストールされます。 - -```bash -# 実行・開発・テスト環境のインストール -python -m pip install -r requirements.txt -r requirements-dev.txt -r requirements-build.txt - -# git hook のインストール -pre-commit install -t pre-push -``` - -## 音声ライブラリ - -OSS 版 VOICEVOX ENGINE は製品版 VOICEVOX の音声ライブラリを同梱していないため、音声合成がモック版となっています。 - -製品版 VOICEVOX の音声ライブラリは、利用規約を遵守の上、以下のいずれかの手順で導入できます。これにより「ずんだもん」等の製品版キャラクター音声を合成できます。 - -### 音声ライブラリを導入する - -音声ライブラリは以下のいずれかの手順で導入できます。 - -#### 製品版 VOICEVOX を用いた音声ライブラリの導入 - -製品版 VOICEVOX を導入することで音声ライブラリを利用できます。 -[VOICEVOX 公式ホームページ](https://voicevox.hiroshiba.jp/)に従いソフトウェアを導入してください。 - -#### 製品版 VOICEVOX CORE を用いた音声ライブラリの導入 - -製品版 VOICEVOX CORE を導入することで音声ライブラリを利用できます。 -以下のコマンドにより必要なファイルが準備されます。 - -```bash -# CORE のバリエーション指定変数を定義する(例として x64 Linux マシン向け VOICEVOX CORE v0.15.0 CPU版) -VERSION="0.15.0"; OS="linux"; ARCHITECTURE="x64"; PROCESSOR="cpu"; - -# CORE をダウンロード・展開する -CORENAME="voicevox_core-${OS}-${ARCHITECTURE}-${PROCESSOR}-${VERSION}" -curl -L "https://github.com/VOICEVOX/voicevox_core/releases/download/${VERSION}/${CORENAME}.zip" -o "${CORENAME}.zip" -unzip "${CORENAME}.zip" -``` - -CORE のバリエーション変数は以下の値を指定できます。 - -- `VERSION`: voicevox_core のバージョン (例として `0.15.0`) -- `OS`: OS 種別 (`windows` | `osx` | `linux`) -- `ARCHITECTURE`: CPU アーキテクチャ (`x86` | `x64` | `arm64`) -- `PROCESSOR`: プロセッサ種別 (`cpu` | `gpu` | `cuda` | `directml`) - -最新のリリースは[こちら](https://github.com/VOICEVOX/voicevox_core/releases/latest)にあります。 - -## コード実行 - -VOICEVOX ENGINE を実行することで HTTP サーバーが立ち上がります。 -コマンドライン引数の詳細は以下のコマンドで確認してください。 - -```bash -python run.py --help -``` - -### 音声ライブラリ無しで実行 - -音声ライブラリを導入しなかった場合あるいは軽量のモック版音声合成を利用したい場合、シェルで以下のコマンドを実行することでエンジンが実行されます。 - -```bash -python run.py --enable_mock -``` - -### 音声ライブラリに製品版 VOICEVOX を利用して実行 - -```bash -VOICEVOX_DIR="C:/path/to/VOICEVOX/vv-engine" # 製品版 VOICEVOX ディレクトリ内の ENGINE のパス -python run.py --voicevox_dir=$VOICEVOX_DIR -``` - -### 音声ライブラリに製品版 VOICEVOX CORE を利用して実行 - -```bash -VOICELIB_DIR_1="C:/path/to/core_1"; VOICELIB_DIR_2="C:/path/to/core_2"; # 製品版 VOICEVOX CORE ディレクトリのパス -python run.py --voicelib_dir=$VOICELIB_DIR_1 --voicelib_dir=$VOICELIB_DIR_2 -``` - -### ログを UTF8 に変更 - -```bash -python run.py --output_log_utf8 -# もしくは -VV_OUTPUT_LOG_UTF8=1 python run.py -``` - -## コードを編集する - -### パッケージ - -`poetry` によってパッケージを管理しています。また `pip` ユーザー向けに `requirements-*.txt` を生成しています。 -依存パッケージは「ビルドにより音声ライブラリと一体化しても、音声ライブラリのライセンスと衝突しない」ライセンスを持つ必要があります。 -主要ライセンスの可否は以下の通りです。 - -- MIT/Apache/BSD-3: OK -- LGPL: OK (コアと動的分離されているため) -- GPL: NG (全関連コードの公開が必要なため) - -#### パッケージを追加する - -```bash -poetry add `パッケージ名` -poetry add --group dev `パッケージ名` # 開発依存の追加 -poetry add --group build `パッケージ名` # ビルド依存の追加 -``` - -#### パッケージを更新する - -```bash -poetry update `パッケージ名` -poetry update # 全部更新 -``` - -#### パッケージ情報を pip requirements.txt ファイルへ反映する - -```bash -poetry export --without-hashes -o requirements.txt # こちらを更新する場合は下3つも更新する必要があります。 -poetry export --without-hashes --with dev -o requirements-dev.txt -poetry export --without-hashes --with build -o requirements-build.txt -``` - -## 静的解析 - -### 型検査 - -型検査を採用しています。 -目的は安全性の向上であり、チェッカーには `mypy` を採用しています。 - -型検査の実行は "[静的解析を一括実行する](#静的解析を一括実行する)" 節を参照してください。 - -### リント - -自動リントを採用しています。 -目的は安全性の向上であり、リンターには `flake8` と `isort` を採用しています。 - -リンターの実行は "[静的解析を一括実行する](#静的解析を一括実行する)" 節を参照してください。 - -### 整形 - -コード自動整形を採用しています。 -目的は可読性の向上であり、フォーマッタには `black` を採用しています。 - -フォーマッタの実行は "[静的解析を一括実行する](#静的解析を一括実行する)" 節を参照してください。 - -なお、ドキュメント自動整形は現段階では採用していません。メンテナが定期的に `prettier` で整形しています。 - -### タイポ検査 - -タイポ検査を採用しています。 -目的は可読性の向上であり、チェッカーには [`typos`](https://github.com/crate-ci/typos) を採用しています。誤判定やチェックから除外すべきファイルがあれば[設定ファイルの説明](https://github.com/crate-ci/typos#false-positives)に従って `pyproject.toml` を編集してください。 -ローカルへの `typos` 導入は各自の環境に合わせて公式ドキュメントを参照してください。ローカルへの導入が難しい場合、プルリクエスト時に GitHub Actions で自動実行される `typos` の結果を参照してください。 - -#### タイポを検査する - -シェルで以下のコマンドを実行することでタイポが検査されます。 - -```bash -typos -``` - -### 静的解析を一括実行する - -シェルで以下のコマンドを実行することで静的解析([型検査](#型検査)・[リント](#リント)・[整形](#整形))が一括実行されます。 -この際、可能な範囲で自動修正がおこなわれます。 - -```bash -pysen run format lint -``` - -## テスト - -自動テストを採用しています。 -長期的に安定した開発を目指して単体テスト・End-to-End テスト共に充実させており、値の不変を保証するスナップショットテストも採用しています。テストランナーには `pytest` を採用しています。 - -### コードをテストする - -シェルで以下のコマンドを実行することでテストが走ります。 - -```bash -python -m pytest -``` - -### スナップショットを更新する - -コード変更により想定される出力値が変わり、スナップショットの更新が必要となる場合があります。 -シェルで以下のコマンドを実行することでスナップショットが更新されます。 - -```bash -python -m pytest --snapshot-update -``` - -### 脆弱性を診断する - -`safety` を用いた脆弱性診断により依存パッケージの安全性を確保しています。 -シェルで以下のコマンドを実行することで脆弱性が診断されます。 - -```bash -safety check -r requirements.txt -r requirements-dev.txt -r requirements-build.txt -``` - -## ビルド - -この方法でビルドしたものは、リリースで公開されているものとは異なります。 また、GPU で利用するには cuDNN や CUDA、DirectML などのライブラリが追加で必要となります。 - -```bash -OUTPUT_LICENSE_JSON_PATH=licenses.json \ -bash tools/create_venv_and_generate_licenses.bash - -# モックでビルドする場合 -pyinstaller --noconfirm run.spec - -# 製品版でビルドする場合 -CORE_MODEL_DIR_PATH="/path/to/core_model" \ -LIBCORE_PATH="/path/to/libcore" \ -LIBONNXRUNTIME_PATH="/path/to/libonnxruntime" \ -pyinstaller --noconfirm run.spec -``` - -TODO: Docker 版のビルド手順を GitHub Actions をベースに記述する - -### Github Actions でビルド - -fork したリポジトリで Actions を ON にし、workflow_dispatch で`build-engine-package.yml`を起動すればビルドできます。 -成果物は Release にアップロードされます。 - -### API ドキュメントの確認 - -[API ドキュメント](https://voicevox.github.io/voicevox_engine/api/)(実体は`docs/api/index.html`)は自動で更新されます。 -次のコマンドで API ドキュメントを手動で作成することができます。 - -```bash -PYTHONPATH=. python tools/make_docs.py -``` - -## GitHub Actions - -### Variables - -| name | description | -| :----------------- | :------------------ | -| DOCKERHUB_USERNAME | Docker Hub ユーザ名 | - -### Secrets - -| name | description | -| :-------------- | :---------------------------------------------------------------------- | -| DOCKERHUB_TOKEN | [Docker Hub アクセストークン](https://hub.docker.com/settings/security) | - -## Issue - -不具合の報告、機能要望、改善提案、質問はIssueの方に報告してください。 - -### Issue の状態 - -VOICEVOX ENGINE では issue の状態遷移を以下のように整理しています。 -各状態は GitHub の `状態:〇〇` ラベルと対応しています(例: [`状態:実装者募集`](https://github.com/VOICEVOX/voicevox_engine/labels/状態:実装者募集))。 - -```mermaid ---- -title: issue 状態遷移図 v1.0 ---- -stateDiagram-v2 - [*] --> 必要性議論 : issue open - state opened { - 必要性議論 --> 設計 - 設計 --> 実装者募集 - 実装者募集 --> 実装 : 着手宣言 - } - opened --> not_planned : NoGo 判断 - not_planned --> [*] : issue close - 実装 --> resolved : Pull request merge - resolved --> [*] : issue close - opened --> ロードマップ : 停滞 - ロードマップ --> opened -``` - -NOTE: ロードマップ化すべきかの棚卸し判定は、issue が `必要性議論` で 30 日、`設計`・`実装者募集`・`実装` で 180 日停滞した場合におこなう。`実装` の停滞時にはサポートも検討する。 - -## ライセンス - -LGPL v3 と、ソースコードの公開が不要な別ライセンスのデュアルライセンスです。 -別ライセンスを取得したい場合は、ヒホに求めてください。 -X アカウント: [@hiho_karuta](https://x.com/hiho_karuta) diff --git a/voicevox_engine/Dockerfile b/voicevox_engine/Dockerfile deleted file mode 100644 index d261f358a5785af52f8fc1150cab2d116a86d40b..0000000000000000000000000000000000000000 --- a/voicevox_engine/Dockerfile +++ /dev/null @@ -1,310 +0,0 @@ -# syntax=docker/dockerfile:1.4 - -# TODO: build-arg と target のドキュメントをこのファイルに書く - -ARG BASE_IMAGE=ubuntu:20.04 -ARG BASE_RUNTIME_IMAGE=$BASE_IMAGE - -# Download VOICEVOX Core shared object -FROM ${BASE_IMAGE} AS download-core-env -ARG DEBIAN_FRONTEND=noninteractive - -WORKDIR /work - -RUN <= 0.11.0 (ONNX) -ARG TARGETPLATFORM -ARG USE_GPU=false -ARG VOICEVOX_CORE_VERSION=0.15.4 - -RUN < /etc/ld.so.conf.d/voicevox_core.conf - - # Update dynamic library search cache - ldconfig -EOF - - -# Download ONNX Runtime -FROM ${BASE_IMAGE} AS download-onnxruntime-env -ARG DEBIAN_FRONTEND=noninteractive - -WORKDIR /work - -RUN < /etc/ld.so.conf.d/onnxruntime.conf - - # Update dynamic library search cache - ldconfig -EOF - - -# Compile Python (version locked) -FROM ${BASE_IMAGE} AS compile-python-env - -ARG DEBIAN_FRONTEND=noninteractive - -RUN < /etc/profile.d/python-path.sh -# echo "export LD_LIBRARY_PATH=/opt/python/lib:\$LD_LIBRARY_PATH" >> /etc/profile.d/python-path.sh -# echo "export C_INCLUDE_PATH=/opt/python/include:\$C_INCLUDE_PATH" >> /etc/profile.d/python-path.sh -# -# rm -f /etc/ld.so.cache -# ldconfig -# EOF - - -# Runtime -FROM ${BASE_RUNTIME_IMAGE} AS runtime-env -ARG DEBIAN_FRONTEND=noninteractive - -WORKDIR /opt/voicevox_engine - -# ca-certificates: pyopenjtalk dictionary download -# build-essential: pyopenjtalk local build -# libsndfile1: soundfile shared object for arm64 -# ref: https://github.com/VOICEVOX/voicevox_engine/issues/770 -RUN < /opt/voicevox_engine/resources/engine_manifest_assets/dependency_licenses.json - cp /opt/voicevox_engine/resources/engine_manifest_assets/dependency_licenses.json /opt/voicevox_engine/licenses.json -EOF - -# Generate filemap.json -RUN /opt/python/bin/python3 /opt/voicevox_engine/tools/generate_filemap.py --target_dir /opt/voicevox_engine/resources/character_info - -# Keep this layer separated to use layer cache on download failed in local build -RUN < /dev/stderr - -exec "\$@" -EOF - -ENTRYPOINT [ "/entrypoint.sh" ] -CMD [ "gosu", "user", "/opt/python/bin/python3", "./run.py", "--voicelib_dir", "/opt/voicevox_core/", "--runtime_dir", "/opt/onnxruntime/lib", "--host", "0.0.0.0" ] - -# Enable use_gpu -FROM runtime-env AS runtime-nvidia-env -CMD [ "gosu", "user", "/opt/python/bin/python3", "./run.py", "--use_gpu", "--voicelib_dir", "/opt/voicevox_core/", "--runtime_dir", "/opt/onnxruntime/lib", "--host", "0.0.0.0" ] diff --git a/voicevox_engine/LGPL_LICENSE b/voicevox_engine/LGPL_LICENSE deleted file mode 100644 index 153d416dc8d2d60076698ec3cbfce34d91436a03..0000000000000000000000000000000000000000 --- a/voicevox_engine/LGPL_LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. \ No newline at end of file diff --git a/voicevox_engine/LICENSE b/voicevox_engine/LICENSE deleted file mode 100644 index 66148ef648aa2374982179d24d51c77add72082c..0000000000000000000000000000000000000000 --- a/voicevox_engine/LICENSE +++ /dev/null @@ -1,10 +0,0 @@ -LGPL v3 と、ソースコードの公開が不要な別ライセンスのデュアルライセンスです。 - -1. LGPL v3 - -LGPL_LICENSEを参照してください。 - -2. ソースコードの公開が不要な別ライセンス - -別ライセンスを取得したい場合は、ヒホに求めてください。 -X アカウント: @hiho_karuta diff --git a/voicevox_engine/README.md b/voicevox_engine/README.md deleted file mode 100644 index c6064872bde17c16c2e8d4be93668f53f4333137..0000000000000000000000000000000000000000 --- a/voicevox_engine/README.md +++ /dev/null @@ -1,652 +0,0 @@ -# VOICEVOX ENGINE - -[![build](https://github.com/VOICEVOX/voicevox_engine/actions/workflows/build-engine-package.yml/badge.svg)](https://github.com/VOICEVOX/voicevox_engine/actions/workflows/build-engine-package.yml) -[![releases](https://img.shields.io/github/v/release/VOICEVOX/voicevox_engine)](https://github.com/VOICEVOX/voicevox_engine/releases) -[![discord](https://img.shields.io/discord/879570910208733277?color=5865f2&label=&logo=discord&logoColor=ffffff)](https://discord.gg/WMwWetrzuh) - -[![test](https://github.com/VOICEVOX/voicevox_engine/actions/workflows/test.yml/badge.svg)](https://github.com/VOICEVOX/voicevox_engine/actions/workflows/test.yml) -[![Coverage Status](https://coveralls.io/repos/github/VOICEVOX/voicevox_engine/badge.svg)](https://coveralls.io/github/VOICEVOX/voicevox_engine) - -[![build-docker](https://github.com/VOICEVOX/voicevox_engine/actions/workflows/build-engine-container.yml/badge.svg)](https://github.com/VOICEVOX/voicevox_engine/actions/workflows/build-engine-container.yml) -[![docker](https://img.shields.io/docker/pulls/voicevox/voicevox_engine)](https://hub.docker.com/r/voicevox/voicevox_engine) - -[VOICEVOX](https://voicevox.hiroshiba.jp/) のエンジンです。 -実態は HTTP サーバーなので、リクエストを送信すればテキスト音声合成できます。 - -(エディターは [VOICEVOX](https://github.com/VOICEVOX/voicevox/) 、 -コアは [VOICEVOX CORE](https://github.com/VOICEVOX/voicevox_core/) 、 -全体構成は [こちら](https://github.com/VOICEVOX/voicevox/blob/main/docs/%E5%85%A8%E4%BD%93%E6%A7%8B%E6%88%90.md) に詳細があります。) - -## 目次 - -目的に合わせたガイドはこちらです。 - -- [ユーザーガイド](#ユーザーガイド): 音声合成をしたい方向け -- [貢献者ガイド](#貢献者ガイド): コントリビュートしたい方向け -- [開発者ガイド](#開発者ガイド): コードを利用したい方向け - -## ユーザーガイド - -### ダウンロード - -[こちら](https://github.com/VOICEVOX/voicevox_engine/releases/latest)から対応するエンジンをダウンロードしてください。 - -### API ドキュメント - -[API ドキュメント](https://voicevox.github.io/voicevox_engine/api/)をご参照ください。 - -VOICEVOX エンジンもしくはエディタを起動した状態で http://127.0.0.1:50021/docs にアクセスすると、起動中のエンジンのドキュメントも確認できます。 -今後の方針などについては [VOICEVOX 音声合成エンジンとの連携](./docs/VOICEVOX音声合成エンジンとの連携.md) も参考になるかもしれません。 - -### Docker イメージ - -#### CPU - -```bash -docker pull voicevox/voicevox_engine:cpu-ubuntu20.04-latest -docker run --rm -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest -``` - -#### GPU - -```bash -docker pull voicevox/voicevox_engine:nvidia-ubuntu20.04-latest -docker run --rm --gpus all -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:nvidia-ubuntu20.04-latest -``` - -##### トラブルシューティング - -GPU 版を利用する場合、環境によってエラーが発生することがあります。その場合、`--runtime=nvidia`を`docker run`につけて実行すると解決できることがあります。 - -### HTTP リクエストで音声合成するサンプルコード - -```bash -echo -n "こんにちは、音声合成の世界へようこそ" >text.txt - -curl -s \ - -X POST \ - "127.0.0.1:50021/audio_query?speaker=1"\ - --get --data-urlencode text@text.txt \ - > query.json - -curl -s \ - -H "Content-Type: application/json" \ - -X POST \ - -d @query.json \ - "127.0.0.1:50021/synthesis?speaker=1" \ - > audio.wav -``` - -生成される音声はサンプリングレートが 24000Hz と少し特殊なため、音声プレーヤーによっては再生できない場合があります。 - -`speaker` に指定する値は `/speakers` エンドポイントで得られる `style_id` です。互換性のために `speaker` という名前になっています。 - -### 音声を調整するサンプルコード - -`/audio_query` で得られる音声合成用のクエリのパラメータを編集することで、音声を調整できます。 - -例えば、話速を 1.5 倍速にしてみます。 - -```bash -echo -n "こんにちは、音声合成の世界へようこそ" >text.txt - -curl -s \ - -X POST \ - "127.0.0.1:50021/audio_query?speaker=1" \ - --get --data-urlencode text@text.txt \ - > query.json - -# sed を使用して speedScale の値を 1.5 に変更 -sed -i -r 's/"speedScale":[0-9.]+/"speedScale":1.5/' query.json - -curl -s \ - -H "Content-Type: application/json" \ - -X POST \ - -d @query.json \ - "127.0.0.1:50021/synthesis?speaker=1" \ - > audio_fast.wav -``` - -### 読み方を AquesTalk 風記法で取得・修正 - -#### AquesTalk 風記法 - - - -「**AquesTalk 風記法**」はカタカナと記号だけで読み方を指定する記法です。[AquesTalk 本家の記法](https://www.a-quest.com/archive/manual/siyo_onseikigou.pdf)とは一部が異なります。 -AquesTalk 風記法は次のルールに従います: - -- 全てのカナはカタカナで記述される -- アクセント句は `/` または `、` で区切る。 `、` で区切った場合に限り無音区間が挿入される。 -- カナの手前に `_` を入れるとそのカナは無声化される -- アクセント位置を `'` で指定する。全てのアクセント句にはアクセント位置を 1 つ指定する必要がある。 -- アクセント句末に `?` (全角)を入れることにより疑問文の発音ができる - -#### AquesTalk 風記法のサンプルコード - -`/audio_query`のレスポンスにはエンジンが判断した読み方が[AquesTalk 風記法](#aquestalk-風記法)で記述されます。 -これを修正することで音声の読み仮名やアクセントを制御できます。 - -```bash -# 読ませたい文章をutf-8でtext.txtに書き出す -echo -n "ディープラーニングは万能薬ではありません" >text.txt - -curl -s \ - -X POST \ - "127.0.0.1:50021/audio_query?speaker=1" \ - --get --data-urlencode text@text.txt \ - > query.json - -cat query.json | grep -o -E "\"kana\":\".*\"" -# 結果... "kana":"ディ'イプ/ラ'アニングワ/バンノオヤクデワアリマセ'ン" - -# "ディイプラ'アニングワ/バンノ'オヤクデワ/アリマセ'ン"と読ませたいので、 -# is_kana=trueをつけてイントネーションを取得しnewphrases.jsonに保存 -echo -n "ディイプラ'アニングワ/バンノ'オヤクデワ/アリマセ'ン" > kana.txt -curl -s \ - -X POST \ - "127.0.0.1:50021/accent_phrases?speaker=1&is_kana=true" \ - --get --data-urlencode text@kana.txt \ - > newphrases.json - -# query.jsonの"accent_phrases"の内容をnewphrases.jsonの内容に置き換える -cat query.json | sed -e "s/\[{.*}\]/$(cat newphrases.json)/g" > newquery.json - -curl -s \ - -H "Content-Type: application/json" \ - -X POST \ - -d @newquery.json \ - "127.0.0.1:50021/synthesis?speaker=1" \ - > audio.wav -``` - -### ユーザー辞書機能について - -API からユーザー辞書の参照、単語の追加、編集、削除を行うことができます。 - -#### 参照 - -`/user_dict`に GET リクエストを投げることでユーザー辞書の一覧を取得することができます。 - -```bash -curl -s -X GET "127.0.0.1:50021/user_dict" -``` - -#### 単語追加 - -`/user_dict_word`に POST リクエストを投げる事でユーザー辞書に単語を追加することができます。 -URL パラメータとして、以下が必要です。 - -- surface (辞書に登録する単語) -- pronunciation (カタカナでの読み方) -- accent_type (アクセント核位置、整数) - -アクセント核位置については、こちらの文章が参考になるかと思います。 -〇型となっている数字の部分がアクセント核位置になります。 -https://tdmelodic.readthedocs.io/ja/latest/pages/introduction.html - -成功した場合の返り値は単語に割り当てられる UUID の文字列になります。 - -```bash -surface="test" -pronunciation="テスト" -accent_type="1" - -curl -s -X POST "127.0.0.1:50021/user_dict_word" \ - --get \ - --data-urlencode "surface=$surface" \ - --data-urlencode "pronunciation=$pronunciation" \ - --data-urlencode "accent_type=$accent_type" -``` - -#### 単語修正 - -`/user_dict_word/{word_uuid}`に PUT リクエストを投げる事でユーザー辞書の単語を修正することができます。 -URL パラメータとして、以下が必要です。 - -- surface (辞書に登録するワード) -- pronunciation (カタカナでの読み方) -- accent_type (アクセント核位置、整数) - -word_uuid は単語追加時に確認できるほか、ユーザー辞書を参照することでも確認できます。 -成功した場合の返り値は`204 No Content`になります。 - -```bash -surface="test2" -pronunciation="テストツー" -accent_type="2" -# 環境によってword_uuidは適宜書き換えてください -word_uuid="cce59b5f-86ab-42b9-bb75-9fd3407f1e2d" - -curl -s -X PUT "127.0.0.1:50021/user_dict_word/$word_uuid" \ - --get \ - --data-urlencode "surface=$surface" \ - --data-urlencode "pronunciation=$pronunciation" \ - --data-urlencode "accent_type=$accent_type" -``` - -#### 単語削除 - -`/user_dict_word/{word_uuid}`に DELETE リクエストを投げる事でユーザー辞書の単語を削除することができます。 - -word_uuid は単語追加時に確認できるほか、ユーザー辞書を参照することでも確認できます。 -成功した場合の返り値は`204 No Content`になります。 - -```bash -# 環境によってword_uuidは適宜書き換えてください -word_uuid="cce59b5f-86ab-42b9-bb75-9fd3407f1e2d" - -curl -s -X DELETE "127.0.0.1:50021/user_dict_word/$word_uuid" -``` - -#### 辞書のインポート&エクスポート - -エンジンの[設定ページ](http://127.0.0.1:50021/setting)内の「ユーザー辞書のエクスポート&インポート」節で、ユーザー辞書のインポート&エクスポートが可能です。 - -他にも API でユーザー辞書のインポート&エクスポートが可能です。 -インポートには `POST /import_user_dict`、エクスポートには `GET /user_dict` を利用します。 -引数等の詳細は API ドキュメントをご覧ください。 - -### プリセット機能について - -`presets.yaml`を編集することでキャラクターや話速などのプリセットを使うことができます。 - -```bash -echo -n "プリセットをうまく活用すれば、サードパーティ間で同じ設定を使うことができます" >text.txt - -# プリセット情報を取得 -curl -s -X GET "127.0.0.1:50021/presets" > presets.json - -preset_id=$(cat presets.json | sed -r 's/^.+"id"\:\s?([0-9]+?).+$/\1/g') -style_id=$(cat presets.json | sed -r 's/^.+"style_id"\:\s?([0-9]+?).+$/\1/g') - -# 音声合成用のクエリを取得 -curl -s \ - -X POST \ - "127.0.0.1:50021/audio_query_from_preset?preset_id=$preset_id"\ - --get --data-urlencode text@text.txt \ - > query.json - -# 音声合成 -curl -s \ - -H "Content-Type: application/json" \ - -X POST \ - -d @query.json \ - "127.0.0.1:50021/synthesis?speaker=$style_id" \ - > audio.wav -``` - -- `speaker_uuid`は、`/speakers`で確認できます -- `id`は重複してはいけません -- エンジン起動後にファイルを書き換えるとエンジンに反映されます - -### 2 種類のスタイルでモーフィングするサンプルコード - -`/synthesis_morphing`では、2 種類のスタイルでそれぞれ合成された音声を元に、モーフィングした音声を生成します。 - -```bash -echo -n "モーフィングを利用することで、2種類の声を混ぜることができます。" > text.txt - -curl -s \ - -X POST \ - "127.0.0.1:50021/audio_query?speaker=8"\ - --get --data-urlencode text@text.txt \ - > query.json - -# 元のスタイルでの合成結果 -curl -s \ - -H "Content-Type: application/json" \ - -X POST \ - -d @query.json \ - "127.0.0.1:50021/synthesis?speaker=8" \ - > audio.wav - -export MORPH_RATE=0.5 - -# スタイル2種類分の音声合成+WORLDによる音声分析が入るため時間が掛かるので注意 -curl -s \ - -H "Content-Type: application/json" \ - -X POST \ - -d @query.json \ - "127.0.0.1:50021/synthesis_morphing?base_speaker=8&target_speaker=10&morph_rate=$MORPH_RATE" \ - > audio.wav - -export MORPH_RATE=0.9 - -# query、base_speaker、target_speakerが同じ場合はキャッシュが使用されるため比較的高速に生成される -curl -s \ - -H "Content-Type: application/json" \ - -X POST \ - -d @query.json \ - "127.0.0.1:50021/synthesis_morphing?base_speaker=8&target_speaker=10&morph_rate=$MORPH_RATE" \ - > audio.wav -``` - -### キャラクターの追加情報を取得するサンプルコード - -追加情報の中の portrait.png を取得するコードです。 -([jq](https://stedolan.github.io/jq/)を使用して json をパースしています。) - -```bash -curl -s -X GET "127.0.0.1:50021/speaker_info?speaker_uuid=7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff" \ - | jq -r ".portrait" \ - | base64 -d \ - > portrait.png -``` - -### キャンセル可能な音声合成 - -`/cancellable_synthesis`では通信を切断した場合に即座に計算リソースが開放されます。 -(`/synthesis`では通信を切断しても最後まで音声合成の計算が行われます) -この API は実験的機能であり、エンジン起動時に引数で`--enable_cancellable_synthesis`を指定しないと有効化されません。 -音声合成に必要なパラメータは`/synthesis`と同様です。 - -### HTTP リクエストで歌声合成するサンプルコード - -```bash -echo -n '{ - "notes": [ - { "key": null, "frame_length": 15, "lyric": "" }, - { "key": 60, "frame_length": 45, "lyric": "ド" }, - { "key": 62, "frame_length": 45, "lyric": "レ" }, - { "key": 64, "frame_length": 45, "lyric": "ミ" }, - { "key": null, "frame_length": 15, "lyric": "" } - ] -}' > score.json - -curl -s \ - -H "Content-Type: application/json" \ - -X POST \ - -d @score.json \ - "127.0.0.1:50021/sing_frame_audio_query?speaker=6000" \ - > query.json - -curl -s \ - -H "Content-Type: application/json" \ - -X POST \ - -d @query.json \ - "127.0.0.1:50021/frame_synthesis?speaker=3001" \ - > audio.wav -``` - -スコアの`key`は MIDI 番号です。 -`lyric`は歌詞で、任意の文字列を指定できますが、エンジンによってはひらがな・カタカナ1モーラ以外の文字列はエラーになることがあります。 -フレームレートはデフォルトが 93.75Hz で、エンジンマニフェストの`frame_rate`で取得できます。 -1つ目のノートは無音である必要があります。 - -`/sing_frame_audio_query`で指定できる`speaker`は、`/singers`で取得できるスタイルの内、種類が`sing`か`singing_teacher`なスタイルの`style_id`です。 -`/frame_synthesis`で指定できる`speaker`は、`/singers`で取得できるスタイルの内、種類が`frame_decode`の`style_id`です。 -引数が `speaker` という名前になっているのは、他の API と一貫性をもたせるためです。 - -`/sing_frame_audio_query`と`/frame_synthesis`に異なるスタイルを指定することも可能です。 - -### CORS 設定 - -VOICEVOX ではセキュリティ保護のため`localhost`・`127.0.0.1`・`app://`・Origin なし以外の Origin からリクエストを受け入れないようになっています。 -そのため、一部のサードパーティアプリからのレスポンスを受け取れない可能性があります。 -これを回避する方法として、エンジンから設定できる UI を用意しています。 - -#### 設定方法 - -1. にアクセスします。 -2. 利用するアプリに合わせて設定を変更、追加してください。 -3. 保存ボタンを押して、変更を確定してください。 -4. 設定の適用にはエンジンの再起動が必要です。必要に応じて再起動をしてください。 - -### データを変更する API を無効化する - -実行時引数`--disable_mutable_api`か環境変数`VV_DISABLE_MUTABLE_API=1`を指定することで、エンジンの設定や辞書などを変更する API を無効にできます。 - -### 文字コード - -リクエスト・レスポンスの文字コードはすべて UTF-8 です。 - -### その他の引数 - -エンジン起動時に引数を指定できます。詳しいことは`-h`引数でヘルプを確認してください。 - -```bash -$ python run.py -h - -usage: run.py [-h] [--host HOST] [--port PORT] [--use_gpu] [--voicevox_dir VOICEVOX_DIR] [--voicelib_dir VOICELIB_DIR] [--runtime_dir RUNTIME_DIR] [--enable_mock] [--enable_cancellable_synthesis] - [--init_processes INIT_PROCESSES] [--load_all_models] [--cpu_num_threads CPU_NUM_THREADS] [--output_log_utf8] [--cors_policy_mode {CorsPolicyMode.all,CorsPolicyMode.localapps}] - [--allow_origin [ALLOW_ORIGIN ...]] [--setting_file SETTING_FILE] [--preset_file PRESET_FILE] [--disable_mutable_api] - -VOICEVOX のエンジンです。 - -options: - -h, --help show this help message and exit - --host HOST 接続を受け付けるホストアドレスです。 - --port PORT 接続を受け付けるポート番号です。 - --use_gpu GPUを使って音声合成するようになります。 - --voicevox_dir VOICEVOX_DIR - VOICEVOXのディレクトリパスです。 - --voicelib_dir VOICELIB_DIR - VOICEVOX COREのディレクトリパスです。 - --runtime_dir RUNTIME_DIR - VOICEVOX COREで使用するライブラリのディレクトリパスです。 - --enable_mock VOICEVOX COREを使わずモックで音声合成を行います。 - --enable_cancellable_synthesis - 音声合成を途中でキャンセルできるようになります。 - --init_processes INIT_PROCESSES - cancellable_synthesis機能の初期化時に生成するプロセス数です。 - --load_all_models 起動時に全ての音声合成モデルを読み込みます。 - --cpu_num_threads CPU_NUM_THREADS - 音声合成を行うスレッド数です。指定しない場合、代わりに環境変数 VV_CPU_NUM_THREADS の値が使われます。VV_CPU_NUM_THREADS が空文字列でなく数値でもない場合はエラー終了します。 - --output_log_utf8 ログ出力をUTF-8でおこないます。指定しない場合、代わりに環境変数 VV_OUTPUT_LOG_UTF8 の値が使われます。VV_OUTPUT_LOG_UTF8 の値が1の場合はUTF-8で、0または空文字、値がない場合は環境によって自動的に決定されます。 - --cors_policy_mode {CorsPolicyMode.all,CorsPolicyMode.localapps} - CORSの許可モード。allまたはlocalappsが指定できます。allはすべてを許可します。localappsはオリジン間リソース共有ポリシーを、app://.とlocalhost関連に限定します。その他のオリジンはallow_originオプションで追加できます。デフォルトはlocalapps。このオプションは-- - setting_fileで指定される設定ファイルよりも優先されます。 - --allow_origin [ALLOW_ORIGIN ...] - 許可するオリジンを指定します。スペースで区切ることで複数指定できます。このオプションは--setting_fileで指定される設定ファイルよりも優先されます。 - --setting_file SETTING_FILE - 設定ファイルを指定できます。 - --preset_file PRESET_FILE - プリセットファイルを指定できます。指定がない場合、環境変数 VV_PRESET_FILE、実行ファイルのディレクトリのpresets.yamlを順に探します。 - --disable_mutable_api - 辞書登録や設定変更など、エンジンの静的なデータを変更するAPIを無効化します。指定しない場合、代わりに環境変数 VV_DISABLE_MUTABLE_API の値が使われます。VV_DISABLE_MUTABLE_API の値が1の場合は無効化で、0または空文字、値がない場合は無視されます。 -``` - -### アップデート - -エンジンディレクトリ内にあるファイルを全て消去し、新しいものに置き換えてください。 - -## 貢献者ガイド - -VOICEVOX ENGINE は皆さんのコントリビューションをお待ちしています! -詳細は [CONTRIBUTING.md](./CONTRIBUTING.md) をご覧ください。 -また [VOICEVOX 非公式 Discord サーバー](https://discord.gg/WMwWetrzuh)にて、開発の議論や雑談を行っています。気軽にご参加ください。 - -なお、Issue を解決するプルリクエストを作成される際は、別の方と同じ Issue に取り組むことを避けるため、Issue 側で取り組み始めたことを伝えるか、最初に Draft プルリクエストを作成することを推奨しています。 - -## 開発者ガイド - -### 環境構築 - -`Python 3.11.3` を用いて開発されています。 -インストールするには、各 OS ごとの C/C++ コンパイラ、CMake が必要になります。 - -```bash -# 実行環境のインストール -python -m pip install -r requirements.txt - -# 開発環境・テスト環境・ビルド環境のインストール -python -m pip install -r requirements-dev.txt -r requirements-build.txt -``` - -### 実行 - -コマンドライン引数の詳細は以下のコマンドで確認してください。 - -```bash -python run.py --help -``` - -```bash -# 製品版 VOICEVOX でサーバーを起動 -VOICEVOX_DIR="C:/path/to/voicevox" # 製品版 VOICEVOX ディレクトリのパス -python run.py --voicevox_dir=$VOICEVOX_DIR -``` - - - -```bash -# モックでサーバー起動 -python run.py --enable_mock -``` - -```bash -# ログをUTF8に変更 -python run.py --output_log_utf8 -# もしくは VV_OUTPUT_LOG_UTF8=1 python run.py -``` - -#### CPU スレッド数を指定する - -CPU スレッド数が未指定の場合は、論理コア数の半分が使われます。(殆どの CPU で、これは全体の処理能力の半分です) -もし IaaS 上で実行していたり、専用サーバーで実行している場合など、 -エンジンが使う処理能力を調節したい場合は、CPU スレッド数を指定することで実現できます。 - -- 実行時引数で指定する - ```bash - python run.py --voicevox_dir=$VOICEVOX_DIR --cpu_num_threads=4 - ``` -- 環境変数で指定する - ```bash - export VV_CPU_NUM_THREADS=4 - python run.py --voicevox_dir=$VOICEVOX_DIR - ``` - -#### 過去のバージョンのコアを使う - -VOICEVOX Core 0.5.4 以降のコアを使用する事が可能です。 -Mac での libtorch 版コアのサポートはしていません。 - -##### 過去のバイナリを指定する - -製品版 VOICEVOX もしくはコンパイル済みエンジンのディレクトリを`--voicevox_dir`引数で指定すると、そのバージョンのコアが使用されます。 - -```bash -python run.py --voicevox_dir="/path/to/voicevox" -``` - -Mac では、`DYLD_LIBRARY_PATH`の指定が必要です。 - -```bash -DYLD_LIBRARY_PATH="/path/to/voicevox" python run.py --voicevox_dir="/path/to/voicevox" -``` - -##### 音声ライブラリを直接指定する - -[VOICEVOX Core の zip ファイル](https://github.com/VOICEVOX/voicevox_core/releases)を解凍したディレクトリを`--voicelib_dir`引数で指定します。 -また、コアのバージョンに合わせて、[libtorch](https://pytorch.org/)や[onnxruntime](https://github.com/microsoft/onnxruntime) (共有ライブラリ) のディレクトリを`--runtime_dir`引数で指定します。 -ただし、システムの探索パス上に libtorch、onnxruntime がある場合、`--runtime_dir`引数の指定は不要です。 -`--voicelib_dir`引数、`--runtime_dir`引数は複数回使用可能です。 -API エンドポイントでコアのバージョンを指定する場合は`core_version`引数を指定してください。(未指定の場合は最新のコアが使用されます) - -```bash -python run.py --voicelib_dir="/path/to/voicevox_core" --runtime_dir="/path/to/libtorch_or_onnx" -``` - -Mac では、`--runtime_dir`引数の代わりに`DYLD_LIBRARY_PATH`の指定が必要です。 - -```bash -DYLD_LIBRARY_PATH="/path/to/onnx" python run.py --voicelib_dir="/path/to/voicevox_core" -``` - -##### ユーザーディレクトリに配置する - -以下のディレクトリにある音声ライブラリは自動で読み込まれます。 - -- ビルド版: `/voicevox-engine/core_libraries/` -- Python 版: `/voicevox-engine-dev/core_libraries/` - -``は OS によって異なります。 - -- Windows: `C:\Users\\AppData\Local\` -- macOS: `/Users//Library/Application\ Support/` -- Linux: `/home//.local/share/` - -### ビルド - -`pyinstaller` を用いたパッケージ化と Dockerfile を用いたコンテナ化によりローカルでビルドが可能です。 -手順の詳細は [貢献者ガイド#ビルド](./CONTRIBUTING.md#ビルド) を御覧ください。 - -GitHub を用いる場合、fork したリポジトリで GitHub Actions によるビルドが可能です。 -Actions を ON にし、workflow_dispatch で`build-engine-package.yml`を起動すればビルドできます。 -成果物は Release にアップロードされます。 -ビルドに必要な GitHub Actions の設定は [貢献者ガイド#GitHub Actions](./CONTRIBUTING.md#github-actions) を御覧ください。 - -### テスト・静的解析 - -`pytest` を用いたテストと各種リンターを用いた静的解析が可能です。 -手順の詳細は [貢献者ガイド#テスト](./CONTRIBUTING.md#テスト), [貢献者ガイド#静的解析](./CONTRIBUTING.md#静的解析) を御覧ください。 - -### 依存関係 - -依存関係は `poetry` で管理されています。また、導入可能な依存ライブラリにはライセンス上の制約があります。 -詳細は [貢献者ガイド#パッケージ](./CONTRIBUTING.md#パッケージ) を御覧ください。 - -### マルチエンジン機能に関して - -VOICEVOX エディターでは、複数のエンジンを同時に起動することができます。 -この機能を利用することで、自作の音声合成エンジンや既存の音声合成エンジンを VOICEVOX エディター上で動かすことが可能です。 - - - -
- -#### マルチエンジン機能の仕組み - -VOICEVOX API に準拠した複数のエンジンの Web API をポートを分けて起動し、統一的に扱うことでマルチエンジン機能を実現しています。 -エディターがそれぞれのエンジンを実行バイナリ経由で起動し、EngineID と結びつけて設定や状態を個別管理します。 - -#### マルチエンジン機能への対応方法 - -VOICEVOX API 準拠エンジンを起動する実行バイナリを作ることで対応が可能です。 -VOICEVOX ENGINE リポジトリを fork し、一部の機能を改造するのが簡単です。 - -改造すべき点はエンジン情報・キャラクター情報・音声合成の3点です。 - -エンジンの情報はルート直下のマニフェストファイル(`engine_manifest.json`)で管理されています。 -この形式のマニフェストファイルは VOICEVOX API 準拠エンジンに必須です。 -マニフェストファイル内の情報を見て適宜変更してください。 -音声合成手法によっては、例えばモーフィング機能など、VOICEVOX と同じ機能を持つことができない場合があります。 -その場合はマニフェストファイル内の`supported_features`内の情報を適宜変更してください。 - -キャラクター情報は`resources/character_info`ディレクトリ内のファイルで管理されています。 -ダミーのアイコンなどが用意されているので適宜変更してください。 - -音声合成は`voicevox_engine/tts_pipeline/tts_engine.py`で行われています。 -VOICEVOX API での音声合成は、エンジン側で音声合成用のクエリ `AudioQuery` の初期値を作成してユーザーに返し、ユーザーが必要に応じてクエリを編集したあと、エンジンがクエリに従って音声合成することで実現しています。 -クエリ作成は`/audio_query`エンドポイントで、音声合成は`/synthesis`エンドポイントで行っており、最低この2つに対応すれば VOICEVOX API に準拠したことになります。 - -#### マルチエンジン機能対応エンジンの配布方法 - -VVPP ファイルとして配布するのがおすすめです。 -VVPP は「VOICEVOX プラグインパッケージ」の略で、中身はビルドしたエンジンなどを含んだディレクトリの Zip ファイルです。 -拡張子を`.vvpp`にすると、ダブルクリックで VOICEVOX エディターにインストールできます。 - -エディター側は受け取った VVPP ファイルをローカルディスク上に Zip 展開したあと、ルートの直下にある`engine_manifest.json`に従ってファイルを探査します。 -VOICEVOX エディターにうまく読み込ませられないときは、エディターのエラーログを参照してください。 - -また、`xxx.vvpp`は分割して連番を付けた`xxx.0.vvppp`ファイルとして配布することも可能です。 -これはファイル容量が大きくて配布が困難な場合に有用です。 - -
- -## 事例紹介 - -**[voicevox-client](https://github.com/voicevox-client) [@voicevox-client](https://github.com/voicevox-client)** ・・・ VOICEVOX ENGINE の各言語向け API ラッパー - -## ライセンス - -LGPL v3 と、ソースコードの公開が不要な別ライセンスのデュアルライセンスです。 -別ライセンスを取得したい場合は、ヒホに求めてください。 -X アカウント: [@hiho_karuta](https://x.com/hiho_karuta) diff --git "a/voicevox_engine/docs/VOICEVOX\351\237\263\345\243\260\345\220\210\346\210\220\343\202\250\343\203\263\343\202\270\343\203\263\343\201\250\343\201\256\351\200\243\346\220\272.md" "b/voicevox_engine/docs/VOICEVOX\351\237\263\345\243\260\345\220\210\346\210\220\343\202\250\343\203\263\343\202\270\343\203\263\343\201\250\343\201\256\351\200\243\346\220\272.md" deleted file mode 100644 index 33ad31397ff9566988816965bd78f262ecc78775..0000000000000000000000000000000000000000 --- "a/voicevox_engine/docs/VOICEVOX\351\237\263\345\243\260\345\220\210\346\210\220\343\202\250\343\203\263\343\202\270\343\203\263\343\201\250\343\201\256\351\200\243\346\220\272.md" +++ /dev/null @@ -1,8 +0,0 @@ -メモ書き程度ですが、どういう方針で開発を進めているかを紹介します。 - -- バージョンが上がっても、`/audio_query`で返ってくる値をそのまま`/synthesis`に POST すれば音声合成できるようにする予定です - - `AudioQuery`のパラメータは増えますが、なるべくデフォルト値で以前と変わらない音声が生成されるようにします - - 以前のバージョンの`AudioQuery`を新しいバージョンの`/synthesis`にそのまま POST できるようにします(後方互換) -- バージョン 0.7 から音声スタイルが実装されました。スタイルの情報は`/speakers`及び`/singers`から取得できます - - スタイルの情報にある`style_id`を`speaker`に指定することで、今まで通り音声合成ができます - - `style_id`の指定先が`speaker`なのは互換性のためです diff --git a/voicevox_engine/docs/api/.gitkeep b/voicevox_engine/docs/api/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git "a/voicevox_engine/docs/res/\343\203\236\343\203\253\343\203\201\343\202\250\343\203\263\343\202\270\343\203\263\346\246\202\345\277\265\345\233\263.svg" "b/voicevox_engine/docs/res/\343\203\236\343\203\253\343\203\201\343\202\250\343\203\263\343\202\270\343\203\263\346\246\202\345\277\265\345\233\263.svg" deleted file mode 100644 index 479b701f0653439dbd334f252e027b18e9e4cc11..0000000000000000000000000000000000000000 --- "a/voicevox_engine/docs/res/\343\203\236\343\203\253\343\203\201\343\202\250\343\203\263\343\202\270\343\203\263\346\246\202\345\277\265\345\233\263.svg" +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git "a/voicevox_engine/docs/\343\203\252\343\202\275\343\203\274\343\202\271\343\203\225\343\202\241\343\202\244\343\203\253\343\201\256URL\343\201\250filemap.md" "b/voicevox_engine/docs/\343\203\252\343\202\275\343\203\274\343\202\271\343\203\225\343\202\241\343\202\244\343\203\253\343\201\256URL\343\201\250filemap.md" deleted file mode 100644 index ee743043d799821dbf9a697bfec73d1bf2b0a68a..0000000000000000000000000000000000000000 --- "a/voicevox_engine/docs/\343\203\252\343\202\275\343\203\274\343\202\271\343\203\225\343\202\241\343\202\244\343\203\253\343\201\256URL\343\201\250filemap.md" +++ /dev/null @@ -1,72 +0,0 @@ -# リソースファイルの URL の仕様について - -VOICEVOX ENGINE では一部のリソースファイルを URL として返します。 -リソースファイルを更新しても URL が同じ場合、キャッシュが働いて新しいリソースを取得できないことがあります。 -これを防ぐためにリソースファイルのハッシュ値を URL に含め、リソースの変更の度に URL が変わるようにしています。 - -ResourceManager はファイルとハッシュの対応を管理します。 -filemap.json はファイルとハッシュを予め対応付けたファイルです。 -generate_filemap.py は filemap.json の作成を行います。 - -## ResourceManager - -`filemap.json`にあるリソースファイルを登録できます。 -初期化時に`create_filemap_if_not_exist`を`True`にすると`filemap.json`がないディレクトリの登録ができます。 - -細かい仕様は ResourceManager のドキュメントと実装を確認してください。 - -## filemap.json - -`filemap.json`のキーは、登録するディレクトリからリソースファイルへの相対パスです。 -パス区切り文字は互換性のため`/`である必要があります。 - -値は登録するファイルを一意に識別できるハッシュ等の文字列です。 -`generate_filemap.py`は sha256 ハッシュを生成します。 - -### 例 - -#### デイレクトリ構造 - -``` -登録ディレクトリ/ -├── filemap.json -├── dir_1/ -│ ├── 登録ファイル.png -│ ├── samples/ -│ │ └── 登録ファイル.wav -│ └── 非登録ファイル1.txt -└── dir_2/ - ├── 登録ファイル.png - ├── samples/ - │ └── 登録ファイル.wav - └── 非登録ファイル1.txt -``` - -#### filemap.json - -```json -{ - "dir_1/登録ファイル.png": "HASH-1", - "dir_1/samples/登録ファイル.wav": "HASH-2", - "dir_2/登録ファイル.png": "HASH-3", - "dir_2/samples/登録ファイル.wav": "HASH-4" -} -``` - -## generate_filemap.py - -`filemap.json`を生成するためのスクリプトです。 -デフォルトでは png ファイルと wav ファイルのみを登録します。 - -### 例 - -```bash -python tools/generate_filemap.py --target_dir resources/character_info -``` - -png と wav に加えて jpg ファイルを登録する例 - -```bash -python tools/generate_filemap.py --target_dir resources/character_info \ - --target_suffix png --target_suffix wav --target_suffix jpg -``` diff --git "a/voicevox_engine/docs/\347\224\250\350\252\236\351\233\206.md" "b/voicevox_engine/docs/\347\224\250\350\252\236\351\233\206.md" deleted file mode 100644 index c89511955ec59d49bcb3d976fedcf0af7153cb52..0000000000000000000000000000000000000000 --- "a/voicevox_engine/docs/\347\224\250\350\252\236\351\233\206.md" +++ /dev/null @@ -1,42 +0,0 @@ -# 用語集 - -エンジン内で用いられている用語をまとめています。 -随時追加予定です。お気軽に追加プルリクエストを送ってください! - - - -## ドメイン用語 - -TODO: ユーザー向けに案内されている用語をまとめる - -## エンジン周り - -TODO - -## OpenJTalk 周り - -### フルコンテキストラベル: full-context label - -文章構造を解析して得たデータを音素ごとにまとめたもの。あるいはその集合。 -何の音素か、何番目のモーラか、何番目のアクセント句なのかといった情報が含まれる。 -HTS の概念。 - -### ラベル: label - -1つの音素のフルコンテキストラベルのこと。 -VOICEVOX 独自の定義(OpenJTalk 内ではフルコンテキストラベルを指してラベルと呼んでいる)。 - -### コンテキスト: context - -フルコンテキスト内の1つの要素のこと。 -VOICEVOX 独自の定義。 - -### feature - -ラベルを1行の文字列にしたもの。 -OpenJTalk の概念。 diff --git a/voicevox_engine/engine_manifest.json b/voicevox_engine/engine_manifest.json deleted file mode 100644 index fb838508025d27f3028b08b904c5316e53a6bf57..0000000000000000000000000000000000000000 --- a/voicevox_engine/engine_manifest.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "manifest_version": "0.13.1", - "name": "VOICEVOX Engine", - "brand_name": "VOICEVOX", - "uuid": "c7b58856-bd56-4aa1-afb7-b8415f824b06", - "version": "0.19.1", - "url": "https://github.com/VOICEVOX/voicevox_engine", - "command": "run", - "port": 50021, - "icon": "resources/engine_manifest_assets/icon.png", - "default_sampling_rate": 24000, - "frame_rate": 93.75, - "terms_of_service": "resources/engine_manifest_assets/terms_of_service.md", - "update_infos": "resources/engine_manifest_assets/update_infos.json", - "dependency_licenses": "resources/engine_manifest_assets/dependency_licenses.json", - "supported_features": { - "adjust_mora_pitch": { - "type": "bool", - "value": true, - "name": "モーラごとの音高の調整" - }, - "adjust_phoneme_length": { - "type": "bool", - "value": true, - "name": "音素ごとの長さの調整" - }, - "adjust_speed_scale": { - "type": "bool", - "value": true, - "name": "全体の話速の調整" - }, - "adjust_pitch_scale": { - "type": "bool", - "value": true, - "name": "全体の音高の調整" - }, - "adjust_intonation_scale": { - "type": "bool", - "value": true, - "name": "全体の抑揚の調整" - }, - "adjust_volume_scale": { - "type": "bool", - "value": true, - "name": "全体の音量の調整" - }, - "adjust_pause_length": { - "type": "bool", - "value": true, - "name": "句読点などの無音時間の調整" - }, - "interrogative_upspeak": { - "type": "bool", - "value": true, - "name": "疑問文の自動調整" - }, - "synthesis_morphing" : { - "type": "bool", - "value": true, - "name": "2種類のスタイルでモーフィングした音声を合成" - }, - "sing" : { - "type": "bool", - "value": true, - "name": "歌唱音声合成" - }, - "manage_library": { - "type": "bool", - "value": true, - "name": "音声ライブラリのインストール・アンインストール" - }, - "return_resource_url":{ - "type":"bool", - "value":true, - "name": "speaker_info・singer_infoのリソースをURLで返送" - } - } -} diff --git a/voicevox_engine/poetry.lock b/voicevox_engine/poetry.lock deleted file mode 100644 index 09e4325483da9985ddc0430e3f77b4bc27f82afe..0000000000000000000000000000000000000000 --- a/voicevox_engine/poetry.lock +++ /dev/null @@ -1,2752 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. - -[[package]] -name = "altgraph" -version = "0.17.4" -description = "Python graph (network) package" -optional = false -python-versions = "*" -files = [ - {file = "altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff"}, - {file = "altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406"}, -] - -[[package]] -name = "annotated-types" -version = "0.6.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, -] - -[[package]] -name = "anyio" -version = "4.3.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - -[[package]] -name = "attrs" -version = "23.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] - -[[package]] -name = "authlib" -version = "1.3.0" -description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." -optional = false -python-versions = ">=3.8" -files = [ - {file = "Authlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:9637e4de1fb498310a56900b3e2043a206b03cb11c05422014b0302cbc814be3"}, - {file = "Authlib-1.3.0.tar.gz", hash = "sha256:959ea62a5b7b5123c5059758296122b57cd2585ae2ed1c0622c21b371ffdae06"}, -] - -[package.dependencies] -cryptography = "*" - -[[package]] -name = "black" -version = "24.4.2" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -files = [ - {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, - {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, - {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, - {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, - {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, - {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, - {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, - {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, - {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, - {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, - {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, - {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, - {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, - {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, - {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, - {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, - {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, - {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, - {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, - {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, - {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, - {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "build" -version = "1.2.1" -description = "A simple, correct Python build frontend" -optional = false -python-versions = ">=3.8" -files = [ - {file = "build-1.2.1-py3-none-any.whl", hash = "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4"}, - {file = "build-1.2.1.tar.gz", hash = "sha256:526263f4870c26f26c433545579475377b2b7588b6f1eac76a001e873ae3e19d"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "os_name == \"nt\""} -packaging = ">=19.1" -pyproject_hooks = "*" - -[package.extras] -docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] -test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"] -typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"] -uv = ["uv (>=0.1.18)"] -virtualenv = ["virtualenv (>=20.0.35)"] - -[[package]] -name = "cachecontrol" -version = "0.14.0" -description = "httplib2 caching for requests" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachecontrol-0.14.0-py3-none-any.whl", hash = "sha256:f5bf3f0620c38db2e5122c0726bdebb0d16869de966ea6a2befe92470b740ea0"}, - {file = "cachecontrol-0.14.0.tar.gz", hash = "sha256:7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938"}, -] - -[package.dependencies] -filelock = {version = ">=3.8.0", optional = true, markers = "extra == \"filecache\""} -msgpack = ">=0.5.2,<2.0.0" -requests = ">=2.16.0" - -[package.extras] -dev = ["CacheControl[filecache,redis]", "black", "build", "cherrypy", "furo", "mypy", "pytest", "pytest-cov", "sphinx", "sphinx-copybutton", "tox", "types-redis", "types-requests"] -filecache = ["filelock (>=3.8.0)"] -redis = ["redis (>=2.10.5)"] - -[[package]] -name = "certifi" -version = "2024.2.2" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, -] - -[[package]] -name = "cffi" -version = "1.16.0" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "cfgv" -version = "3.4.0" -description = "Validate configuration and produce human readable error messages." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, - {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "cleo" -version = "2.1.0" -description = "Cleo allows you to create beautiful and testable command-line interfaces." -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "cleo-2.1.0-py3-none-any.whl", hash = "sha256:4a31bd4dd45695a64ee3c4758f583f134267c2bc518d8ae9a29cf237d009b07e"}, - {file = "cleo-2.1.0.tar.gz", hash = "sha256:0b2c880b5d13660a7ea651001fb4acb527696c01f15c9ee650f377aa543fd523"}, -] - -[package.dependencies] -crashtest = ">=0.4.1,<0.5.0" -rapidfuzz = ">=3.0.0,<4.0.0" - -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "colorlog" -version = "4.8.0" -description = "Log formatting with colors!" -optional = false -python-versions = "*" -files = [ - {file = "colorlog-4.8.0-py2.py3-none-any.whl", hash = "sha256:3dd15cb27e8119a24c1a7b5c93f9f3b455855e0f73993b1c25921b2f646f1dcd"}, - {file = "colorlog-4.8.0.tar.gz", hash = "sha256:59b53160c60902c405cdec28d38356e09d40686659048893e026ecbd589516b1"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} - -[[package]] -name = "coverage" -version = "6.5.0" -description = "Code coverage measurement for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, - {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, - {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, - {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, - {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, - {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, - {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, - {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, - {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, - {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, - {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, - {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, - {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, - {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, - {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, - {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, - {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, - {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, - {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, - {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, -] - -[package.extras] -toml = ["tomli"] - -[[package]] -name = "coveralls" -version = "3.3.1" -description = "Show coverage stats online via coveralls.io" -optional = false -python-versions = ">= 3.5" -files = [ - {file = "coveralls-3.3.1-py2.py3-none-any.whl", hash = "sha256:f42015f31d386b351d4226389b387ae173207058832fbf5c8ec4b40e27b16026"}, - {file = "coveralls-3.3.1.tar.gz", hash = "sha256:b32a8bb5d2df585207c119d6c01567b81fba690c9c10a753bfe27a335bfc43ea"}, -] - -[package.dependencies] -coverage = ">=4.1,<6.0.dev0 || >6.1,<6.1.1 || >6.1.1,<7.0" -docopt = ">=0.6.1" -requests = ">=1.0.0" - -[package.extras] -yaml = ["PyYAML (>=3.10)"] - -[[package]] -name = "crashtest" -version = "0.4.1" -description = "Manage Python errors with ease" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5"}, - {file = "crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce"}, -] - -[[package]] -name = "cryptography" -version = "42.0.7" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, -] - -[package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] -test-randomorder = ["pytest-randomly"] - -[[package]] -name = "cython" -version = "3.0.10" -description = "The Cython compiler for writing C extensions in the Python language." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "Cython-3.0.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e876272548d73583e90babda94c1299537006cad7a34e515a06c51b41f8657aa"}, - {file = "Cython-3.0.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adc377aa33c3309191e617bf675fdbb51ca727acb9dc1aa23fc698d8121f7e23"}, - {file = "Cython-3.0.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:401aba1869a57aba2922ccb656a6320447e55ace42709b504c2f8e8b166f46e1"}, - {file = "Cython-3.0.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:541fbe725d6534a90b93f8c577eb70924d664b227a4631b90a6e0506d1469591"}, - {file = "Cython-3.0.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:86998b01f6a6d48398df8467292c7637e57f7e3a2ca68655367f13f66fed7734"}, - {file = "Cython-3.0.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d092c0ddba7e9e530a5c5be4ac06db8360258acc27675d1fc86294a5dc8994c5"}, - {file = "Cython-3.0.10-cp310-cp310-win32.whl", hash = "sha256:3cffb666e649dba23810732497442fb339ee67ba4e0be1f0579991e83fcc2436"}, - {file = "Cython-3.0.10-cp310-cp310-win_amd64.whl", hash = "sha256:9ea31184c7b3a728ef1f81fccb161d8948c05aa86c79f63b74fb6f3ddec860ec"}, - {file = "Cython-3.0.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:051069638abfb076900b0c2bcb6facf545655b3f429e80dd14365192074af5a4"}, - {file = "Cython-3.0.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:712760879600907189c7d0d346851525545484e13cd8b787e94bfd293da8ccf0"}, - {file = "Cython-3.0.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38d40fa1324ac47c04483d151f5e092406a147eac88a18aec789cf01c089c3f2"}, - {file = "Cython-3.0.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bd49a3a9fdff65446a3e1c2bfc0ec85c6ce4c3cad27cd4ad7ba150a62b7fb59"}, - {file = "Cython-3.0.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e8df79b596633b8295eaa48b1157d796775c2bb078f32267d32f3001b687f2fd"}, - {file = "Cython-3.0.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bcc9795990e525c192bc5c0775e441d7d56d7a7d02210451e9e13c0448dba51b"}, - {file = "Cython-3.0.10-cp311-cp311-win32.whl", hash = "sha256:09f2000041db482cad3bfce94e1fa3a4c82b0e57390a164c02566cbbda8c4f12"}, - {file = "Cython-3.0.10-cp311-cp311-win_amd64.whl", hash = "sha256:3919a55ec9b6c7db6f68a004c21c05ed540c40dbe459ced5d801d5a1f326a053"}, - {file = "Cython-3.0.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8f2864ab5fcd27a346f0b50f901ebeb8f60b25a60a575ccfd982e7f3e9674914"}, - {file = "Cython-3.0.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:407840c56385b9c085826fe300213e0e76ba15d1d47daf4b58569078ecb94446"}, - {file = "Cython-3.0.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a036d00caa73550a3a976432ef21c1e3fa12637e1616aab32caded35331ae96"}, - {file = "Cython-3.0.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc6a0e7e23a96dec3f3c9d39690d4281beabd5297855140d0d30855f950275e"}, - {file = "Cython-3.0.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a5e14a8c6a8157d2b0cdc2e8e3444905d20a0e78e19d2a097e89fb8b04b51f6b"}, - {file = "Cython-3.0.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f8a2b8fa0fd8358bccb5f3304be563c4750aae175100463d212d5ea0ec74cbe0"}, - {file = "Cython-3.0.10-cp312-cp312-win32.whl", hash = "sha256:2d29e617fd23cf4b83afe8f93f2966566c9f565918ad1e86a4502fe825cc0a79"}, - {file = "Cython-3.0.10-cp312-cp312-win_amd64.whl", hash = "sha256:6c5af936940a38c300977b81598d9c0901158f220a58c177820e17e1774f1cf1"}, - {file = "Cython-3.0.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5f465443917d5c0f69825fca3b52b64c74ac3de0143b1fff6db8ba5b48c9fb4a"}, - {file = "Cython-3.0.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fadb84193c25641973666e583df8df4e27c52cdc05ddce7c6f6510d690ba34a"}, - {file = "Cython-3.0.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fa9e7786083b6aa61594c16979d621b62e61fcd9c2edd4761641b95c7fb34b2"}, - {file = "Cython-3.0.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4780d0f98ce28191c4d841c4358b5d5e79d96520650910cd59904123821c52d"}, - {file = "Cython-3.0.10-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:32fbad02d1189be75eb96456d9c73f5548078e5338d8fa153ecb0115b6ee279f"}, - {file = "Cython-3.0.10-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:90e2f514fc753b55245351305a399463103ec18666150bb1c36779b9862388e9"}, - {file = "Cython-3.0.10-cp36-cp36m-win32.whl", hash = "sha256:a9c976e9ec429539a4367cb4b24d15a1e46b925976f4341143f49f5f161171f5"}, - {file = "Cython-3.0.10-cp36-cp36m-win_amd64.whl", hash = "sha256:a9bb402674788a7f4061aeef8057632ec440123e74ed0fb425308a59afdfa10e"}, - {file = "Cython-3.0.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:206e803598010ecc3813db8748ed685f7beeca6c413f982df9f8a505fce56563"}, - {file = "Cython-3.0.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15b6d397f4ee5ad54e373589522af37935a32863f1b23fa8c6922adf833e28e2"}, - {file = "Cython-3.0.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a181144c2f893ed8e6a994d43d0b96300bc99873f21e3b7334ca26c61c37b680"}, - {file = "Cython-3.0.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b74b700d6a793113d03fb54b63bdbadba6365379424bac7c0470605672769260"}, - {file = "Cython-3.0.10-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:076e9fd4e0ca33c5fa00a7479180dbfb62f17fe928e2909f82da814536e96d2b"}, - {file = "Cython-3.0.10-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:269f06e6961e8591d56e30b46e1a51b6ccb42cab04c29fa3b30d3e8723485fb4"}, - {file = "Cython-3.0.10-cp37-cp37m-win32.whl", hash = "sha256:d4e83a8ceff7af60064da4ccfce0ac82372544dd5392f1b350c34f1b04d0fae6"}, - {file = "Cython-3.0.10-cp37-cp37m-win_amd64.whl", hash = "sha256:40fac59c3a7fbcd9c25aea64c342c890a5e2270ce64a1525e840807800167799"}, - {file = "Cython-3.0.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f43a58bf2434870d2fc42ac2e9ff8138c9e00c6251468de279d93fa279e9ba3b"}, - {file = "Cython-3.0.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e9a885ec63d3955a08cefc4eec39fefa9fe14989c6e5e2382bd4aeb6bdb9bc3"}, - {file = "Cython-3.0.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acfbe0fff364d54906058fc61f2393f38cd7fa07d344d80923937b87e339adcf"}, - {file = "Cython-3.0.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8adcde00a8a88fab27509b558cd8c2959ab0c70c65d3814cfea8c68b83fa6dcd"}, - {file = "Cython-3.0.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2c9c1e3e78909488f3b16fabae02308423fa6369ed96ab1e250807d344cfffd7"}, - {file = "Cython-3.0.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc6e0faf5b57523b073f0cdefadcaef3a51235d519a0594865925cadb3aeadf0"}, - {file = "Cython-3.0.10-cp38-cp38-win32.whl", hash = "sha256:35f6ede7c74024ed1982832ae61c9fad7cf60cc3f5b8c6a63bb34e38bc291936"}, - {file = "Cython-3.0.10-cp38-cp38-win_amd64.whl", hash = "sha256:950c0c7b770d2a7cec74fb6f5ccc321d0b51d151f48c075c0d0db635a60ba1b5"}, - {file = "Cython-3.0.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:077b61ee789e48700e25d4a16daa4258b8e65167136e457174df400cf9b4feab"}, - {file = "Cython-3.0.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f1f8bba9d8f37c0cffc934792b4ac7c42d0891077127c11deebe9fa0a0f7e4"}, - {file = "Cython-3.0.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:651a15a8534ebfb9b58cb0b87c269c70984b6f9c88bfe65e4f635f0e3f07dfcd"}, - {file = "Cython-3.0.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d10fc9aa82e5e53a0b7fd118f9771199cddac8feb4a6d8350b7d4109085aa775"}, - {file = "Cython-3.0.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f610964ab252a83e573a427e28b103e2f1dd3c23bee54f32319f9e73c3c5499"}, - {file = "Cython-3.0.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c9c4c4f3ab8f8c02817b0e16e8fa7b8cc880f76e9b63fe9c010e60c1a6c2b13"}, - {file = "Cython-3.0.10-cp39-cp39-win32.whl", hash = "sha256:0bac3ccdd4e03924028220c62ae3529e17efa8ca7e9df9330de95de02f582b26"}, - {file = "Cython-3.0.10-cp39-cp39-win_amd64.whl", hash = "sha256:81f356c1c8c0885b8435bfc468025f545c5d764aa9c75ab662616dd1193c331e"}, - {file = "Cython-3.0.10-py2.py3-none-any.whl", hash = "sha256:fcbb679c0b43514d591577fd0d20021c55c240ca9ccafbdb82d3fb95e5edfee2"}, - {file = "Cython-3.0.10.tar.gz", hash = "sha256:dcc96739331fb854dcf503f94607576cfe8488066c61ca50dfd55836f132de99"}, -] - -[[package]] -name = "dacite" -version = "1.8.1" -description = "Simple creation of data classes from dictionaries." -optional = false -python-versions = ">=3.6" -files = [ - {file = "dacite-1.8.1-py3-none-any.whl", hash = "sha256:cc31ad6fdea1f49962ea42db9421772afe01ac5442380d9a99fcf3d188c61afe"}, -] - -[package.extras] -dev = ["black", "coveralls", "mypy", "pre-commit", "pylint", "pytest (>=5)", "pytest-benchmark", "pytest-cov"] - -[[package]] -name = "distlib" -version = "0.3.8" -description = "Distribution utilities" -optional = false -python-versions = "*" -files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, -] - -[[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" -optional = false -python-versions = "*" -files = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] - -[[package]] -name = "dparse" -version = "0.6.4b0" -description = "A parser for Python dependency files" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dparse-0.6.4b0-py3-none-any.whl", hash = "sha256:592ff183348b8a5ea0a18442a7965e29445d3a26063654ec2c7e8ef42cd5753c"}, - {file = "dparse-0.6.4b0.tar.gz", hash = "sha256:f8d49b41a527f3d16a269f854e6665245b325e50e41d2c213810cb984553e5c8"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -all = ["dparse[conda]", "dparse[pipenv]", "dparse[poetry]"] -conda = ["pyyaml"] -pipenv = ["pipenv"] -poetry = ["poetry"] - -[[package]] -name = "dulwich" -version = "0.21.7" -description = "Python Git Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4c0110798099bb7d36a110090f2688050703065448895c4f53ade808d889dd3"}, - {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2bc12697f0918bee324c18836053644035362bb3983dc1b210318f2fed1d7132"}, - {file = "dulwich-0.21.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:471305af74790827fcbafe330fc2e8bdcee4fb56ca1177c8c481b1c8f806c4a4"}, - {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d54c9d0e845be26f65f954dff13a1cd3f2b9739820c19064257b8fd7435ab263"}, - {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12d61334a575474e707614f2e93d6ed4cdae9eb47214f9277076d9e5615171d3"}, - {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e274cebaf345f0b1e3b70197f2651de92b652386b68020cfd3bf61bc30f6eaaa"}, - {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:817822f970e196e757ae01281ecbf21369383285b9f4a83496312204cf889b8c"}, - {file = "dulwich-0.21.7-cp310-cp310-win32.whl", hash = "sha256:7836da3f4110ce684dcd53489015fb7fa94ed33c5276e3318b8b1cbcb5b71e08"}, - {file = "dulwich-0.21.7-cp310-cp310-win_amd64.whl", hash = "sha256:4a043b90958cec866b4edc6aef5fe3c2c96a664d0b357e1682a46f6c477273c4"}, - {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ce8db196e79c1f381469410d26fb1d8b89c6b87a4e7f00ff418c22a35121405c"}, - {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:62bfb26bdce869cd40be443dfd93143caea7089b165d2dcc33de40f6ac9d812a"}, - {file = "dulwich-0.21.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c01a735b9a171dcb634a97a3cec1b174cfbfa8e840156870384b633da0460f18"}, - {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa4d14767cf7a49c9231c2e52cb2a3e90d0c83f843eb6a2ca2b5d81d254cf6b9"}, - {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bca4b86e96d6ef18c5bc39828ea349efb5be2f9b1f6ac9863f90589bac1084d"}, - {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7b5624b02ef808cdc62dabd47eb10cd4ac15e8ac6df9e2e88b6ac6b40133673"}, - {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3a539b4696a42fbdb7412cb7b66a4d4d332761299d3613d90a642923c7560e1"}, - {file = "dulwich-0.21.7-cp311-cp311-win32.whl", hash = "sha256:675a612ce913081beb0f37b286891e795d905691dfccfb9bf73721dca6757cde"}, - {file = "dulwich-0.21.7-cp311-cp311-win_amd64.whl", hash = "sha256:460ba74bdb19f8d498786ae7776745875059b1178066208c0fd509792d7f7bfc"}, - {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4c51058ec4c0b45dc5189225b9e0c671b96ca9713c1daf71d622c13b0ab07681"}, - {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4bc4c5366eaf26dda3fdffe160a3b515666ed27c2419f1d483da285ac1411de0"}, - {file = "dulwich-0.21.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a0650ec77d89cb947e3e4bbd4841c96f74e52b4650830112c3057a8ca891dc2f"}, - {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f18f0a311fb7734b033a3101292b932158cade54b74d1c44db519e42825e5a2"}, - {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c589468e5c0cd84e97eb7ec209ab005a2cb69399e8c5861c3edfe38989ac3a8"}, - {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d62446797163317a397a10080c6397ffaaca51a7804c0120b334f8165736c56a"}, - {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e84cc606b1f581733df4350ca4070e6a8b30be3662bbb81a590b177d0c996c91"}, - {file = "dulwich-0.21.7-cp312-cp312-win32.whl", hash = "sha256:c3d1685f320907a52c40fd5890627945c51f3a5fa4bcfe10edb24fec79caadec"}, - {file = "dulwich-0.21.7-cp312-cp312-win_amd64.whl", hash = "sha256:6bd69921fdd813b7469a3c77bc75c1783cc1d8d72ab15a406598e5a3ba1a1503"}, - {file = "dulwich-0.21.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d8ab29c660125db52106775caa1f8f7f77a69ed1fe8bc4b42bdf115731a25bf"}, - {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0d2e4485b98695bf95350ce9d38b1bb0aaac2c34ad00a0df789aa33c934469b"}, - {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e138d516baa6b5bafbe8f030eccc544d0d486d6819b82387fc0e285e62ef5261"}, - {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f34bf9b9fa9308376263fd9ac43143c7c09da9bc75037bb75c6c2423a151b92c"}, - {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e2c66888207b71cd1daa2acb06d3984a6bc13787b837397a64117aa9fc5936a"}, - {file = "dulwich-0.21.7-cp37-cp37m-win32.whl", hash = "sha256:10893105c6566fc95bc2a67b61df7cc1e8f9126d02a1df6a8b2b82eb59db8ab9"}, - {file = "dulwich-0.21.7-cp37-cp37m-win_amd64.whl", hash = "sha256:460b3849d5c3d3818a80743b4f7a0094c893c559f678e56a02fff570b49a644a"}, - {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74700e4c7d532877355743336c36f51b414d01e92ba7d304c4f8d9a5946dbc81"}, - {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c92e72c43c9e9e936b01a57167e0ea77d3fd2d82416edf9489faa87278a1cdf7"}, - {file = "dulwich-0.21.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d097e963eb6b9fa53266146471531ad9c6765bf390849230311514546ed64db2"}, - {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:808e8b9cc0aa9ac74870b49db4f9f39a52fb61694573f84b9c0613c928d4caf8"}, - {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1957b65f96e36c301e419d7adaadcff47647c30eb072468901bb683b1000bc5"}, - {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4b09bc3a64fb70132ec14326ecbe6e0555381108caff3496898962c4136a48c6"}, - {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5882e70b74ac3c736a42d3fdd4f5f2e6570637f59ad5d3e684760290b58f041"}, - {file = "dulwich-0.21.7-cp38-cp38-win32.whl", hash = "sha256:29bb5c1d70eba155ded41ed8a62be2f72edbb3c77b08f65b89c03976292f6d1b"}, - {file = "dulwich-0.21.7-cp38-cp38-win_amd64.whl", hash = "sha256:25c3ab8fb2e201ad2031ddd32e4c68b7c03cb34b24a5ff477b7a7dcef86372f5"}, - {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8929c37986c83deb4eb500c766ee28b6670285b512402647ee02a857320e377c"}, - {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc1e11be527ac06316539b57a7688bcb1b6a3e53933bc2f844397bc50734e9ae"}, - {file = "dulwich-0.21.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fc3078a1ba04c588fabb0969d3530efd5cd1ce2cf248eefb6baf7cbc15fc285"}, - {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40dcbd29ba30ba2c5bfbab07a61a5f20095541d5ac66d813056c122244df4ac0"}, - {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8869fc8ec3dda743e03d06d698ad489b3705775fe62825e00fa95aa158097fc0"}, - {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d96ca5e0dde49376fbcb44f10eddb6c30284a87bd03bb577c59bb0a1f63903fa"}, - {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0064363bd5e814359657ae32517fa8001e8573d9d040bd997908d488ab886ed"}, - {file = "dulwich-0.21.7-cp39-cp39-win32.whl", hash = "sha256:869eb7be48243e695673b07905d18b73d1054a85e1f6e298fe63ba2843bb2ca1"}, - {file = "dulwich-0.21.7-cp39-cp39-win_amd64.whl", hash = "sha256:404b8edeb3c3a86c47c0a498699fc064c93fa1f8bab2ffe919e8ab03eafaaad3"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e598d743c6c0548ebcd2baf94aa9c8bfacb787ea671eeeb5828cfbd7d56b552f"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a2d76c96426e791556836ef43542b639def81be4f1d6d4322cd886c115eae1"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6c88acb60a1f4d31bd6d13bfba465853b3df940ee4a0f2a3d6c7a0778c705b7"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ecd315847dea406a4decfa39d388a2521e4e31acde3bd9c2609c989e817c6d62"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d05d3c781bc74e2c2a2a8f4e4e2ed693540fbe88e6ac36df81deac574a6dad99"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6de6f8de4a453fdbae8062a6faa652255d22a3d8bce0cd6d2d6701305c75f2b3"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e25953c7acbbe4e19650d0225af1c0c0e6882f8bddd2056f75c1cc2b109b88ad"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4637cbd8ed1012f67e1068aaed19fcc8b649bcf3e9e26649826a303298c89b9d"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:858842b30ad6486aacaa607d60bab9c9a29e7c59dc2d9cb77ae5a94053878c08"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739b191f61e1c4ce18ac7d520e7a7cbda00e182c3489552408237200ce8411ad"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:274c18ec3599a92a9b67abaf110e4f181a4f779ee1aaab9e23a72e89d71b2bd9"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2590e9b431efa94fc356ae33b38f5e64f1834ec3a94a6ac3a64283b206d07aa3"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed60d1f610ef6437586f7768254c2a93820ccbd4cfdac7d182cf2d6e615969bb"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8278835e168dd097089f9e53088c7a69c6ca0841aef580d9603eafe9aea8c358"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffc27fb063f740712e02b4d2f826aee8bbed737ed799962fef625e2ce56e2d29"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61e3451bd3d3844f2dca53f131982553be4d1b1e1ebd9db701843dd76c4dba31"}, - {file = "dulwich-0.21.7.tar.gz", hash = "sha256:a9e9c66833cea580c3ac12927e4b9711985d76afca98da971405d414de60e968"}, -] - -[package.dependencies] -urllib3 = ">=1.25" - -[package.extras] -fastimport = ["fastimport"] -https = ["urllib3 (>=1.24.1)"] -paramiko = ["paramiko"] -pgp = ["gpg"] - -[[package]] -name = "fastapi-slim" -version = "0.111.0" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -optional = false -python-versions = ">=3.8" -files = [ - {file = "fastapi_slim-0.111.0-py3-none-any.whl", hash = "sha256:6e4b04a555496e5a2590031fcae3ef8e364ad4901b340033e2e1d8136471aca2"}, - {file = "fastapi_slim-0.111.0.tar.gz", hash = "sha256:100720e4362ec4de97dee83a579b970e79fb5bf48073b37c9ce9b0e63dda4bec"}, -] - -[package.dependencies] -pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.37.2,<0.38.0" -typing-extensions = ">=4.8.0" - -[package.extras] -all = ["email_validator (>=2.0.0)", "fastapi-cli (>=0.0.2)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -standard = ["email_validator (>=2.0.0)", "fastapi-cli (>=0.0.2)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.7)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] - -[[package]] -name = "fastjsonschema" -version = "2.19.1" -description = "Fastest Python implementation of JSON schema" -optional = false -python-versions = "*" -files = [ - {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, - {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, -] - -[package.extras] -devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] - -[[package]] -name = "filelock" -version = "3.14.0" -description = "A platform independent file lock." -optional = false -python-versions = ">=3.8" -files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, -] - -[package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] -typing = ["typing-extensions (>=4.8)"] - -[[package]] -name = "flake8" -version = "7.0.0" -description = "the modular source code checker: pep8 pyflakes and co" -optional = false -python-versions = ">=3.8.1" -files = [ - {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, - {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, -] - -[package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.11.0,<2.12.0" -pyflakes = ">=3.2.0,<3.3.0" - -[[package]] -name = "flake8-bugbear" -version = "24.4.26" -description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." -optional = false -python-versions = ">=3.8.1" -files = [ - {file = "flake8_bugbear-24.4.26-py3-none-any.whl", hash = "sha256:cb430dd86bc821d79ccc0b030789a9c87a47a369667f12ba06e80f11305e8258"}, - {file = "flake8_bugbear-24.4.26.tar.gz", hash = "sha256:ff8d4ba5719019ebf98e754624c30c05cef0dadcf18a65d91c7567300e52a130"}, -] - -[package.dependencies] -attrs = ">=19.2.0" -flake8 = ">=6.0.0" - -[package.extras] -dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest", "tox"] - -[[package]] -name = "gitdb" -version = "4.0.11" -description = "Git Object Database" -optional = false -python-versions = ">=3.7" -files = [ - {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, - {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, -] - -[package.dependencies] -smmap = ">=3.0.1,<6" - -[[package]] -name = "gitpython" -version = "3.1.43" -description = "GitPython is a Python library used to interact with Git repositories" -optional = false -python-versions = ">=3.7" -files = [ - {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, - {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, -] - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[package.extras] -doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] -test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.5" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] - -[[package]] -name = "httpx" -version = "0.27.0" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "identify" -version = "2.5.36" -description = "File identification library for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, -] - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.7" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - -[[package]] -name = "importlib-metadata" -version = "7.1.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "installer" -version = "0.7.0" -description = "A library for installing Python wheels." -optional = false -python-versions = ">=3.7" -files = [ - {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, - {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, -] - -[[package]] -name = "isort" -version = "5.13.2" -description = "A Python utility / library to sort Python imports." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, - {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, -] - -[package.extras] -colors = ["colorama (>=0.4.6)"] - -[[package]] -name = "jaraco-classes" -version = "3.4.0" -description = "Utility functions for Python class constructs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, - {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, -] - -[package.dependencies] -more-itertools = "*" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "jeepney" -version = "0.8.0" -description = "Low-level, pure Python DBus protocol wrapper." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] - -[package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["async_generator", "trio"] - -[[package]] -name = "jinja2" -version = "3.1.4" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "keyring" -version = "24.3.1" -description = "Store and access your passwords safely." -optional = false -python-versions = ">=3.8" -files = [ - {file = "keyring-24.3.1-py3-none-any.whl", hash = "sha256:df38a4d7419a6a60fea5cef1e45a948a3e8430dd12ad88b0f423c5c143906218"}, - {file = "keyring-24.3.1.tar.gz", hash = "sha256:c3327b6ffafc0e8befbdb597cacdb4928ffe5c1212f7645f186e6d9957a898db"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} -"jaraco.classes" = "*" -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -completion = ["shtab (>=1.1.0)"] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "macholib" -version = "1.16.3" -description = "Mach-O header analysis and editing" -optional = false -python-versions = "*" -files = [ - {file = "macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c"}, - {file = "macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30"}, -] - -[package.dependencies] -altgraph = ">=0.17" - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -optional = false -python-versions = ">=3.8" -files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, -] - -[package.dependencies] -mdurl = ">=0.1,<1.0" - -[package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "markupsafe" -version = "2.1.5" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, -] - -[[package]] -name = "marshmallow" -version = "3.21.2" -description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -optional = false -python-versions = ">=3.8" -files = [ - {file = "marshmallow-3.21.2-py3-none-any.whl", hash = "sha256:70b54a6282f4704d12c0a41599682c5c5450e843b9ec406308653b47c59648a1"}, - {file = "marshmallow-3.21.2.tar.gz", hash = "sha256:82408deadd8b33d56338d2182d455db632c6313aa2af61916672146bb32edc56"}, -] - -[package.dependencies] -packaging = ">=17.0" - -[package.extras] -dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] -docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] -tests = ["pytest", "pytz", "simplejson"] - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -optional = false -python-versions = ">=3.6" -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - -[[package]] -name = "more-itertools" -version = "10.2.0" -description = "More routines for operating on iterables, beyond itertools" -optional = false -python-versions = ">=3.8" -files = [ - {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, - {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, -] - -[[package]] -name = "msgpack" -version = "1.0.8" -description = "MessagePack serializer" -optional = false -python-versions = ">=3.8" -files = [ - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, - {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, - {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, - {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, - {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, - {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, - {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, - {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, - {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, - {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, - {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, -] - -[[package]] -name = "mypy" -version = "1.10.0" -description = "Optional static typing for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, - {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, - {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, - {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, - {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, - {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, - {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, - {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, - {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, - {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, - {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, - {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, - {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, - {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -typing-extensions = ">=4.1.0" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -install-types = ["pip"] -mypyc = ["setuptools (>=50)"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "nodeenv" -version = "1.8.0" -description = "Node.js virtual environment builder" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" -files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, -] - -[package.dependencies] -setuptools = "*" - -[[package]] -name = "numpy" -version = "1.26.4" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, -] - -[[package]] -name = "packaging" -version = "24.0" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - -[[package]] -name = "pefile" -version = "2023.2.7" -description = "Python PE parsing module" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6"}, - {file = "pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc"}, -] - -[[package]] -name = "pexpect" -version = "4.9.0" -description = "Pexpect allows easy control of interactive console applications." -optional = false -python-versions = "*" -files = [ - {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, - {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pip-licenses" -version = "4.4.0" -description = "Dump the software license list of Python packages installed with pip." -optional = false -python-versions = "~=3.8" -files = [ - {file = "pip-licenses-4.4.0.tar.gz", hash = "sha256:996817118375445243a34faafe23c06f6b2d250247c4046571b5a6722d45be69"}, - {file = "pip_licenses-4.4.0-py3-none-any.whl", hash = "sha256:dbad2ac5a25f574cabe2716f2f031a0c5fa359bed9b3ef615301f4e546893b46"}, -] - -[package.dependencies] -prettytable = ">=2.3.0" - -[package.extras] -test = ["docutils", "mypy", "pytest-cov", "pytest-pycodestyle", "pytest-runner"] - -[[package]] -name = "pkginfo" -version = "1.10.0" -description = "Query metadata from sdists / bdists / installed packages." -optional = false -python-versions = ">=3.6" -files = [ - {file = "pkginfo-1.10.0-py3-none-any.whl", hash = "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097"}, - {file = "pkginfo-1.10.0.tar.gz", hash = "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297"}, -] - -[package.extras] -testing = ["pytest", "pytest-cov", "wheel"] - -[[package]] -name = "platformdirs" -version = "4.2.2" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, -] - -[package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "poetry" -version = "1.8.2" -description = "Python dependency management and packaging made easy." -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "poetry-1.8.2-py3-none-any.whl", hash = "sha256:b42b400d9a803af6e788a30a6f3e9998020b77860e28df20647eb10b6f414910"}, - {file = "poetry-1.8.2.tar.gz", hash = "sha256:49cceb3838104647c3e1021f3a4f13c6053704cc18d33f849a90fe687a29cb73"}, -] - -[package.dependencies] -build = ">=1.0.3,<2.0.0" -cachecontrol = {version = ">=0.14.0,<0.15.0", extras = ["filecache"]} -cleo = ">=2.1.0,<3.0.0" -crashtest = ">=0.4.1,<0.5.0" -dulwich = ">=0.21.2,<0.22.0" -fastjsonschema = ">=2.18.0,<3.0.0" -installer = ">=0.7.0,<0.8.0" -keyring = ">=24.0.0,<25.0.0" -packaging = ">=23.1" -pexpect = ">=4.7.0,<5.0.0" -pkginfo = ">=1.9.4,<2.0.0" -platformdirs = ">=3.0.0,<5" -poetry-core = "1.9.0" -poetry-plugin-export = ">=1.6.0,<2.0.0" -pyproject-hooks = ">=1.0.0,<2.0.0" -requests = ">=2.26,<3.0" -requests-toolbelt = ">=1.0.0,<2.0.0" -shellingham = ">=1.5,<2.0" -tomlkit = ">=0.11.4,<1.0.0" -trove-classifiers = ">=2022.5.19" -virtualenv = ">=20.23.0,<21.0.0" -xattr = {version = ">=1.0.0,<2.0.0", markers = "sys_platform == \"darwin\""} - -[[package]] -name = "poetry-core" -version = "1.9.0" -description = "Poetry PEP 517 Build Backend" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "poetry_core-1.9.0-py3-none-any.whl", hash = "sha256:4e0c9c6ad8cf89956f03b308736d84ea6ddb44089d16f2adc94050108ec1f5a1"}, - {file = "poetry_core-1.9.0.tar.gz", hash = "sha256:fa7a4001eae8aa572ee84f35feb510b321bd652e5cf9293249d62853e1f935a2"}, -] - -[[package]] -name = "poetry-plugin-export" -version = "1.8.0" -description = "Poetry plugin to export the dependencies to various formats" -optional = false -python-versions = "<4.0,>=3.8" -files = [ - {file = "poetry_plugin_export-1.8.0-py3-none-any.whl", hash = "sha256:adbe232cfa0cc04991ea3680c865cf748bff27593b9abcb1f35fb50ed7ba2c22"}, - {file = "poetry_plugin_export-1.8.0.tar.gz", hash = "sha256:1fa6168a85d59395d835ca564bc19862a7c76061e60c3e7dfaec70d50937fc61"}, -] - -[package.dependencies] -poetry = ">=1.8.0,<3.0.0" -poetry-core = ">=1.7.0,<3.0.0" - -[[package]] -name = "pre-commit" -version = "2.21.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, - {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, -] - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -virtualenv = ">=20.10.0" - -[[package]] -name = "prettytable" -version = "3.10.0" -description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" -optional = false -python-versions = ">=3.8" -files = [ - {file = "prettytable-3.10.0-py3-none-any.whl", hash = "sha256:6536efaf0757fdaa7d22e78b3aac3b69ea1b7200538c2c6995d649365bddab92"}, - {file = "prettytable-3.10.0.tar.gz", hash = "sha256:9665594d137fb08a1117518c25551e0ede1687197cf353a4fdc78d27e1073568"}, -] - -[package.dependencies] -wcwidth = "*" - -[package.extras] -tests = ["pytest", "pytest-cov", "pytest-lazy-fixtures"] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -optional = false -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pycodestyle" -version = "2.11.1" -description = "Python style guide checker" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, - {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, -] - -[[package]] -name = "pycparser" -version = "2.22" -description = "C parser in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, -] - -[[package]] -name = "pydantic" -version = "2.7.3" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic-2.7.3-py3-none-any.whl", hash = "sha256:ea91b002777bf643bb20dd717c028ec43216b24a6001a280f83877fd2655d0b4"}, - {file = "pydantic-2.7.3.tar.gz", hash = "sha256:c46c76a40bb1296728d7a8b99aa73dd70a48c3510111ff290034f860c99c419e"}, -] - -[package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.18.4" -typing-extensions = ">=4.6.1" - -[package.extras] -email = ["email-validator (>=2.0.0)"] - -[[package]] -name = "pydantic-core" -version = "2.18.4" -description = "Core functionality for Pydantic validation and serialization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, - {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, - {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, - {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, - {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, - {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, - {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, - {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, - {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, - {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, - {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, - {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, - {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, - {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - -[[package]] -name = "pyflakes" -version = "3.2.0" -description = "passive checker of Python programs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, - {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, -] - -[[package]] -name = "pygments" -version = "2.18.0" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, - {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, -] - -[package.extras] -windows-terminal = ["colorama (>=0.4.6)"] - -[[package]] -name = "pyinstaller" -version = "5.13.2" -description = "PyInstaller bundles a Python application and all its dependencies into a single package." -optional = false -python-versions = "<3.13,>=3.7" -files = [ - {file = "pyinstaller-5.13.2-py3-none-macosx_10_13_universal2.whl", hash = "sha256:16cbd66b59a37f4ee59373a003608d15df180a0d9eb1a29ff3bfbfae64b23d0f"}, - {file = "pyinstaller-5.13.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8f6dd0e797ae7efdd79226f78f35eb6a4981db16c13325e962a83395c0ec7420"}, - {file = "pyinstaller-5.13.2-py3-none-manylinux2014_i686.whl", hash = "sha256:65133ed89467edb2862036b35d7c5ebd381670412e1e4361215e289c786dd4e6"}, - {file = "pyinstaller-5.13.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:7d51734423685ab2a4324ab2981d9781b203dcae42839161a9ee98bfeaabdade"}, - {file = "pyinstaller-5.13.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:2c2fe9c52cb4577a3ac39626b84cf16cf30c2792f785502661286184f162ae0d"}, - {file = "pyinstaller-5.13.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c63ef6133eefe36c4b2f4daf4cfea3d6412ece2ca218f77aaf967e52a95ac9b8"}, - {file = "pyinstaller-5.13.2-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:aadafb6f213549a5906829bb252e586e2cf72a7fbdb5731810695e6516f0ab30"}, - {file = "pyinstaller-5.13.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:b2e1c7f5cceb5e9800927ddd51acf9cc78fbaa9e79e822c48b0ee52d9ce3c892"}, - {file = "pyinstaller-5.13.2-py3-none-win32.whl", hash = "sha256:421cd24f26144f19b66d3868b49ed673176765f92fa9f7914cd2158d25b6d17e"}, - {file = "pyinstaller-5.13.2-py3-none-win_amd64.whl", hash = "sha256:ddcc2b36052a70052479a9e5da1af067b4496f43686ca3cdda99f8367d0627e4"}, - {file = "pyinstaller-5.13.2-py3-none-win_arm64.whl", hash = "sha256:27cd64e7cc6b74c5b1066cbf47d75f940b71356166031deb9778a2579bb874c6"}, - {file = "pyinstaller-5.13.2.tar.gz", hash = "sha256:c8e5d3489c3a7cc5f8401c2d1f48a70e588f9967e391c3b06ddac1f685f8d5d2"}, -] - -[package.dependencies] -altgraph = "*" -macholib = {version = ">=1.8", markers = "sys_platform == \"darwin\""} -pefile = {version = ">=2022.5.30", markers = "sys_platform == \"win32\""} -pyinstaller-hooks-contrib = ">=2021.4" -pywin32-ctypes = {version = ">=0.2.1", markers = "sys_platform == \"win32\""} -setuptools = ">=42.0.0" - -[package.extras] -encryption = ["tinyaes (>=1.0.0)"] -hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"] - -[[package]] -name = "pyinstaller-hooks-contrib" -version = "2024.6" -description = "Community maintained hooks for PyInstaller" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyinstaller_hooks_contrib-2024.6-py2.py3-none-any.whl", hash = "sha256:6cc88dad75261d9e1a7e0c6385139f35dcdbb16640c911a27f6078fe924a38cf"}, - {file = "pyinstaller_hooks_contrib-2024.6.tar.gz", hash = "sha256:3c188b3a79f5cd46d96520df3934642556a1b6ce8988ec5bbce820ada424bc2b"}, -] - -[package.dependencies] -packaging = ">=22.0" -setuptools = ">=42.0.0" - -[[package]] -name = "pyopenjtalk" -version = "0.3.2+b35fc89" -description = "A python wrapper for OpenJTalk" -optional = false -python-versions = "*" -files = [] -develop = false - -[package.dependencies] -numpy = ">=1.20.0" -six = "*" -tqdm = "*" - -[package.extras] -dev = ["black (>=19.19b0,<=20.8)", "click (<8.1.0)", "cython (>=0.21.0,<3.0.0)", "flake8 (>=3.7,<4)", "flake8-bugbear", "importlib-metadata (<5.0)", "isort (>=4.3,<5.2.0)", "mypy (<=0.910)", "pysen", "types-decorator", "types-setuptools"] -docs = ["Jinja2 (>=3.0.1)", "ipython", "jupyter", "nbsphinx (>=0.8.6)", "pandoc", "sphinx_rtd_theme"] -marine = ["marine (>=0.0.5)"] -test = ["pytest", "scipy"] - -[package.source] -type = "git" -url = "https://github.com/VOICEVOX/pyopenjtalk" -reference = "b35fc89fe42948a28e33aed886ea145a51113f88" -resolved_reference = "b35fc89fe42948a28e33aed886ea145a51113f88" - -[[package]] -name = "pyproject-hooks" -version = "1.1.0" -description = "Wrappers to call pyproject.toml-based build backend hooks." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2"}, - {file = "pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965"}, -] - -[[package]] -name = "pysen" -version = "0.11.0" -description = "Python linting made easy. Also a casual yet honorific way to address individuals who have entered an organization prior to you." -optional = false -python-versions = "*" -files = [ - {file = "pysen-0.11.0-py3-none-any.whl", hash = "sha256:d4e81e12f9f1b4cf25df0399d10b0201a9a4bae18846fe0e279179b657daf015"}, - {file = "pysen-0.11.0.tar.gz", hash = "sha256:b9ea6c67289360f7bd9c95f8c79f603a775decb9342d2635dc40fcda92dfa53a"}, -] - -[package.dependencies] -colorlog = ">=4.0.0,<5.0.0" -dacite = ">=1.1.0,<2.0.0" -GitPython = ">=3.0.0,<4.0.0" -tomlkit = ">=0.5.11,<1.0.0" -unidiff = ">=0.6.0,<1.0.0" - -[package.extras] -lint = ["black (>=19.10b0,<=22.10)", "flake8 (>=3.7,<5)", "flake8-bugbear", "isort (>=4.3,<5.2.0)", "mypy (>=0.770,<0.800)"] - -[[package]] -name = "pytest" -version = "8.2.0" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, - {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=1.5,<2.0" - -[package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "python-multipart" -version = "0.0.9" -description = "A streaming multipart parser for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, - {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, -] - -[package.extras] -dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatch", "invoke (==2.2.0)", "more-itertools (==10.2.0)", "pbr (==6.0.0)", "pluggy (==1.4.0)", "py (==1.11.0)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.2.0)", "pyyaml (==6.0.1)", "ruff (==0.2.1)"] - -[[package]] -name = "pywin32-ctypes" -version = "0.2.2" -description = "A (partial) reimplementation of pywin32 using ctypes/cffi" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, - {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, -] - -[[package]] -name = "pyworld" -version = "0.3.4" -description = "PyWorld: a Python wrapper for WORLD vocoder" -optional = false -python-versions = "*" -files = [ - {file = "pyworld-0.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:699d2478b31215893152f67bb3eef244ed77fd3b8ac6757428fbcf7f8e1a057c"}, - {file = "pyworld-0.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:61292a4dced5f4a0677aa7afdd5c601df79e70771aa63bbdd8279e6a1d0f5d7a"}, - {file = "pyworld-0.3.4-cp36-cp36m-win32.whl", hash = "sha256:ebd9f918f54fb5dd6a16059635d904b56a5165e7e5207ab1b4fa0fb839b4efa7"}, - {file = "pyworld-0.3.4-cp36-cp36m-win_amd64.whl", hash = "sha256:34db25abde77cc231605d0f3748742cf9535156ee239fd861241a66d43c5134c"}, - {file = "pyworld-0.3.4-cp37-cp37m-win32.whl", hash = "sha256:8c0a4c6ef1d3ba7742b4cf773c2733743392ce525d75efda4b832abb623d8689"}, - {file = "pyworld-0.3.4-cp37-cp37m-win_amd64.whl", hash = "sha256:235ce1c9b97986897cf60544c6d46a5eef814688b1aa0ea9d88e9877e6df015f"}, - {file = "pyworld-0.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:a1aa7ec78e4575c231bc374c825a3c5c1fefdff5c83932dcf90b7d333c156c2e"}, - {file = "pyworld-0.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:fddbbb9aec3f2341279237a907b8b625fa099086205b24aa740008becbd7e3d4"}, - {file = "pyworld-0.3.4.tar.gz", hash = "sha256:106c70ee7a7d8c9ba488d8022f2033706929a40f0264256b8e87da5aab98303a"}, -] - -[package.dependencies] -cython = ">=0.24" -numpy = "*" - -[package.extras] -sdist = ["cython (>=0.24)", "numpy"] -test = ["nose"] - -[[package]] -name = "pyyaml" -version = "6.0.1" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, -] - -[[package]] -name = "rapidfuzz" -version = "3.9.0" -description = "rapid fuzzy string matching" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rapidfuzz-3.9.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bd375c4830fee11d502dd93ecadef63c137ae88e1aaa29cc15031fa66d1e0abb"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:55e2c5076f38fc1dbaacb95fa026a3e409eee6ea5ac4016d44fb30e4cad42b20"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:488f74126904db6b1bea545c2f3567ea882099f4c13f46012fe8f4b990c683df"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3f2d1ea7cd57dfcd34821e38b4924c80a31bcf8067201b1ab07386996a9faee"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b11e602987bcb4ea22b44178851f27406fca59b0836298d0beb009b504dba266"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3083512e9bf6ed2bb3d25883922974f55e21ae7f8e9f4e298634691ae1aee583"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b33c6d4b3a1190bc0b6c158c3981535f9434e8ed9ffa40cf5586d66c1819fb4b"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcb95fde22f98e6d0480db8d6038c45fe2d18a338690e6f9bba9b82323f3469"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:08d8b49b3a4fb8572e480e73fcddc750da9cbb8696752ee12cca4bf8c8220d52"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e721842e6b601ebbeb8cc5e12c75bbdd1d9e9561ea932f2f844c418c31256e82"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7988363b3a415c5194ce1a68d380629247f8713e669ad81db7548eb156c4f365"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2d267d4c982ab7d177e994ab1f31b98ff3814f6791b90d35dda38307b9e7c989"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0bb28ab5300cf974c7eb68ea21125c493e74b35b1129e629533468b2064ae0a2"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-win32.whl", hash = "sha256:1b1f74997b6d94d66375479fa55f70b1c18e4d865d7afcd13f0785bfd40a9d3c"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:c56d2efdfaa1c642029f3a7a5bb76085c5531f7a530777be98232d2ce142553c"}, - {file = "rapidfuzz-3.9.0-cp310-cp310-win_arm64.whl", hash = "sha256:6a83128d505cac76ea560bb9afcb3f6986e14e50a6f467db9a31faef4bd9b347"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e2218d62ab63f3c5ad48eced898854d0c2c327a48f0fb02e2288d7e5332a22c8"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:36bf35df2d6c7d5820da20a6720aee34f67c15cd2daf8cf92e8141995c640c25"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:905b01a9b633394ff6bb5ebb1c5fd660e0e180c03fcf9d90199cc6ed74b87cf7"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33cfabcb7fd994938a6a08e641613ce5fe46757832edc789c6a5602e7933d6fa"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1179dcd3d150a67b8a678cd9c84f3baff7413ff13c9e8fe85e52a16c97e24c9b"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47d97e28c42f1efb7781993b67c749223f198f6653ef177a0c8f2b1c516efcaf"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28da953eb2ef9ad527e536022da7afff6ace7126cdd6f3e21ac20f8762e76d2c"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:182b4e11de928fb4834e8f8b5ecd971b5b10a86fabe8636ab65d3a9b7e0e9ca7"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c74f2da334ce597f31670db574766ddeaee5d9430c2c00e28d0fbb7f76172036"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:014ac55b03f4074f903248ded181f3000f4cdbd134e6155cbf643f0eceb4f70f"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c4ef34b2ddbf448f1d644b4ec6475df8bbe5b9d0fee173ff2e87322a151663bd"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fc02157f521af15143fae88f92ef3ddcc4e0cff05c40153a9549dc0fbdb9adb3"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ff08081c49b18ba253a99e6a47f492e6ee8019e19bbb6ddc3ed360cd3ecb2f62"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-win32.whl", hash = "sha256:b9bf90b3d96925cbf8ef44e5ee3cf39ef0c422f12d40f7a497e91febec546650"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5d5684f54d82d9b0cf0b2701e55a630527a9c3dd5ddcf7a2e726a475ac238f2"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-win_arm64.whl", hash = "sha256:a2de844e0e971d7bd8aa41284627dbeacc90e750b90acfb016836553c7a63192"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f81fe99a69ac8ee3fd905e70c62f3af033901aeb60b69317d1d43d547b46e510"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:633b9d03fc04abc585c197104b1d0af04b1f1db1abc99f674d871224cd15557a"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab872cb57ae97c54ba7c71a9e3c9552beb57cb907c789b726895576d1ea9af6f"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdd8c15c3a14e409507fdf0c0434ec481d85c6cbeec8bdcd342a8cd1eda03825"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2444d8155d9846f206e2079bb355b85f365d9457480b0d71677a112d0a7f7128"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f83bd3d01f04061c3660742dc85143a89d49fd23eb31eccbf60ad56c4b955617"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ca799f882364e69d0872619afb19efa3652b7133c18352e4a3d86a324fb2bb1"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6993d361f28b9ef5f0fa4e79b8541c2f3507be7471b9f9cb403a255e123b31e1"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:170822a1b1719f02b58e3dce194c8ad7d4c5b39be38c0fdec603bd19c6f9cf81"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e86e39c1c1a0816ceda836e6f7bd3743b930cbc51a43a81bb433b552f203f25"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:731269812ea837e0b93d913648e404736407408e33a00b75741e8f27c590caa2"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8e5ff882d3a3d081157ceba7e0ebc7fac775f95b08cbb143accd4cece6043819"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2003071aa633477a01509890c895f9ef56cf3f2eaa72c7ec0b567f743c1abcba"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-win32.whl", hash = "sha256:13857f9070600ea1f940749f123b02d0b027afbaa45e72186df0f278915761d0"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:134b7098ac109834eeea81424b6822f33c4c52bf80b81508295611e7a21be12a"}, - {file = "rapidfuzz-3.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:2a96209f046fe328be30fc43f06e3d4b91f0d5b74e9dcd627dbfd65890fa4a5e"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:544b0bf9d17170720809918e9ccd0d482d4a3a6eca35630d8e1459f737f71755"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d536f8beb8dd82d6efb20fe9f82c2cfab9ffa0384b5d184327e393a4edde91d"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30f7609da871510583f87484a10820b26555a473a90ab356cdda2f3b4456256c"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f4a2468432a1db491af6f547fad8f6d55fa03e57265c2f20e5eaceb68c7907e"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11a7ec4676242c8a430509cff42ce98bca2fbe30188a63d0f60fdcbfd7e84970"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dcb523243e988c849cf81220164ec3bbed378a699e595a8914fffe80596dc49f"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4eea3bf72c4fe68e957526ffd6bcbb403a21baa6b3344aaae2d3252313df6199"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4514980a5d204c076dd5b756960f6b1b7598f030009456e6109d76c4c331d03c"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9a06a99f1335fe43464d7121bc6540de7cd9c9475ac2025babb373fe7f27846b"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6c1ed63345d1581c39d4446b1a8c8f550709656ce2a3c88c47850b258167f3c2"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cd2e6e97daf17ebb3254285cf8dd86c60d56d6cf35c67f0f9a557ef26bd66290"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9bc0f7e6256a9c668482c41c8a3de5d0aa12e8ca346dcc427b97c7edb82cba48"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c09f4e87e82a164c9db769474bc61f8c8b677f2aeb0234b8abac73d2ecf9799"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-win32.whl", hash = "sha256:e65b8f7921bf60cbb207c132842a6b45eefef48c4c3b510eb16087d6c08c70af"}, - {file = "rapidfuzz-3.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9d6478957fb35c7844ad08f2442b62ba76c1857a56370781a707eefa4f4981e1"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:65d9250a4b0bf86320097306084bc3ca479c8f5491927c170d018787793ebe95"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:47b7c0840afa724db3b1a070bc6ed5beab73b4e659b1d395023617fc51bf68a2"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a16c48c6df8fb633efbbdea744361025d01d79bca988f884a620e63e782fe5b"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48105991ff6e4a51c7f754df500baa070270ed3d41784ee0d097549bc9fcb16d"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a7f273906b3c7cc6d63a76e088200805947aa0bc1ada42c6a0e582e19c390d7"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c396562d304e974b4b0d5cd3afc4f92c113ea46a36e6bc62e45333d6aa8837e"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68da1b70458fea5290ec9a169fcffe0c17ff7e5bb3c3257e63d7021a50601a8e"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c5b8f9a7b177af6ce7c6ad5b95588b4b73e37917711aafa33b2e79ee80fe709"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3c42a238bf9dd48f4ccec4c6934ac718225b00bb3a438a008c219e7ccb3894c7"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a365886c42177b2beab475a50ba311b59b04f233ceaebc4c341f6f91a86a78e2"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ce897b5dafb7fb7587a95fe4d449c1ea0b6d9ac4462fbafefdbbeef6eee4cf6a"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:413ac49bae291d7e226a5c9be65c71b2630b3346bce39268d02cb3290232e4b7"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8982fc3bd49d55a91569fc8a3feba0de4cef0b391ff9091be546e9df075b81"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-win32.whl", hash = "sha256:3904d0084ab51f82e9f353031554965524f535522a48ec75c30b223eb5a0a488"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:3733aede16ea112728ffeafeb29ccc62e095ed8ec816822fa2a82e92e2c08696"}, - {file = "rapidfuzz-3.9.0-cp39-cp39-win_arm64.whl", hash = "sha256:fc4e26f592b51f97acf0a3f8dfed95e4d830c6a8fbf359361035df836381ab81"}, - {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e33362e98c7899b5f60dcb06ada00acd8673ce0d59aefe9a542701251fd00423"}, - {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb67cf43ad83cb886cbbbff4df7dcaad7aedf94d64fca31aea0da7d26684283c"}, - {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e2e106cc66453bb80d2ad9c0044f8287415676df5c8036d737d05d4b9cdbf8e"}, - {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1256915f7e7a5cf2c151c9ac44834b37f9bd1c97e8dec6f936884f01b9dfc7d"}, - {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ae643220584518cbff8bf2974a0494d3e250763af816b73326a512c86ae782ce"}, - {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:491274080742110427f38a6085bb12dffcaff1eef12dccf9e8758398c7e3957e"}, - {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bc5559b9b94326922c096b30ae2d8e5b40b2e9c2c100c2cc396ad91bcb84d30"}, - {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:849160dc0f128acb343af514ca827278005c1d00148d025e4035e034fc2d8c7f"}, - {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:623883fb78e692d54ed7c43b09beec52c6685f10a45a7518128e25746667403b"}, - {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d20ab9abc7e19767f1951772a6ab14cb4eddd886493c2da5ee12014596ad253f"}, - {file = "rapidfuzz-3.9.0.tar.gz", hash = "sha256:b182f0fb61f6ac435e416eb7ab330d62efdbf9b63cf0c7fa12d1f57c2eaaf6f3"}, -] - -[package.extras] -full = ["numpy"] - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, -] - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "rich" -version = "13.7.1" -description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, - {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, -] - -[package.dependencies] -markdown-it-py = ">=2.2.0" -pygments = ">=2.13.0,<3.0.0" - -[package.extras] -jupyter = ["ipywidgets (>=7.5.1,<9)"] - -[[package]] -name = "ruamel-yaml" -version = "0.18.6" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, - {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, -] - -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} - -[package.extras] -docs = ["mercurial (>5.7)", "ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.8" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -optional = false -python-versions = ">=3.6" -files = [ - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, - {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, - {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, -] - -[[package]] -name = "safety" -version = "3.2.0" -description = "Checks installed dependencies for known vulnerabilities and licenses." -optional = false -python-versions = ">=3.7" -files = [ - {file = "safety-3.2.0-py3-none-any.whl", hash = "sha256:a432fc9d17e79a4386c4f093656b617c56f839cde022649cfa796d72c7a544de"}, - {file = "safety-3.2.0.tar.gz", hash = "sha256:8bd5cab5f3d8a61ce0ea6e98f267c1006d056097c45c644fee7afeff7d5949c1"}, -] - -[package.dependencies] -Authlib = ">=1.2.0" -Click = ">=8.0.2" -dparse = ">=0.6.4b0" -jinja2 = ">=3.1.0" -marshmallow = ">=3.15.0" -packaging = ">=21.0" -pydantic = ">=1.10.12" -requests = "*" -rich = "*" -"ruamel.yaml" = ">=0.17.21" -safety-schemas = ">=0.0.2" -setuptools = ">=65.5.1" -typer = "*" -typing-extensions = ">=4.7.1" -urllib3 = ">=1.26.5" - -[package.extras] -github = ["pygithub (>=1.43.3)"] -gitlab = ["python-gitlab (>=1.3.0)"] -spdx = ["spdx-tools (>=0.8.2)"] - -[[package]] -name = "safety-schemas" -version = "0.0.2" -description = "Schemas for Safety tools" -optional = false -python-versions = ">=3.7" -files = [ - {file = "safety_schemas-0.0.2-py3-none-any.whl", hash = "sha256:277c077ce6e53221874a87c29515ffdd2f3773a6db4d035a9f67cc98db3b8c7f"}, - {file = "safety_schemas-0.0.2.tar.gz", hash = "sha256:7d1b040ec06480f05cff6b45ea7a93e09c8942df864fb0d01ddeb67c323cfa8c"}, -] - -[package.dependencies] -dparse = ">=0.6.4b0" -packaging = ">=21.0" -pydantic = "*" -ruamel-yaml = ">=0.17.21" -typing-extensions = ">=4.7.1" - -[[package]] -name = "secretstorage" -version = "3.3.3" -description = "Python bindings to FreeDesktop.org Secret Service API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, -] - -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" - -[[package]] -name = "semver" -version = "3.0.2" -description = "Python helper for Semantic Versioning (https://semver.org)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "semver-3.0.2-py3-none-any.whl", hash = "sha256:b1ea4686fe70b981f85359eda33199d60c53964284e0cfb4977d243e37cf4bf4"}, - {file = "semver-3.0.2.tar.gz", hash = "sha256:6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc"}, -] - -[[package]] -name = "setuptools" -version = "69.5.1" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "shellingham" -version = "1.5.4" -description = "Tool to Detect Surrounding Shell" -optional = false -python-versions = ">=3.7" -files = [ - {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, - {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, -] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "smmap" -version = "5.0.1" -description = "A pure Python implementation of a sliding window memory map manager" -optional = false -python-versions = ">=3.7" -files = [ - {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, - {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "soundfile" -version = "0.12.1" -description = "An audio library based on libsndfile, CFFI and NumPy" -optional = false -python-versions = "*" -files = [ - {file = "soundfile-0.12.1-py2.py3-none-any.whl", hash = "sha256:828a79c2e75abab5359f780c81dccd4953c45a2c4cd4f05ba3e233ddf984b882"}, - {file = "soundfile-0.12.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:d922be1563ce17a69582a352a86f28ed8c9f6a8bc951df63476ffc310c064bfa"}, - {file = "soundfile-0.12.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:bceaab5c4febb11ea0554566784bcf4bc2e3977b53946dda2b12804b4fe524a8"}, - {file = "soundfile-0.12.1-py2.py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:2dc3685bed7187c072a46ab4ffddd38cef7de9ae5eb05c03df2ad569cf4dacbc"}, - {file = "soundfile-0.12.1-py2.py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:074247b771a181859d2bc1f98b5ebf6d5153d2c397b86ee9e29ba602a8dfe2a6"}, - {file = "soundfile-0.12.1-py2.py3-none-win32.whl", hash = "sha256:59dfd88c79b48f441bbf6994142a19ab1de3b9bb7c12863402c2bc621e49091a"}, - {file = "soundfile-0.12.1-py2.py3-none-win_amd64.whl", hash = "sha256:0d86924c00b62552b650ddd28af426e3ff2d4dc2e9047dae5b3d8452e0a49a77"}, - {file = "soundfile-0.12.1.tar.gz", hash = "sha256:e8e1017b2cf1dda767aef19d2fd9ee5ebe07e050d430f77a0a7c66ba08b8cdae"}, -] - -[package.dependencies] -cffi = ">=1.0" - -[package.extras] -numpy = ["numpy"] - -[[package]] -name = "soxr" -version = "0.3.7" -description = "High quality, one-dimensional sample-rate conversion library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "soxr-0.3.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac81c4af6a993d5b7c0b466bbac4835bad2b14ec32f342b2c1f83e4cf825e301"}, - {file = "soxr-0.3.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d8a2b3e7f8d0255e2484fb82cb66c86da6fb25b342ef793cceca9ce9a61aa16"}, - {file = "soxr-0.3.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd6eb6f6bbda2e8de36672cf2f0529ced6e638773150744ef075be0cc4f52c"}, - {file = "soxr-0.3.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e47d86af35b942c92606fc2d5dfccf3f01309329475571ae2312bbf9edc3a790"}, - {file = "soxr-0.3.7-cp310-cp310-win_amd64.whl", hash = "sha256:0e291adfaf9f2a7c4dd180a1b8c280f9beb1c84cb381853e4f4b3434d002ed7f"}, - {file = "soxr-0.3.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e811450f0e91972932bd37ac58e32e44002c2c99db2aa926a9e7ba164545034"}, - {file = "soxr-0.3.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9cea63014ce91035074e1228c9340e2b8609faf964e268705fcac5135d05060c"}, - {file = "soxr-0.3.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bfab27830f6217a15b83445988225c3aeea3bbccfa9399ced291e53e1b05925d"}, - {file = "soxr-0.3.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:286858e3078d76c11b6d490b66fed3c9bb2a4229759f6be03ceef5c02189bf2c"}, - {file = "soxr-0.3.7-cp311-cp311-win_amd64.whl", hash = "sha256:54985ff33292192d2937be80df3e5f3a44d6d53e6835f727d6b99b7cdd3f1611"}, - {file = "soxr-0.3.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:83c74ef6d61d7dcd81be26f91bee0a420f792f5c1982266f2a80e655f0650a98"}, - {file = "soxr-0.3.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb1e14663a43fe88b8fbc287822a159028366a820abe1a0a9670fb53618cb47b"}, - {file = "soxr-0.3.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48acdfbcf870ab54f645b1cfd641bce92c1e3a67346c3bf0f6c0ad2873c1dd35"}, - {file = "soxr-0.3.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea663b76f2b0ec1576b8a43aef317aec080abc0a67a4015fcd9f3407039f260a"}, - {file = "soxr-0.3.7-cp312-cp312-win_amd64.whl", hash = "sha256:42da0d9eb79c70e5a41917f1b48a032e241a48eb4a1bcea7c80577302ff26974"}, - {file = "soxr-0.3.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:511c6b2279c8ddd83459d129d69f628f7aae4616ae0a1912963985bd89e35df7"}, - {file = "soxr-0.3.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a37c518c0b5d70162956d808d6c2e249bae0672e414e0dcfc101e200d8c31f3c"}, - {file = "soxr-0.3.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27f2890528d2b2e358938ab660a6b8346802863f5b6b646204d7ff8ab0ca2c66"}, - {file = "soxr-0.3.7-cp37-cp37m-win_amd64.whl", hash = "sha256:52467c8c012495544a6dcfcce6b5bcbbc653d24fe9bb33c0b6191acecdb5e297"}, - {file = "soxr-0.3.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ce12b93747958f2769d6b297e6e27c73d9ad635fe8104ef052bece9c8a322824"}, - {file = "soxr-0.3.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cd65dc7b96ea3cb6c8c48e6020e859680556cc42dd3d4de44779530cce21037"}, - {file = "soxr-0.3.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d994f1a7690b1b13ab639ea33e0c1d78415b64d88d6df4af705a9443f97b9687"}, - {file = "soxr-0.3.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e87b58bc9e8c2caa16f07726f666bd043f0a49ca937baa803ce7708003b27833"}, - {file = "soxr-0.3.7-cp38-cp38-win_amd64.whl", hash = "sha256:07f4c0c6125ea1482fa187ad5f007216712ee0a93586a9b2f80e79c0bf944cf7"}, - {file = "soxr-0.3.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e5267c3ba34d4b873d9bbe3a9e58418b01ae4fd04349a4f944d9943b9ddac0f7"}, - {file = "soxr-0.3.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e39668c250e221db888cf3b290a16fbe10a702d9a4eb604a127f720040de583"}, - {file = "soxr-0.3.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ceeb74e5a55d903cc286d3bd12c2d8f8c85d02894071e9ec92ab405430907c"}, - {file = "soxr-0.3.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0eed6bf58192dd1bb93becd2444de4d712689713d727b32fd55623ae9aae7df7"}, - {file = "soxr-0.3.7-cp39-cp39-win_amd64.whl", hash = "sha256:7221302b4547d02a3f38dd3cd15317ab2b78873c75921db5f4a070848f0c71be"}, - {file = "soxr-0.3.7.tar.gz", hash = "sha256:436ddff00c6eb2c75b79c19cfdca7527b1e31b5fad738652f044045ba6258593"}, -] - -[package.dependencies] -numpy = "*" - -[package.extras] -docs = ["linkify-it-py", "myst-parser", "sphinx", "sphinx-book-theme"] -test = ["pytest"] - -[[package]] -name = "starlette" -version = "0.37.2" -description = "The little ASGI library that shines." -optional = false -python-versions = ">=3.8" -files = [ - {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, - {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, -] - -[package.dependencies] -anyio = ">=3.4.0,<5" - -[package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] - -[[package]] -name = "syrupy" -version = "4.6.1" -description = "Pytest Snapshot Test Utility" -optional = false -python-versions = ">=3.8.1,<4" -files = [ - {file = "syrupy-4.6.1-py3-none-any.whl", hash = "sha256:203e52f9cb9fa749cf683f29bd68f02c16c3bc7e7e5fe8f2fc59bdfe488ce133"}, - {file = "syrupy-4.6.1.tar.gz", hash = "sha256:37a835c9ce7857eeef86d62145885e10b3cb9615bc6abeb4ce404b3f18e1bb36"}, -] - -[package.dependencies] -pytest = ">=7.0.0,<9.0.0" - -[[package]] -name = "tomlkit" -version = "0.12.5" -description = "Style preserving TOML library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, - {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, -] - -[[package]] -name = "tqdm" -version = "4.66.4" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "trove-classifiers" -version = "2024.4.10" -description = "Canonical source for classifiers on PyPI (pypi.org)." -optional = false -python-versions = "*" -files = [ - {file = "trove-classifiers-2024.4.10.tar.gz", hash = "sha256:49f40bb6a746b72a1cba4f8d55ee8252169cda0f70802e3fd24f04b7fb25a492"}, - {file = "trove_classifiers-2024.4.10-py3-none-any.whl", hash = "sha256:678bd6fcc5218d72e3304e27a608acc9b91e17bd00c3f3d8c968497c843ad98b"}, -] - -[[package]] -name = "typer" -version = "0.12.3" -description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -optional = false -python-versions = ">=3.7" -files = [ - {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, - {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, -] - -[package.dependencies] -click = ">=8.0.0" -rich = ">=10.11.0" -shellingham = ">=1.3.0" -typing-extensions = ">=3.7.4.3" - -[[package]] -name = "types-pyyaml" -version = "6.0.12.20240311" -description = "Typing stubs for PyYAML" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-PyYAML-6.0.12.20240311.tar.gz", hash = "sha256:a9e0f0f88dc835739b0c1ca51ee90d04ca2a897a71af79de9aec5f38cb0a5342"}, - {file = "types_PyYAML-6.0.12.20240311-py3-none-any.whl", hash = "sha256:b845b06a1c7e54b8e5b4c683043de0d9caf205e7434b3edc678ff2411979b8f6"}, -] - -[[package]] -name = "typing-extensions" -version = "4.11.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, -] - -[[package]] -name = "unidiff" -version = "0.7.5" -description = "Unified diff parsing/metadata extraction library." -optional = false -python-versions = "*" -files = [ - {file = "unidiff-0.7.5-py2.py3-none-any.whl", hash = "sha256:c93bf2265cc1ba2a520e415ab05da587370bc2a3ae9e0414329f54f0c2fc09e8"}, - {file = "unidiff-0.7.5.tar.gz", hash = "sha256:2e5f0162052248946b9f0970a40e9e124236bf86c82b70821143a6fc1dea2574"}, -] - -[[package]] -name = "urllib3" -version = "2.2.1" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "uvicorn" -version = "0.29.0" -description = "The lightning-fast ASGI server." -optional = false -python-versions = ">=3.8" -files = [ - {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, - {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, -] - -[package.dependencies] -click = ">=7.0" -h11 = ">=0.8" - -[package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] - -[[package]] -name = "virtualenv" -version = "20.26.2" -description = "Virtual Python Environment builder" -optional = false -python-versions = ">=3.7" -files = [ - {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, - {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, -] - -[package.dependencies] -distlib = ">=0.3.7,<1" -filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<5" - -[package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] - -[[package]] -name = "wcwidth" -version = "0.2.13" -description = "Measures the displayed width of unicode strings in a terminal" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, -] - -[[package]] -name = "xattr" -version = "1.1.0" -description = "Python wrapper for extended filesystem attributes" -optional = false -python-versions = ">=3.8" -files = [ - {file = "xattr-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef2fa0f85458736178fd3dcfeb09c3cf423f0843313e25391db2cfd1acec8888"}, - {file = "xattr-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ccab735d0632fe71f7d72e72adf886f45c18b7787430467ce0070207882cfe25"}, - {file = "xattr-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9013f290387f1ac90bccbb1926555ca9aef75651271098d99217284d9e010f7c"}, - {file = "xattr-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcd5dfbcee73c7be057676ecb900cabb46c691aff4397bf48c579ffb30bb963"}, - {file = "xattr-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6480589c1dac7785d1f851347a32c4a97305937bf7b488b857fe8b28a25de9e9"}, - {file = "xattr-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08f61cbed52dc6f7c181455826a9ff1e375ad86f67dd9d5eb7663574abb32451"}, - {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:918e1f83f2e8a072da2671eac710871ee5af337e9bf8554b5ce7f20cdb113186"}, - {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0f06e0c1e4d06b4e0e49aaa1184b6f0e81c3758c2e8365597918054890763b53"}, - {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a641ac038a9f53d2f696716147ca4dbd6a01998dc9cd4bc628801bc0df7f4d"}, - {file = "xattr-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7e4ca0956fd11679bb2e0c0d6b9cdc0f25470cc00d8da173bb7656cc9a9cf104"}, - {file = "xattr-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6881b120f9a4b36ccd8a28d933bc0f6e1de67218b6ce6e66874e0280fc006844"}, - {file = "xattr-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dab29d9288aa28e68a6f355ddfc3f0a7342b40c9012798829f3e7bd765e85c2c"}, - {file = "xattr-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c80bbf55339c93770fc294b4b6586b5bf8e85ec00a4c2d585c33dbd84b5006"}, - {file = "xattr-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1418705f253b6b6a7224b69773842cac83fcbcd12870354b6e11dd1cd54630f"}, - {file = "xattr-1.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687e7d18611ef8d84a6ecd8f4d1ab6757500c1302f4c2046ce0aa3585e13da3f"}, - {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6ceb9efe0657a982ccb8b8a2efe96b690891779584c901d2f920784e5d20ae3"}, - {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b489b7916f239100956ea0b39c504f3c3a00258ba65677e4c8ba1bd0b5513446"}, - {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0a9c431b0e66516a078125e9a273251d4b8e5ba84fe644b619f2725050d688a0"}, - {file = "xattr-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1a5921ea3313cc1c57f2f53b63ea8ca9a91e48f4cc7ebec057d2447ec82c7efe"}, - {file = "xattr-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6ad2a7bd5e6cf71d4a862413234a067cf158ca0ae94a40d4b87b98b62808498"}, - {file = "xattr-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0683dae7609f7280b0c89774d00b5957e6ffcb181c6019c46632b389706b77e6"}, - {file = "xattr-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54cb15cd94e5ef8a0ef02309f1bf973ba0e13c11e87686e983f371948cfee6af"}, - {file = "xattr-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff6223a854229055e803c2ad0c0ea9a6da50c6be30d92c198cf5f9f28819a921"}, - {file = "xattr-1.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d44e8f955218638c9ab222eed21e9bd9ab430d296caf2176fb37abe69a714e5c"}, - {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:caab2c2986c30f92301f12e9c50415d324412e8e6a739a52a603c3e6a54b3610"}, - {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d6eb7d5f281014cd44e2d847a9107491af1bf3087f5afeded75ed3e37ec87239"}, - {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:47a3bdfe034b4fdb70e5941d97037405e3904accc28e10dbef6d1c9061fb6fd7"}, - {file = "xattr-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00d2b415cf9d6a24112d019e721aa2a85652f7bbc9f3b9574b2d1cd8668eb491"}, - {file = "xattr-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:78b377832dd0ee408f9f121a354082c6346960f7b6b1480483ed0618b1912120"}, - {file = "xattr-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6461a43b585e5f2e049b39bcbfcb6391bfef3c5118231f1b15d10bdb89ef17fe"}, - {file = "xattr-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24d97f0d28f63695e3344ffdabca9fcc30c33e5c8ccc198c7524361a98d526f2"}, - {file = "xattr-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ad47d89968c9097900607457a0c89160b4771601d813e769f68263755516065"}, - {file = "xattr-1.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc53cab265f6e8449bd683d5ee3bc5a191e6dd940736f3de1a188e6da66b0653"}, - {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cd11e917f5b89f2a0ad639d9875943806c6c9309a3dd02da5a3e8ef92db7bed9"}, - {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9c5a78c7558989492c4cb7242e490ffb03482437bf782967dfff114e44242343"}, - {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cebcf8a303a44fbc439b68321408af7267507c0d8643229dbb107f6c132d389c"}, - {file = "xattr-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b0d73150f2f9655b4da01c2369eb33a294b7f9d56eccb089819eafdbeb99f896"}, - {file = "xattr-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:793c01deaadac50926c0e1481702133260c7cb5e62116762f6fe1543d07b826f"}, - {file = "xattr-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e189e440bcd04ccaad0474720abee6ee64890823ec0db361fb0a4fb5e843a1bf"}, - {file = "xattr-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afacebbc1fa519f41728f8746a92da891c7755e6745164bd0d5739face318e86"}, - {file = "xattr-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b1664edf003153ac8d1911e83a0fc60db1b1b374ee8ac943f215f93754a1102"}, - {file = "xattr-1.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda2684228798e937a7c29b0e1c7ef3d70e2b85390a69b42a1c61b2039ba81de"}, - {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b735ac2625a4fc2c9343b19f806793db6494336338537d2911c8ee4c390dda46"}, - {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fa6a7af7a4ada43f15ccc58b6f9adcdbff4c36ba040013d2681e589e07ae280a"}, - {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1059b2f726e2702c8bbf9bbf369acfc042202a4cc576c2dec6791234ad5e948"}, - {file = "xattr-1.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e2255f36ebf2cb2dbf772a7437ad870836b7396e60517211834cf66ce678b595"}, - {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba4f80b9855cc98513ddf22b7ad8551bc448c70d3147799ea4f6c0b758fb466"}, - {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb70c16e7c3ae6ba0ab6c6835c8448c61d8caf43ea63b813af1f4dbe83dd156"}, - {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83652910ef6a368b77b00825ad67815e5c92bfab551a848ca66e9981d14a7519"}, - {file = "xattr-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7a92aff66c43fa3e44cbeab7cbeee66266c91178a0f595e044bf3ce51485743b"}, - {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d4f71b673339aeaae1f6ea9ef8ea6c9643c8cd0df5003b9a0eaa75403e2e06c"}, - {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a20de1c47b5cd7b47da61799a3b34e11e5815d716299351f82a88627a43f9a96"}, - {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23705c7079b05761ff2fa778ad17396e7599c8759401abc05b312dfb3bc99f69"}, - {file = "xattr-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:27272afeba8422f2a9d27e1080a9a7b807394e88cce73db9ed8d2dde3afcfb87"}, - {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd43978966de3baf4aea367c99ffa102b289d6c2ea5f3d9ce34a203dc2f2ab73"}, - {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded771eaf27bb4eb3c64c0d09866460ee8801d81dc21097269cf495b3cac8657"}, - {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca300c0acca4f0cddd2332bb860ef58e1465d376364f0e72a1823fdd58e90d"}, - {file = "xattr-1.1.0.tar.gz", hash = "sha256:fecbf3b05043ed3487a28190dec3e4c4d879b2fcec0e30bafd8ec5d4b6043630"}, -] - -[package.dependencies] -cffi = ">=1.16.0" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "zipp" -version = "3.18.1" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - -[metadata] -lock-version = "2.0" -python-versions = "~3.11" -content-hash = "3c213025434ae8849ca21bdc8f52c98b2fc2cdc9761ec2f6352ccdc8183a3102" diff --git a/voicevox_engine/presets.yaml b/voicevox_engine/presets.yaml deleted file mode 100644 index 6934b90d576a3da930701736ca374c01c6b0e3fb..0000000000000000000000000000000000000000 --- a/voicevox_engine/presets.yaml +++ /dev/null @@ -1,12 +0,0 @@ -- id: 1 - name: サンプルプリセット - speaker_uuid: 7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff - style_id: 0 - speedScale: 1 - pitchScale: 0 - intonationScale: 1 - volumeScale: 1 - prePhonemeLength: 0.1 - postPhonemeLength: 0.1 - pauseLength: null - pauseLengthScale: 1 diff --git a/voicevox_engine/pyproject.toml b/voicevox_engine/pyproject.toml deleted file mode 100644 index fa2344618af235b4c9c0b75ab2f08cd35634fe2e..0000000000000000000000000000000000000000 --- a/voicevox_engine/pyproject.toml +++ /dev/null @@ -1,85 +0,0 @@ -[tool.pysen] -version = "0.11.0" - -[tool.pysen.lint] -enable_black = true -enable_flake8 = true -enable_isort = true -enable_mypy = true -mypy_preset = "strict" -mypy_plugins = [ - { function = "numpy.typing.mypy_plugin" }, - { function = "pydantic.mypy" }, -] -line_length = 88 -py_version = "py311" -isort_known_first_party = ["voicevox_engine"] -isort_known_third_party = ["numpy"] -[[tool.pysen.lint.mypy_targets]] -paths = ["."] - -[tool.black] # automatically generated by pysen -# pysen ignores and overwrites any modifications -line-length = 88 -target-version = ["py311"] - -[tool.isort] # automatically generated by pysen -# pysen ignores and overwrites any modifications -default_section = "THIRDPARTY" -ensure_newline_before_comments = true -force_grid_wrap = 0 -force_single_line = false -include_trailing_comma = true -known_first_party = ["voicevox_engine"] -known_third_party = ["numpy"] -line_length = 88 -multi_line_output = 3 -use_parentheses = true - -[tool.typos.default.extend-words] -datas = "datas" # PyInstaller's argument - -[tool.poetry] -package-mode = false - -[tool.poetry.dependencies] -python = "~3.11" -numpy = "^1.26.0" -fastapi-slim = "^0.111.0" -jinja2 = "^3.1.3" # NOTE: required by fastapi.templating.Jinja2Templates (fastapi-slim's unmanaged dependency) -python-multipart = "^0.0.9" # NOTE: required by fastapi.Form (fastapi-slim's unmanaged dependency) -uvicorn = "^0.29.0" -soundfile = "^0.12.1" -pyyaml = "^6.0.1" -pyworld = "^0.3.0" -pyopenjtalk = { git = "https://github.com/VOICEVOX/pyopenjtalk", rev = "b35fc89fe42948a28e33aed886ea145a51113f88" } -semver = "^3.0.0" -platformdirs = "^4.2.0" -soxr = "^0.3.6" -pydantic = "^2.7.3" -starlette = "^0.37.0" - -[tool.poetry.group.dev.dependencies] -pysen = "^0.11.0" -black = "^24.4.0" -flake8-bugbear = "^24.4.26" -flake8 = "^7.0.0" -isort = "^5.13.0" -mypy = "^1.10.0" -pytest = "^8.2.0" -coveralls = "^3.2.0" -poetry = "1.8.2" -poetry-plugin-export = "^1.8.0" -httpx = "^0.27.0" # NOTE: required by fastapi.testclient.TestClient (fastapi-slim's unmanaged dependency) -syrupy = "^4.6.1" -types-pyyaml = "^6.0.12" -safety = "^3.1.0" -pip-licenses = "4.4.0" # NOTE: must be specified exactly (c.f. #1281) -pre-commit = "^2.16.0" - -[tool.poetry.group.build.dependencies] -pyinstaller = "^5.13" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/voicevox_engine/requirements-build.txt b/voicevox_engine/requirements-build.txt deleted file mode 100644 index e39e12ea444383051c82ed3fe05e79d21c64169e..0000000000000000000000000000000000000000 --- a/voicevox_engine/requirements-build.txt +++ /dev/null @@ -1,37 +0,0 @@ -altgraph==0.17.4 ; python_version >= "3.11" and python_version < "3.12" -annotated-types==0.6.0 ; python_version >= "3.11" and python_version < "3.12" -anyio==4.3.0 ; python_version >= "3.11" and python_version < "3.12" -cffi==1.16.0 ; python_version >= "3.11" and python_version < "3.12" -click==8.1.7 ; python_version >= "3.11" and python_version < "3.12" -colorama==0.4.6 ; python_version >= "3.11" and python_version < "3.12" and platform_system == "Windows" -cython==3.0.10 ; python_version >= "3.11" and python_version < "3.12" -fastapi-slim==0.111.0 ; python_version >= "3.11" and python_version < "3.12" -h11==0.14.0 ; python_version >= "3.11" and python_version < "3.12" -idna==3.7 ; python_version >= "3.11" and python_version < "3.12" -jinja2==3.1.4 ; python_version >= "3.11" and python_version < "3.12" -macholib==1.16.3 ; python_version >= "3.11" and python_version < "3.12" and sys_platform == "darwin" -markupsafe==2.1.5 ; python_version >= "3.11" and python_version < "3.12" -numpy==1.26.4 ; python_version >= "3.11" and python_version < "3.12" -packaging==24.0 ; python_version >= "3.11" and python_version < "3.12" -pefile==2023.2.7 ; python_version >= "3.11" and python_version < "3.12" and sys_platform == "win32" -platformdirs==4.2.2 ; python_version >= "3.11" and python_version < "3.12" -pycparser==2.22 ; python_version >= "3.11" and python_version < "3.12" -pydantic-core==2.18.4 ; python_version >= "3.11" and python_version < "3.12" -pydantic==2.7.3 ; python_version >= "3.11" and python_version < "3.12" -pyinstaller-hooks-contrib==2024.6 ; python_version >= "3.11" and python_version < "3.12" -pyinstaller==5.13.2 ; python_version >= "3.11" and python_version < "3.12" -pyopenjtalk @ git+https://github.com/VOICEVOX/pyopenjtalk@b35fc89fe42948a28e33aed886ea145a51113f88 ; python_version >= "3.11" and python_version < "3.12" -python-multipart==0.0.9 ; python_version >= "3.11" and python_version < "3.12" -pywin32-ctypes==0.2.2 ; python_version >= "3.11" and python_version < "3.12" and sys_platform == "win32" -pyworld==0.3.4 ; python_version >= "3.11" and python_version < "3.12" -pyyaml==6.0.1 ; python_version >= "3.11" and python_version < "3.12" -semver==3.0.2 ; python_version >= "3.11" and python_version < "3.12" -setuptools==69.5.1 ; python_version >= "3.11" and python_version < "3.12" -six==1.16.0 ; python_version >= "3.11" and python_version < "3.12" -sniffio==1.3.1 ; python_version >= "3.11" and python_version < "3.12" -soundfile==0.12.1 ; python_version >= "3.11" and python_version < "3.12" -soxr==0.3.7 ; python_version >= "3.11" and python_version < "3.12" -starlette==0.37.2 ; python_version >= "3.11" and python_version < "3.12" -tqdm==4.66.4 ; python_version >= "3.11" and python_version < "3.12" -typing-extensions==4.11.0 ; python_version >= "3.11" and python_version < "3.12" -uvicorn==0.29.0 ; python_version >= "3.11" and python_version < "3.12" diff --git a/voicevox_engine/requirements-dev.txt b/voicevox_engine/requirements-dev.txt deleted file mode 100644 index e2f52c35f203c09da4ad4c4c8bf7c1c55449d383..0000000000000000000000000000000000000000 --- a/voicevox_engine/requirements-dev.txt +++ /dev/null @@ -1,115 +0,0 @@ -annotated-types==0.6.0 ; python_version >= "3.11" and python_version < "3.12" -anyio==4.3.0 ; python_version >= "3.11" and python_version < "3.12" -attrs==23.2.0 ; python_version >= "3.11" and python_version < "3.12" -authlib==1.3.0 ; python_version >= "3.11" and python_version < "3.12" -black==24.4.2 ; python_version >= "3.11" and python_version < "3.12" -build==1.2.1 ; python_version >= "3.11" and python_version < "3.12" -cachecontrol[filecache]==0.14.0 ; python_version >= "3.11" and python_version < "3.12" -certifi==2024.2.2 ; python_version >= "3.11" and python_version < "3.12" -cffi==1.16.0 ; python_version >= "3.11" and python_version < "3.12" -cfgv==3.4.0 ; python_version >= "3.11" and python_version < "3.12" -charset-normalizer==3.3.2 ; python_version >= "3.11" and python_version < "3.12" -cleo==2.1.0 ; python_version >= "3.11" and python_version < "3.12" -click==8.1.7 ; python_version >= "3.11" and python_version < "3.12" -colorama==0.4.6 ; python_version >= "3.11" and python_version < "3.12" and (sys_platform == "win32" or platform_system == "Windows" or os_name == "nt") -colorlog==4.8.0 ; python_version >= "3.11" and python_version < "3.12" -coverage==6.5.0 ; python_version >= "3.11" and python_version < "3.12" -coveralls==3.3.1 ; python_version >= "3.11" and python_version < "3.12" -crashtest==0.4.1 ; python_version >= "3.11" and python_version < "3.12" -cryptography==42.0.7 ; python_version >= "3.11" and python_version < "3.12" -cython==3.0.10 ; python_version >= "3.11" and python_version < "3.12" -dacite==1.8.1 ; python_version >= "3.11" and python_version < "3.12" -distlib==0.3.8 ; python_version >= "3.11" and python_version < "3.12" -docopt==0.6.2 ; python_version >= "3.11" and python_version < "3.12" -dparse==0.6.4b0 ; python_version >= "3.11" and python_version < "3.12" -dulwich==0.21.7 ; python_version >= "3.11" and python_version < "3.12" -fastapi-slim==0.111.0 ; python_version >= "3.11" and python_version < "3.12" -fastjsonschema==2.19.1 ; python_version >= "3.11" and python_version < "3.12" -filelock==3.14.0 ; python_version >= "3.11" and python_version < "3.12" -flake8-bugbear==24.4.26 ; python_version >= "3.11" and python_version < "3.12" -flake8==7.0.0 ; python_version >= "3.11" and python_version < "3.12" -gitdb==4.0.11 ; python_version >= "3.11" and python_version < "3.12" -gitpython==3.1.43 ; python_version >= "3.11" and python_version < "3.12" -h11==0.14.0 ; python_version >= "3.11" and python_version < "3.12" -httpcore==1.0.5 ; python_version >= "3.11" and python_version < "3.12" -httpx==0.27.0 ; python_version >= "3.11" and python_version < "3.12" -identify==2.5.36 ; python_version >= "3.11" and python_version < "3.12" -idna==3.7 ; python_version >= "3.11" and python_version < "3.12" -importlib-metadata==7.1.0 ; python_version >= "3.11" and python_version < "3.12" -iniconfig==2.0.0 ; python_version >= "3.11" and python_version < "3.12" -installer==0.7.0 ; python_version >= "3.11" and python_version < "3.12" -isort==5.13.2 ; python_version >= "3.11" and python_version < "3.12" -jaraco-classes==3.4.0 ; python_version >= "3.11" and python_version < "3.12" -jeepney==0.8.0 ; python_version >= "3.11" and python_version < "3.12" and sys_platform == "linux" -jinja2==3.1.4 ; python_version >= "3.11" and python_version < "3.12" -keyring==24.3.1 ; python_version >= "3.11" and python_version < "3.12" -markdown-it-py==3.0.0 ; python_version >= "3.11" and python_version < "3.12" -markupsafe==2.1.5 ; python_version >= "3.11" and python_version < "3.12" -marshmallow==3.21.2 ; python_version >= "3.11" and python_version < "3.12" -mccabe==0.7.0 ; python_version >= "3.11" and python_version < "3.12" -mdurl==0.1.2 ; python_version >= "3.11" and python_version < "3.12" -more-itertools==10.2.0 ; python_version >= "3.11" and python_version < "3.12" -msgpack==1.0.8 ; python_version >= "3.11" and python_version < "3.12" -mypy-extensions==1.0.0 ; python_version >= "3.11" and python_version < "3.12" -mypy==1.10.0 ; python_version >= "3.11" and python_version < "3.12" -nodeenv==1.8.0 ; python_version >= "3.11" and python_version < "3.12" -numpy==1.26.4 ; python_version >= "3.11" and python_version < "3.12" -packaging==24.0 ; python_version >= "3.11" and python_version < "3.12" -pathspec==0.12.1 ; python_version >= "3.11" and python_version < "3.12" -pexpect==4.9.0 ; python_version >= "3.11" and python_version < "3.12" -pip-licenses==4.4.0 ; python_version >= "3.11" and python_version < "3.12" -pkginfo==1.10.0 ; python_version >= "3.11" and python_version < "3.12" -platformdirs==4.2.2 ; python_version >= "3.11" and python_version < "3.12" -pluggy==1.5.0 ; python_version >= "3.11" and python_version < "3.12" -poetry-core==1.9.0 ; python_version >= "3.11" and python_version < "3.12" -poetry-plugin-export==1.8.0 ; python_version >= "3.11" and python_version < "3.12" -poetry==1.8.2 ; python_version >= "3.11" and python_version < "3.12" -pre-commit==2.21.0 ; python_version >= "3.11" and python_version < "3.12" -prettytable==3.10.0 ; python_version >= "3.11" and python_version < "3.12" -ptyprocess==0.7.0 ; python_version >= "3.11" and python_version < "3.12" -pycodestyle==2.11.1 ; python_version >= "3.11" and python_version < "3.12" -pycparser==2.22 ; python_version >= "3.11" and python_version < "3.12" -pydantic-core==2.18.4 ; python_version >= "3.11" and python_version < "3.12" -pydantic==2.7.3 ; python_version >= "3.11" and python_version < "3.12" -pyflakes==3.2.0 ; python_version >= "3.11" and python_version < "3.12" -pygments==2.18.0 ; python_version >= "3.11" and python_version < "3.12" -pyopenjtalk @ git+https://github.com/VOICEVOX/pyopenjtalk@b35fc89fe42948a28e33aed886ea145a51113f88 ; python_version >= "3.11" and python_version < "3.12" -pyproject-hooks==1.1.0 ; python_version >= "3.11" and python_version < "3.12" -pysen==0.11.0 ; python_version >= "3.11" and python_version < "3.12" -pytest==8.2.0 ; python_version >= "3.11" and python_version < "3.12" -python-multipart==0.0.9 ; python_version >= "3.11" and python_version < "3.12" -pywin32-ctypes==0.2.2 ; python_version >= "3.11" and python_version < "3.12" and sys_platform == "win32" -pyworld==0.3.4 ; python_version >= "3.11" and python_version < "3.12" -pyyaml==6.0.1 ; python_version >= "3.11" and python_version < "3.12" -rapidfuzz==3.9.0 ; python_version >= "3.11" and python_version < "3.12" -requests-toolbelt==1.0.0 ; python_version >= "3.11" and python_version < "3.12" -requests==2.31.0 ; python_version >= "3.11" and python_version < "3.12" -rich==13.7.1 ; python_version >= "3.11" and python_version < "3.12" -ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.12" and python_version >= "3.11" -ruamel-yaml==0.18.6 ; python_version >= "3.11" and python_version < "3.12" -safety-schemas==0.0.2 ; python_version >= "3.11" and python_version < "3.12" -safety==3.2.0 ; python_version >= "3.11" and python_version < "3.12" -secretstorage==3.3.3 ; python_version >= "3.11" and python_version < "3.12" and sys_platform == "linux" -semver==3.0.2 ; python_version >= "3.11" and python_version < "3.12" -setuptools==69.5.1 ; python_version >= "3.11" and python_version < "3.12" -shellingham==1.5.4 ; python_version >= "3.11" and python_version < "3.12" -six==1.16.0 ; python_version >= "3.11" and python_version < "3.12" -smmap==5.0.1 ; python_version >= "3.11" and python_version < "3.12" -sniffio==1.3.1 ; python_version >= "3.11" and python_version < "3.12" -soundfile==0.12.1 ; python_version >= "3.11" and python_version < "3.12" -soxr==0.3.7 ; python_version >= "3.11" and python_version < "3.12" -starlette==0.37.2 ; python_version >= "3.11" and python_version < "3.12" -syrupy==4.6.1 ; python_version >= "3.11" and python_version < "3.12" -tomlkit==0.12.5 ; python_version >= "3.11" and python_version < "3.12" -tqdm==4.66.4 ; python_version >= "3.11" and python_version < "3.12" -trove-classifiers==2024.4.10 ; python_version >= "3.11" and python_version < "3.12" -typer==0.12.3 ; python_version >= "3.11" and python_version < "3.12" -types-pyyaml==6.0.12.20240311 ; python_version >= "3.11" and python_version < "3.12" -typing-extensions==4.11.0 ; python_version >= "3.11" and python_version < "3.12" -unidiff==0.7.5 ; python_version >= "3.11" and python_version < "3.12" -urllib3==2.2.1 ; python_version >= "3.11" and python_version < "3.12" -uvicorn==0.29.0 ; python_version >= "3.11" and python_version < "3.12" -virtualenv==20.26.2 ; python_version >= "3.11" and python_version < "3.12" -wcwidth==0.2.13 ; python_version >= "3.11" and python_version < "3.12" -xattr==1.1.0 ; python_version >= "3.11" and python_version < "3.12" and sys_platform == "darwin" -zipp==3.18.1 ; python_version >= "3.11" and python_version < "3.12" diff --git a/voicevox_engine/requirements.txt b/voicevox_engine/requirements.txt deleted file mode 100644 index ff5c8e3b1ecaa9a8d9dad9622edd3c4055023b87..0000000000000000000000000000000000000000 --- a/voicevox_engine/requirements.txt +++ /dev/null @@ -1,29 +0,0 @@ -annotated-types==0.6.0 ; python_version >= "3.11" and python_version < "3.12" -anyio==4.3.0 ; python_version >= "3.11" and python_version < "3.12" -cffi==1.16.0 ; python_version >= "3.11" and python_version < "3.12" -click==8.1.7 ; python_version >= "3.11" and python_version < "3.12" -colorama==0.4.6 ; python_version >= "3.11" and python_version < "3.12" and platform_system == "Windows" -cython==3.0.10 ; python_version >= "3.11" and python_version < "3.12" -fastapi-slim==0.111.0 ; python_version >= "3.11" and python_version < "3.12" -h11==0.14.0 ; python_version >= "3.11" and python_version < "3.12" -idna==3.7 ; python_version >= "3.11" and python_version < "3.12" -jinja2==3.1.4 ; python_version >= "3.11" and python_version < "3.12" -markupsafe==2.1.5 ; python_version >= "3.11" and python_version < "3.12" -numpy==1.26.4 ; python_version >= "3.11" and python_version < "3.12" -platformdirs==4.2.2 ; python_version >= "3.11" and python_version < "3.12" -pycparser==2.22 ; python_version >= "3.11" and python_version < "3.12" -pydantic-core==2.18.4 ; python_version >= "3.11" and python_version < "3.12" -pydantic==2.7.3 ; python_version >= "3.11" and python_version < "3.12" -pyopenjtalk @ git+https://github.com/VOICEVOX/pyopenjtalk@b35fc89fe42948a28e33aed886ea145a51113f88 ; python_version >= "3.11" and python_version < "3.12" -python-multipart==0.0.9 ; python_version >= "3.11" and python_version < "3.12" -pyworld==0.3.4 ; python_version >= "3.11" and python_version < "3.12" -pyyaml==6.0.1 ; python_version >= "3.11" and python_version < "3.12" -semver==3.0.2 ; python_version >= "3.11" and python_version < "3.12" -six==1.16.0 ; python_version >= "3.11" and python_version < "3.12" -sniffio==1.3.1 ; python_version >= "3.11" and python_version < "3.12" -soundfile==0.12.1 ; python_version >= "3.11" and python_version < "3.12" -soxr==0.3.7 ; python_version >= "3.11" and python_version < "3.12" -starlette==0.37.2 ; python_version >= "3.11" and python_version < "3.12" -tqdm==4.66.4 ; python_version >= "3.11" and python_version < "3.12" -typing-extensions==4.11.0 ; python_version >= "3.11" and python_version < "3.12" -uvicorn==0.29.0 ; python_version >= "3.11" and python_version < "3.12" diff --git a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/icons/8.png b/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/icons/8.png deleted file mode 100644 index 4cee4b8062d297f0e69218ecd2022890b333a013..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/icons/8.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/metas.json b/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/metas.json deleted file mode 100644 index 577af6f5806b6294acccfdf500a0ba2df2d26f76..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/metas.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "supported_features": { "permitted_synthesis_morphing": "NOTHING" } -} diff --git a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/policy.md b/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/policy.md deleted file mode 100644 index 32a15afd7544b8cfecb727231432376aa8c9917e..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/policy.md +++ /dev/null @@ -1,3 +0,0 @@ -dummy3 policy - -https://voicevox.hiroshiba.jp/ diff --git a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/portrait.png b/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/portrait.png deleted file mode 100644 index f0d2a7254107ceb2f2b0767f4d17d0127c0330ea..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/portrait.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/portraits/8.png b/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/portraits/8.png deleted file mode 100644 index c399d6cb936b8778fa692ea2dc726cb0ee3c57d8..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/portraits/8.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/voice_samples/8_001.wav b/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/voice_samples/8_001.wav deleted file mode 100644 index 6afbb4e3a695e2535dbbee75fb445c102cd2603f..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/voice_samples/8_001.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/voice_samples/8_002.wav b/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/voice_samples/8_002.wav deleted file mode 100644 index aeea8d2445485529ee02f59b20ac09860e8e6999..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/voice_samples/8_002.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/voice_samples/8_003.wav b/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/voice_samples/8_003.wav deleted file mode 100644 index 2419bd9d9e7508a89d28d666706b5637340054af..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/35b2c544-660e-401e-b503-0e14c635303a/voice_samples/8_003.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/1.png b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/1.png deleted file mode 100644 index 11af05543fbd6b1b255800190d6ef2d48f2f0c89..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/1.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/3.png b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/3.png deleted file mode 100644 index ff5032e911b1072232befd347efc6b8ae9e45b9e..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/3.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/5.png b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/5.png deleted file mode 100644 index 3452a88fa39c935c056b26d933693e8cd24aefba..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/5.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/7.png b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/7.png deleted file mode 100644 index 63b1e7e53296b1bc02366b0ecfba997ae5b0bde2..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/icons/7.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/metas.json b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/metas.json deleted file mode 100644 index 41570a1fc2e6b3f1ca0592a92ab71daf30f342d7..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/metas.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "supported_features": { "permitted_synthesis_morphing": "SELF_ONLY" } -} diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/policy.md b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/policy.md deleted file mode 100644 index 0328c63112a40f44145440562c8fe2d56ac86e38..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/policy.md +++ /dev/null @@ -1,3 +0,0 @@ -dummy2 policy - -https://voicevox.hiroshiba.jp/ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/portrait.png b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/portrait.png deleted file mode 100644 index 23970a6c67453ea010e837b97319d8497bdf0eff..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/portrait.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/portraits/3.png b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/portraits/3.png deleted file mode 100644 index 8431858d7cc7a5d8f66720655e439e073d5b2f99..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/portraits/3.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/1_001.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/1_001.wav deleted file mode 100644 index 9b5bfa40f60526592528969635af09e3ddcebe81..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/1_001.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/1_002.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/1_002.wav deleted file mode 100644 index 8736022ccc10942df0cefbdf844972009663207c..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/1_002.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/1_003.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/1_003.wav deleted file mode 100644 index 3730464daeadd58085becdedd0cf0188d4dffcc8..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/1_003.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/3_001.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/3_001.wav deleted file mode 100644 index 507acbaa6faf3d520b8b3dbe705571d51a4bf99c..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/3_001.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/3_002.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/3_002.wav deleted file mode 100644 index e14d80bcbcde0819dcb262bf2bfc118ddd1e8cb7..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/3_002.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/3_003.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/3_003.wav deleted file mode 100644 index 8d42657c680e14589bc8e8f90ef1c52f92959107..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/3_003.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/5_001.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/5_001.wav deleted file mode 100644 index c616d692a65affdff488d9aef53b34cc1b32232e..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/5_001.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/5_002.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/5_002.wav deleted file mode 100644 index 4086db4809326bd6689cb34ef8859fb49f862499..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/5_002.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/5_003.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/5_003.wav deleted file mode 100644 index d3823d9fd2fcbd4c46ab3d6547cdcbeb735bccf2..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/5_003.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/7_001.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/7_001.wav deleted file mode 100644 index 88194d7e260bd62dd92f819a0d0e3deed852788b..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/7_001.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/7_002.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/7_002.wav deleted file mode 100644 index 61d5a7eae88985a23b1e0b318dc26c75f33c88dc..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/7_002.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/7_003.wav b/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/7_003.wav deleted file mode 100644 index 71fcdbeaa2b495fe56bf894ddd9c89e9ab21ae00..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/388f246b-8c41-4ac1-8e2d-5d79f3ff56d9/voice_samples/7_003.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/0.png b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/0.png deleted file mode 100644 index 84cc0f222215ec00a1554c827913be8b283ff7da..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/0.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/2.png b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/2.png deleted file mode 100644 index ffd29cc5196663b95e74fda71fadd7c223bb6fbb..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/2.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/4.png b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/4.png deleted file mode 100644 index 722a466f498371a81f8d12989695a27316cc9c6f..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/4.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/6.png b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/6.png deleted file mode 100644 index 1f6d0e107939be97d85768952d4ff96497b83d11..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/icons/6.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/metas.json b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/metas.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/metas.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/policy.md b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/policy.md deleted file mode 100644 index c9bcc2cea42f727c8e43c934fc38163144848882..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/policy.md +++ /dev/null @@ -1,3 +0,0 @@ -dummy1 policy - -https://voicevox.hiroshiba.jp/ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portrait.png b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portrait.png deleted file mode 100644 index 74af491ccb22a442aec8064cc9ffc06f9305b35a..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portrait.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/0.png b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/0.png deleted file mode 100644 index 0ad715aa946adbae1e0f412341e071796da94056..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/0.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/2.png b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/2.png deleted file mode 100644 index 07c5503cc153e015c7a01009a592758d2b03fe7d..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/2.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/4.png b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/4.png deleted file mode 100644 index 88810bbcfa672bd4823551b42404039f2b37bd2d..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/4.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/6.png b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/6.png deleted file mode 100644 index b681cde2bad3b1dd738f5bd9ecd0282a5db5f4f9..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/portraits/6.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/0_001.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/0_001.wav deleted file mode 100644 index ac83689ca80dbbfc9971991da4180673ef0b2de2..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/0_001.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/0_002.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/0_002.wav deleted file mode 100644 index 85069f834e8275c5e25abdc2ea3f91f9a30e4858..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/0_002.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/0_003.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/0_003.wav deleted file mode 100644 index d052174cd253e77013e29e3cb2fe132f58f15553..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/0_003.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/2_001.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/2_001.wav deleted file mode 100644 index 2051995d4a11e1e50f5446d4047023b876876e50..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/2_001.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/2_002.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/2_002.wav deleted file mode 100644 index 3b9b8a842d0544905c2875c5bd51ac7274542c6d..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/2_002.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/2_003.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/2_003.wav deleted file mode 100644 index cc30278ba73d38666d84ed296062e3b17256e1ec..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/2_003.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/4_001.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/4_001.wav deleted file mode 100644 index 06a048df4bbed3e6df8333e80e8fc1ecb8bb7071..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/4_001.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/4_002.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/4_002.wav deleted file mode 100644 index 4430e6bcc7f9ef30ae099f026314163001be2271..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/4_002.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/4_003.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/4_003.wav deleted file mode 100644 index 83bb44af0ffb1d487608d8819a40ee32da69f11c..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/4_003.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/6_001.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/6_001.wav deleted file mode 100644 index 2385a1b188da76509d7837c3c9cda38bea5968c5..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/6_001.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/6_002.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/6_002.wav deleted file mode 100644 index ff8c6c6b3d106e865e23a42c690258b8cec1295f..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/6_002.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/6_003.wav b/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/6_003.wav deleted file mode 100644 index a671ac74038e0c40e973940ff2f9cb1379a352e9..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff/voice_samples/6_003.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/icons/9.png b/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/icons/9.png deleted file mode 100644 index 5616d057b7f0333858eec97bad1cc4cf9616af7e..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/icons/9.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/metas.json b/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/metas.json deleted file mode 100644 index 218fe4c1f710f9c31f7825b11fa259acf5a9758b..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/metas.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "supported_features": { "permitted_synthesis_morphing": "ALL" } -} diff --git a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/policy.md b/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/policy.md deleted file mode 100644 index 68114802c449a6799db4cf7aae3cecbb71db0e70..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/policy.md +++ /dev/null @@ -1,3 +0,0 @@ -dummy4 policy - -https://voicevox.hiroshiba.jp/ diff --git a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/portrait.png b/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/portrait.png deleted file mode 100644 index 0d529a93d905b670170ba2f442f7e13388137b80..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/portrait.png and /dev/null differ diff --git a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/voice_samples/9_001.wav b/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/voice_samples/9_001.wav deleted file mode 100644 index 9b7ee16f079f21336ced2650f727c2c4b5db27be..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/voice_samples/9_001.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/voice_samples/9_002.wav b/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/voice_samples/9_002.wav deleted file mode 100644 index 0e95e7a82c8db7fdce3e8968778ea61fa3a1f4b1..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/voice_samples/9_002.wav and /dev/null differ diff --git a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/voice_samples/9_003.wav b/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/voice_samples/9_003.wav deleted file mode 100644 index 83cdf67f7387293b5810f50a346dcfa95f866f4f..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/character_info/b1a81618-b27b-40d2-b0ea-27a9ad408c4b/voice_samples/9_003.wav and /dev/null differ diff --git a/voicevox_engine/resources/default.csv b/voicevox_engine/resources/default.csv deleted file mode 100644 index c67ed8c69ed5963f061bbefb0c2f06d38d6bcec0..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/default.csv +++ /dev/null @@ -1,75 +0,0 @@ -あいえるたん,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,アイエルタン,アイエルタン,0/6,C1 -藍田,1350,1350,5000,名詞,固有名詞,人名,姓,*,*,*,アイダ,アイダ,0/3,C1 -朱司,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,アカシ,アカシ,1/3,C1 -青山,1350,1350,5000,名詞,固有名詞,人名,姓,*,*,*,アオヤマ,アオヤマ,2/4,C1 -雨晴,1350,1350,7000,名詞,固有名詞,人名,姓,*,*,*,アメハレ,アメハレ,2/4,C1 -アル,1351,1351,7000,名詞,固有名詞,人名,名,*,*,*,アル,アル,1/2,C1 -うさぎ,1351,1351,7000,名詞,固有名詞,人名,名,*,*,*,ウサギ,ウサギ,0/3,C1 -櫻歌,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,オウカ,オーカ,1/3,C1 -音街,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,オトマチ,オトマチ,2/4,C1 -春日部,1350,1350,8600,名詞,固有名詞,人名,姓,*,*,*,カスカベ,カスカベ,0/4,C1 -麒ヶ島,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,キガシマ,キガシマ,2/4,C1 -紲星,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,キズナ,キズナ,1/3,C1 -九州,1350,1350,8600,名詞,固有名詞,人名,姓,*,*,*,キュウシュウ,キュウシュウ,1/4,C1 -キョウコ,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,キョオコ,キョオコ,1/3,C1 -栗田,1350,1350,5000,名詞,固有名詞,人名,姓,*,*,*,クリタ,クリタ,1/3,C1 -玄野,1350,1350,5000,名詞,固有名詞,人名,姓,*,*,*,クロノ,クロノ,1/3,C1 -剣崎,1350,1350,5000,名詞,固有名詞,人名,姓,*,*,*,ケンザキ,ケンザキ,1/4,C1 -後鬼,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,ゴキ,ゴキ,1/2,C1 -虎太郎,1351,1351,5000,名詞,固有名詞,人名,名,*,*,*,コタロウ,コタロー,4/4,C1 -琴葉,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,コトノハ,コトノハ,0/4,C1 -琴詠,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,コトヨミ,コトヨミ,0/4,C1 -小夜,1351,1351,2200,名詞,固有名詞,人名,名,*,*,*,サヨ,サヨ,1/2,C1 -四国,1350,1350,2200,名詞,固有名詞,人名,姓,*,*,*,シコク,シコク,1/3,C1 -白上,1350,1350,5000,名詞,固有名詞,人名,姓,*,*,*,シラカミ,シラカミ,4/4,C1 -ずんだもん,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,ズンダモン,ズンダモン,1/5,C1 -そら,1351,1351,7000,名詞,固有名詞,人名,名,*,*,*,ソラ,ソラ,1/2,C1 -宗麟,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,ソウリン,ソウリン,1/4,C1 -タイプT,1351,1351,5000,名詞,固有名詞,人名,名,*,*,*,タイプティー,タイプティー,4/5,C1 -中国,1350,1350,8600,名詞,固有名詞,人名,姓,*,*,*,チュウゴク,チュウゴク,1/4,C1 -波音,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,ナミネ,ナミネ,0/3,C1 -武宏,1351,1351,5000,名詞,固有名詞,人名,名,*,*,*,タケヒロ,タケヒロ,2/4,C1 -ちび式じい,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,チビシキジー,チビシキジー,5/6,C1 -月読,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,ツクヨミ,ツクヨミ,0/4,C1 -つむぎ,1351,1351,7450,名詞,固有名詞,人名,名,*,*,*,ツムギ,ツムギ,0/3,C1 -ナースロボ,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,ナースロボ,ナースロボ,4/5,C1 -ナナ,1351,1351,8600,名詞,固有名詞,人名,名,*,*,*,ナナ,ナナ,1/2,C1 -No.7,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,ナンバーセブン,ナンバーセブン,5/7,C1 -ニア,1351,1351,5000,名詞,固有名詞,人名,名,*,*,*,ニア,ニア,1/2,C1 -猫使,1350,1350,2200,名詞,固有名詞,人名,姓,*,*,*,ネコツカ,ネコツカ,2/4,C1 -ノエル,1351,1351,7450,名詞,固有名詞,人名,名,*,*,*,ノエル,ノエル,1/3,C1 -はう,1351,1351,5000,名詞,固有名詞,人名,名,*,*,*,ハウ,ハウ,1/2,C1 -花丸,1351,1351,8600,名詞,固有名詞,人名,名,*,*,*,ハナマル,ハナマル,0/4,C1 -春歌,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,ハルカ,ハルカ,1/3,C1 -桜乃,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,ハルノ,ハルノ,1/3,C1 -ビィ,1351,1351,7000,名詞,固有名詞,人名,名,*,*,*,ビー,ビー,1/2,C1 -ひまり,1351,1351,7000,名詞,固有名詞,人名,名,*,*,*,ヒマリ,ヒマリ,0/3,C1 -紅桜,1351,1351,7000,名詞,固有名詞,人名,名,*,*,*,ベニザクラ,ベニザクラ,3/5,C1 -聖騎士,1350,1350,8600,名詞,固有名詞,人名,姓,*,*,*,ホーリーナイト,ホーリーナイト,5/7,C1 -WhiteCUL,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,ホワイトカル,ホワイトカル,5/6,C1 -まろん,1351,1351,7450,名詞,固有名詞,人名,名,*,*,*,マロン,マロン,1/3,C1 -満別,1350,1350,8600,名詞,固有名詞,人名,姓,*,*,*,マンベツ,マンベツ,1/4,C1 -ミコ,1351,1351,3900,名詞,固有名詞,人名,名,*,*,*,ミコ,ミコ,1/2,C1 -水奈瀬,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,ミナセ,ミナセ,2/3,C1 -冥鳴,1350,1350,5000,名詞,固有名詞,人名,姓,*,*,*,メイメイ,メイメイ,1/4,C1 -鳴花,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,メイカ,メイカ,1/3,C1 -めたん,1351,1351,7000,名詞,固有名詞,人名,名,*,*,*,メタン,メタン,1/3,C1 -雌雄,1351,1351,8600,名詞,固有名詞,人名,名,*,*,*,メスオ,メスオ,0/3,C1 -もち子さん,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,モチコサン,モチコサン,1/5,C1 -モチノ,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,モチノ,モチノ,0/3,C1 -結月,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,ユヅキ,ユヅキ,1/3,C1 -弓鶴,1351,1351,0,名詞,固有名詞,人名,名,*,*,*,ユヅル,ユヅル,0/3,C1 -リツ,1351,1351,3900,名詞,固有名詞,人名,名,*,*,*,リツ,リツ,1/2,C1 -六花,1351,1351,4900,名詞,固有名詞,人名,名,*,*,*,リッカ,リッカ,1/3,C1 -龍星,1351,1351,5000,名詞,固有名詞,人名,名,*,*,*,リュウセイ,リュウセイ,1/4,C1 -雀松,1350,1350,0,名詞,固有名詞,人名,姓,*,*,*,ワカマツ,ワカマツ,2/4,C1 -COEIROINK,1348,1348,0,名詞,固有名詞,一般,*,*,*,*,コエイロインク,コエイロインク,5/7,C1 -coeiroink,1348,1348,0,名詞,固有名詞,一般,*,*,*,*,コエイロインク,コエイロインク,5/7,C1 -CoeFont,1348,1348,0,名詞,固有名詞,一般,*,*,*,*,コエフォント,コエフォント,3/5,C1 -coefont,1348,1348,0,名詞,固有名詞,一般,*,*,*,*,コエフォント,コエフォント,3/5,C1 -Nemo,1348,1348,0,名詞,固有名詞,一般,*,*,*,*,ネモ,ネモ,1/2,C1 -nemo,1348,1348,0,名詞,固有名詞,一般,*,*,*,*,ネモ,ネモ,1/2,C1 -TALQu,1348,1348,0,名詞,固有名詞,一般,*,*,*,*,トーク,トーク,0/3,C1 -talqu,1348,1348,0,名詞,固有名詞,一般,*,*,*,*,トーク,トーク,0/3,C1 -VOICEVOX,1348,1348,0,名詞,固有名詞,一般,*,*,*,*,ボイスボックス,ボイスボックス,4/7,C1 -voicevox,1348,1348,0,名詞,固有名詞,一般,*,*,*,*,ボイスボックス,ボイスボックス,4/7,C1 diff --git a/voicevox_engine/resources/engine_manifest_assets/dependency_licenses.json b/voicevox_engine/resources/engine_manifest_assets/dependency_licenses.json deleted file mode 100644 index 875de0f80d5cd0986e56248dba2a011702628c14..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/engine_manifest_assets/dependency_licenses.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "name": "dummy library", - "version": "0.0.1", - "license": "dummy license", - "text": "dummy license text" - } -] \ No newline at end of file diff --git a/voicevox_engine/resources/engine_manifest_assets/downloadable_libraries.json b/voicevox_engine/resources/engine_manifest_assets/downloadable_libraries.json deleted file mode 100644 index 954786200326db91b9bbcebc794b66d993a5b2e9..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/engine_manifest_assets/downloadable_libraries.json +++ /dev/null @@ -1,44 +0,0 @@ -[ - { - "name": "Dummy Library", - "uuid": "2bb8bccf-1c3f-4bc9-959a-f388e37af3ad", - "version": "0.0.1", - "download_url": "https://github.com/VOICEVOX/voicevox_engine/archive/d7cf31c058bc83e1abf8e14d4231a06409c4cc2d.zip", - "bytes": 1000, - "speakers": [ - { - "speaker": { - "name": "dummy1", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "styles": [ - { - "name": "style1", - "id": 0 - }, - { - "name": "style2", - "id": 2 - } - ], - "version": "0.0.1" - }, - "speaker_info": { - "policy": "", - "portrait": "", - "style_infos": [ - { - "id": 0, - "icon": "", - "voice_samples": ["", "", ""] - }, - { - "id": 2, - "icon": "", - "voice_samples": ["", "", ""] - } - ] - } - } - ] - } -] diff --git a/voicevox_engine/resources/engine_manifest_assets/icon.png b/voicevox_engine/resources/engine_manifest_assets/icon.png deleted file mode 100644 index 98064f347fdf8bd4fe42098c79ad293f291d40c8..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/resources/engine_manifest_assets/icon.png and /dev/null differ diff --git a/voicevox_engine/resources/engine_manifest_assets/terms_of_service.md b/voicevox_engine/resources/engine_manifest_assets/terms_of_service.md deleted file mode 100644 index c97bb512c679e98b7685a3b3d7013497ca280954..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/engine_manifest_assets/terms_of_service.md +++ /dev/null @@ -1 +0,0 @@ -dummy teams of service \ No newline at end of file diff --git a/voicevox_engine/resources/engine_manifest_assets/update_infos.json b/voicevox_engine/resources/engine_manifest_assets/update_infos.json deleted file mode 100644 index 4ecab160785d103cd9048613d8fb49f9a48e996d..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/engine_manifest_assets/update_infos.json +++ /dev/null @@ -1,187 +0,0 @@ -[ - { - "version": "0.19.1", - "descriptions": ["キャラクター「後鬼」のスタイルを追加"], - "contributors": [] - }, - { - "version": "0.19.0", - "descriptions": ["ソング:音量取得APIを追加", "開発環境の向上"], - "contributors": ["sabonerune", "tarepan", "y-chan"] - }, - { - "version": "0.18.1", - "descriptions": [ - "キャラクター「†聖騎士 紅桜†」「雀松朱司」「麒ヶ島宗麟」「春歌ナナ」「猫使アル」「猫使ビィ」「中国うさぎ」のハミングを追加", - "キャラクター「栗田まろん」「あいえるたん」「満別花丸」「琴詠ニア」のハミングを追加", - "起動に必要なメモリ量を大幅に削減" - ], - "contributors": ["Hiroshiba", "qryxip"] - }, - { - "version": "0.18.0", - "descriptions": [ - "キャラクター「WhiteCUL」「後鬼」「No.7」のハミングを追加", - "キャラクター「ちび式じい」「櫻歌ミコ」「小夜/SAYO」「ナースロボ_タイプT」のハミングを追加", - "キャラクター「四国めたん」「ずんだもん」「波音リツ」のハミングスタイルを追加", - "デフォルトで全てのCPUを使うことがあるバグを修正", - "デフォルトで127.0.0.1と::1を待ち受けるように変更", - "開発環境の向上" - ], - "contributors": [ - "Hiroshiba", - "sabonerune", - "siketyan", - "tarepan", - "tomoish" - ] - }, - { - "version": "0.17.1", - "descriptions": [ - "キャラクター「玄野武宏」「白上虎太郎」「青山龍星」「冥鳴ひまり」「九州そら」のハミングを追加", - "キャラクター「もち子さん」「剣崎雌雄」のハミングを追加", - "バグ修正" - ], - "contributors": ["PickledChair"] - }, - { - "version": "0.17.0", - "descriptions": ["開発環境の向上"], - "contributors": ["Hiroshiba", "misogihagi", "tarepan", "tuna2134"] - }, - { - "version": "0.16.0", - "descriptions": [ - "ソングAPIを追加", - "キャラクター「四国めたん」「ずんだもん」「春日部つむぎ」「雨晴はう」「波音リツ」のハミングを追加", - "キャラクター「波音リツ」のソングを追加" - ], - "contributors": ["Hiroshiba", "y-chan"] - }, - { - "version": "0.15.1", - "descriptions": ["ビルド成果物のディレクトリ構造を元に戻した"], - "contributors": [] - }, - { - "version": "0.15.0", - "descriptions": [ - "/validate_kana APIを追加", - "起動時のエンジン設定項目追加", - "ユーザー辞書のインポート・エクスポート機能追加", - "ビルド成果物のディレクトリ構造を変更", - "書き込み系APIを一括で無効化可能に", - "開発環境の向上", - "バグ修正" - ], - "contributors": [ - "aoirint", - "FujisakiEx", - "Hiroshiba", - "K-shir0", - "My-MC", - "nagi-miaow", - "okaits", - "raa0121", - "sabonerune", - "sevenc-nanashi", - "siketyan", - "stmtk1", - "takana-v", - "tarepan", - "tomoish", - "tuna2134", - "weweweok", - "whiteball", - "y-chan" - ] - }, - { - "version": "0.14.7", - "descriptions": [ - "キャラクター「小夜」「ずんだもん」「もち子さん」「青山龍星」のスタイルを追加・更新" - ], - "contributors": [] - }, - { - "version": "0.14.6", - "descriptions": [ - "キャラクター「栗田まろん」「あいえるたん」「満別花丸」「琴詠ニア」を追加" - ], - "contributors": [] - }, - { - "version": "0.14.5", - "descriptions": [ - "キャラクター「中国うさぎ」を追加", - "キャラクター「波音リツ」「もち子さん」のスタイルを追加" - ], - "contributors": [] - }, - { - "version": "0.14.4", - "descriptions": [ - "キャラクター「春歌ナナ」「猫使アル」「猫使ビィ」を追加", - "バグ修正" - ], - "contributors": ["Hiroshiba"] - }, - { - "version": "0.14.3", - "descriptions": [ - "キャラクター「†聖騎士 紅桜†」「雀松朱司」「麒ヶ島宗麟」を追加", - "同時書き込みで辞書が破損する問題を修正" - ], - "contributors": ["Hiroshiba"] - }, - { - "version": "0.14.2", - "descriptions": ["DirectML版の生成が遅い問題を修正"], - "contributors": [] - }, - { - "version": "0.14.1", - "descriptions": ["AquesTalkライクな記法で生成した音声のバグを修正"], - "contributors": [] - }, - { - "version": "0.14.0", - "descriptions": [ - "コアをRust言語に移行", - "セキュリティアップデート", - "スタイルごとに異なる立ち絵の提供を可能に", - "VVPPファイルの提供", - "設定GUIの提供", - "プリセットの保存", - "モーフィングAPIの仕様変更", - "DirectML利用時に適したGPUを自動選択", - "開発環境の向上", - "バグ修正" - ], - "contributors": [ - "aoirint", - "Appletigerv", - "haru3me", - "Hiroshiba", - "ksk001100", - "masinc", - "misogihagi", - "My-MC", - "nebocco", - "PickledChair", - "qryxip", - "qwerty2501", - "sabonerune", - "sarisia", - "Segu-g", - "sevenc-nanashi", - "shigobu", - "smly", - "takana-v", - "ts-klassen", - "whiteball", - "y-chan" - ] - } -] diff --git a/voicevox_engine/resources/setting_ui_template.html b/voicevox_engine/resources/setting_ui_template.html deleted file mode 100644 index b65526e4c9d2c8f38d4c9347a1fad2aa8deaf322..0000000000000000000000000000000000000000 --- a/voicevox_engine/resources/setting_ui_template.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - - - - VOICEVOX Engine 設定 - - - - - - - -
-

読み込み中です。表示には数秒かかることがあります。

-
- - - - - - - diff --git a/voicevox_engine/run.py b/voicevox_engine/run.py deleted file mode 100644 index e2ef8c1012816fc90777249536f8812560ed1bd7..0000000000000000000000000000000000000000 --- a/voicevox_engine/run.py +++ /dev/null @@ -1,419 +0,0 @@ -"""VOICEVOX ENGINE の実行""" - -import argparse -import multiprocessing -import os -import sys -import warnings -from dataclasses import asdict, dataclass -from io import TextIOWrapper -from pathlib import Path -from typing import TextIO, TypeVar - -import uvicorn -from pydantic import TypeAdapter - -from voicevox_engine.app.application import generate_app -from voicevox_engine.cancellable_engine import CancellableEngine -from voicevox_engine.core.core_initializer import initialize_cores -from voicevox_engine.engine_manifest import load_manifest -from voicevox_engine.library.library_manager import LibraryManager -from voicevox_engine.preset.preset_manager import PresetManager -from voicevox_engine.setting.model import CorsPolicyMode -from voicevox_engine.setting.setting_manager import USER_SETTING_PATH, SettingHandler -from voicevox_engine.tts_pipeline.tts_engine import make_tts_engines_from_cores -from voicevox_engine.user_dict.user_dict_manager import UserDictionary -from voicevox_engine.utility.path_utility import ( - engine_manifest_path, - engine_root, - get_save_dir, -) - - -def decide_boolean_from_env(env_name: str) -> bool: - """ - 環境変数からbool値を返す。 - - * 環境変数が"1"ならTrueを返す - * 環境変数が"0"か空白か存在しないならFalseを返す - * それ以外はwarningを出してFalseを返す - """ - env = os.getenv(env_name, default="") - if env == "1": - return True - elif env == "" or env == "0": - return False - else: - warnings.warn( - f"Invalid environment variable value: {env_name}={env}", - stacklevel=1, - ) - return False - - -@dataclass(frozen=True) -class Envs: - """環境変数の集合""" - - output_log_utf8: bool - cpu_num_threads: str | None - env_preset_path: str | None - disable_mutable_api: bool - - -_env_adapter = TypeAdapter(Envs) - - -def read_environment_variables() -> Envs: - """環境変数を読み込む。""" - envs = Envs( - output_log_utf8=decide_boolean_from_env("VV_OUTPUT_LOG_UTF8"), - cpu_num_threads=os.getenv("VV_CPU_NUM_THREADS"), - env_preset_path=os.getenv("VV_PRESET_FILE"), - disable_mutable_api=decide_boolean_from_env("VV_DISABLE_MUTABLE_API"), - ) - return _env_adapter.validate_python(asdict(envs)) - - -def set_output_log_utf8() -> None: - """標準出力と標準エラー出力の出力形式を UTF-8 ベースに切り替える""" - - # NOTE: for 文で回せないため関数内関数で実装している - def _prepare_utf8_stdio(stdio: TextIO) -> TextIO: - """UTF-8 ベースの標準入出力インターフェイスを用意する""" - - CODEC = "utf-8" # locale に依存せず UTF-8 コーデックを用いる - ERR = "backslashreplace" # 不正な形式のデータをバックスラッシュ付きのエスケープシーケンスに置換する - - # 既定の `TextIOWrapper` 入出力インターフェイスを UTF-8 へ再設定して返す - if isinstance(stdio, TextIOWrapper): - stdio.reconfigure(encoding=CODEC) - return stdio - else: - # 既定インターフェイスのバッファを全て出力しきった上で UTF-8 設定の `TextIOWrapper` を生成して返す - stdio.flush() - try: - return TextIOWrapper(stdio.buffer, encoding=CODEC, errors=ERR) - except AttributeError: - # バッファへのアクセスに失敗した場合、設定変更をおこなわず返す - return stdio - - # NOTE: - # `sys.std*` はコンソールがない環境だと `None` をとる (出典: https://docs.python.org/ja/3/library/sys.html#sys.__stdin__ ) # noqa: B950 - # これは Python インタープリタが標準入出力へ接続されていないことを意味するため、設定不要とみなす - - if sys.stdout is None: - pass - else: - sys.stdout = _prepare_utf8_stdio(sys.stdout) - - if sys.stderr is None: - pass - else: - sys.stderr = _prepare_utf8_stdio(sys.stderr) - - -T = TypeVar("T") - - -def select_first_not_none(candidates: list[T | None]) -> T: - """None でない最初の値を取り出す。全て None の場合はエラーを送出する。""" - for candidate in candidates: - if candidate is not None: - return candidate - raise RuntimeError("すべての候補値が None です") - - -S = TypeVar("S") - - -def select_first_not_none_or_none(candidates: list[S | None]) -> S | None: - """None でない最初の値を取り出そうとし、全て None の場合は None を返す。""" - for candidate in candidates: - if candidate is not None: - return candidate - return None - - -@dataclass(frozen=True) -class CLIArgs: - host: str - port: int - use_gpu: bool - voicevox_dir: Path | None - voicelib_dirs: list[Path] | None - runtime_dirs: list[Path] | None - enable_mock: bool - enable_cancellable_synthesis: bool - init_processes: int - load_all_models: bool - cpu_num_threads: int | None - output_log_utf8: bool - cors_policy_mode: CorsPolicyMode | None - allow_origins: list[str] | None - setting_file: Path - preset_file: Path | None - disable_mutable_api: bool - - -_cli_args_adapter = TypeAdapter(CLIArgs) - - -def read_cli_arguments(envs: Envs) -> CLIArgs: - parser = argparse.ArgumentParser(description="VOICEVOX のエンジンです。") - # Uvicorn でバインドするアドレスを "localhost" にすることで IPv4 (127.0.0.1) と IPv6 ([::1]) の両方でリッスンできます. - # これは Uvicorn のドキュメントに記載されていない挙動です; 将来のアップデートにより動作しなくなる可能性があります. - # ref: https://github.com/VOICEVOX/voicevox_engine/pull/647#issuecomment-1540204653 - parser.add_argument( - "--host", - type=str, - default="localhost", - help="接続を受け付けるホストアドレスです。", - ) - parser.add_argument( - "--port", type=int, default=50021, help="接続を受け付けるポート番号です。" - ) - parser.add_argument( - "--use_gpu", action="store_true", help="GPUを使って音声合成するようになります。" - ) - parser.add_argument( - "--voicevox_dir", - type=Path, - default=None, - help="VOICEVOXのディレクトリパスです。", - ) - parser.add_argument( - "--voicelib_dir", - type=Path, - default=None, - action="append", - help="VOICEVOX COREのディレクトリパスです。", - ) - parser.add_argument( - "--runtime_dir", - type=Path, - default=None, - action="append", - help="VOICEVOX COREで使用するライブラリのディレクトリパスです。", - ) - parser.add_argument( - "--enable_mock", - action="store_true", - help="VOICEVOX COREを使わずモックで音声合成を行います。", - ) - parser.add_argument( - "--enable_cancellable_synthesis", - action="store_true", - help="音声合成を途中でキャンセルできるようになります。", - ) - parser.add_argument( - "--init_processes", - type=int, - default=2, - help="cancellable_synthesis機能の初期化時に生成するプロセス数です。", - ) - parser.add_argument( - "--load_all_models", - action="store_true", - help="起動時に全ての音声合成モデルを読み込みます。", - ) - - # 引数へcpu_num_threadsの指定がなければ、環境変数をロールします。 - # 環境変数にもない場合は、Noneのままとします。 - # VV_CPU_NUM_THREADSが空文字列でなく数値でもない場合、エラー終了します。 - parser.add_argument( - "--cpu_num_threads", - type=int, - default=envs.cpu_num_threads, - help=( - "音声合成を行うスレッド数です。指定しない場合、代わりに環境変数 VV_CPU_NUM_THREADS の値が使われます。" - "VV_CPU_NUM_THREADS が空文字列でなく数値でもない場合はエラー終了します。" - ), - ) - - parser.add_argument( - "--output_log_utf8", - action="store_true", - help=( - "ログ出力をUTF-8でおこないます。指定しない場合、代わりに環境変数 VV_OUTPUT_LOG_UTF8 の値が使われます。" - "VV_OUTPUT_LOG_UTF8 の値が1の場合はUTF-8で、0または空文字、値がない場合は環境によって自動的に決定されます。" - ), - ) - - parser.add_argument( - "--cors_policy_mode", - type=CorsPolicyMode, - choices=list(CorsPolicyMode), - default=None, - help=( - "CORSの許可モード。allまたはlocalappsが指定できます。allはすべてを許可します。" - "localappsはオリジン間リソース共有ポリシーを、app://.とlocalhost関連に限定します。" - "その他のオリジンはallow_originオプションで追加できます。デフォルトはlocalapps。" - "このオプションは--setting_fileで指定される設定ファイルよりも優先されます。" - ), - ) - - parser.add_argument( - "--allow_origin", - nargs="*", - help=( - "許可するオリジンを指定します。スペースで区切ることで複数指定できます。" - "このオプションは--setting_fileで指定される設定ファイルよりも優先されます。" - ), - ) - - parser.add_argument( - "--setting_file", - type=Path, - default=USER_SETTING_PATH, - help="設定ファイルを指定できます。", - ) - - parser.add_argument( - "--preset_file", - type=Path, - default=None, - help=( - "プリセットファイルを指定できます。" - "指定がない場合、環境変数 VV_PRESET_FILE、実行ファイルのディレクトリのpresets.yamlを順に探します。" - ), - ) - - parser.add_argument( - "--disable_mutable_api", - action="store_true", - help=( - "辞書登録や設定変更など、エンジンの静的なデータを変更するAPIを無効化します。" - "指定しない場合、代わりに環境変数 VV_DISABLE_MUTABLE_API の値が使われます。" - "VV_DISABLE_MUTABLE_API の値が1の場合は無効化で、0または空文字、値がない場合は無視されます。" - ), - ) - - args_dict = vars(parser.parse_args()) - - # NOTE: 複数個の同名引数に基づいてリスト化されるため `CLIArgs` で複数形にリネームされている - args_dict["voicelib_dirs"] = args_dict.pop("voicelib_dir") - args_dict["runtime_dirs"] = args_dict.pop("runtime_dir") - args_dict["allow_origins"] = args_dict.pop("allow_origin") - - args = _cli_args_adapter.validate_python(args_dict) - - return args - - -def main() -> None: - """VOICEVOX ENGINE を実行する""" - - multiprocessing.freeze_support() - - envs = read_environment_variables() - - if envs.output_log_utf8: - set_output_log_utf8() - - args = read_cli_arguments(envs) - - if args.output_log_utf8: - set_output_log_utf8() - - core_manager = initialize_cores( - use_gpu=args.use_gpu, - voicelib_dirs=args.voicelib_dirs, - voicevox_dir=args.voicevox_dir, - runtime_dirs=args.runtime_dirs, - cpu_num_threads=args.cpu_num_threads, - enable_mock=args.enable_mock, - load_all_models=args.load_all_models, - ) - tts_engines = make_tts_engines_from_cores(core_manager) - assert len(tts_engines.versions()) != 0, "音声合成エンジンがありません。" - - cancellable_engine: CancellableEngine | None = None - if args.enable_cancellable_synthesis: - cancellable_engine = CancellableEngine( - init_processes=args.init_processes, - use_gpu=args.use_gpu, - voicelib_dirs=args.voicelib_dirs, - voicevox_dir=args.voicevox_dir, - runtime_dirs=args.runtime_dirs, - cpu_num_threads=args.cpu_num_threads, - enable_mock=args.enable_mock, - ) - - setting_loader = SettingHandler(args.setting_file) - settings = setting_loader.load() - - # 複数方式で指定可能な場合、優先度は上から「引数」「環境変数」「設定ファイル」「デフォルト値」 - - cors_policy_mode = select_first_not_none( - [args.cors_policy_mode, settings.cors_policy_mode] - ) - - setting_allow_origins = None - if settings.allow_origin is not None: - setting_allow_origins = settings.allow_origin.split(" ") - allow_origin = select_first_not_none_or_none( - [args.allow_origins, setting_allow_origins] - ) - - if envs.env_preset_path is not None and len(envs.env_preset_path) != 0: - env_preset_path = Path(envs.env_preset_path) - else: - env_preset_path = None - root_preset_path = engine_root() / "presets.yaml" - preset_path = select_first_not_none( - [args.preset_file, env_preset_path, root_preset_path] - ) - # ファイルの存在に関わらず指定されたパスをプリセットファイルとして使用する - preset_manager = PresetManager(preset_path) - - use_dict = UserDictionary() - - engine_manifest = load_manifest(engine_manifest_path()) - - library_manager = LibraryManager( - get_save_dir() / "installed_libraries", - engine_manifest.supported_vvlib_manifest_version, - engine_manifest.brand_name, - engine_manifest.name, - engine_manifest.uuid, - ) - - if args.disable_mutable_api: - disable_mutable_api = True - else: - disable_mutable_api = envs.disable_mutable_api - - root_dir = select_first_not_none([args.voicevox_dir, engine_root()]) - character_info_dir = root_dir / "resources" / "character_info" - # NOTE: ENGINE v0.19 以前向けに後方互換性を確保する - if not character_info_dir.exists(): - character_info_dir = root_dir / "speaker_info" - - # ASGI に準拠した VOICEVOX ENGINE アプリケーションを生成する - app = generate_app( - tts_engines, - core_manager, - setting_loader, - preset_manager, - use_dict, - engine_manifest, - library_manager, - cancellable_engine, - character_info_dir, - cors_policy_mode, - allow_origin, - disable_mutable_api=disable_mutable_api, - ) - - # VOICEVOX ENGINE サーバーを起動 - # NOTE: デフォルトは ASGI に準拠した HTTP/1.1 サーバー - try: - uvicorn.run(app, host=args.host, port=args.port) - except KeyboardInterrupt: - print("`KeyboardInterrupt` の検出によりエンジンを停止しました。") - pass - - -if __name__ == "__main__": - main() diff --git a/voicevox_engine/run.spec b/voicevox_engine/run.spec deleted file mode 100644 index 7f3f7a1c9936a6d00b00e4abb8008dfb51155e10..0000000000000000000000000000000000000000 --- a/voicevox_engine/run.spec +++ /dev/null @@ -1,87 +0,0 @@ -# -*- mode: python ; coding: utf-8 -*- -# このファイルはPyInstallerによって自動生成されたもので、それをカスタマイズして使用しています。 -from PyInstaller.utils.hooks import collect_data_files -import os - -datas = [ - ('resources', 'resources'), - ('engine_manifest.json', '.'), - ('licenses.json', '.'), - ('presets.yaml', '.'), -] -datas += collect_data_files('pyopenjtalk') - -core_model_dir_path = os.environ.get('CORE_MODEL_DIR_PATH') -if core_model_dir_path: - print('CORE_MODEL_DIR_PATH is found:', core_model_dir_path) - if not os.path.isdir(core_model_dir_path): - raise Exception("CORE_MODEL_DIR_PATH was found, but it is not directory!") - datas += [(core_model_dir_path, "model")] - -# コアとONNX Runtimeはバイナリであるが、`binaries`に加えると -# 依存関係のパスがPyInstallerに書き換えらるので、`datas`に加える -# 参考: https://github.com/VOICEVOX/voicevox_engine/pull/446#issuecomment-1210052318 -libcore_path = os.environ.get('LIBCORE_PATH') -if libcore_path: - print('LIBCORE_PATH is found:', libcore_path) - if not os.path.isfile(libcore_path): - raise Exception("LIBCORE_PATH was found, but it is not file!") - datas += [(libcore_path, ".")] - -libonnxruntime_path = os.environ.get('LIBONNXRUNTIME_PATH') -if libonnxruntime_path: - print('LIBONNXRUNTIME_PATH is found:', libonnxruntime_path) - if not os.path.isfile(libonnxruntime_path): - raise Exception("LIBCORE_PATH was found, but it is not file!") - datas += [(libonnxruntime_path, ".")] - - -block_cipher = None - - -a = Analysis( - ['run.py'], - pathex=[], - binaries=[], - datas=datas, - hiddenimports=[], - hookspath=[], - hooksconfig={}, - runtime_hooks=[], - excludes=[], - win_no_prefer_redirects=False, - win_private_assemblies=False, - cipher=block_cipher, - noarchive=False, -) - -pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) - -exe = EXE( - pyz, - a.scripts, - [], - exclude_binaries=True, - name='run', - debug=False, - bootloader_ignore_signals=False, - strip=False, - upx=True, - console=True, - disable_windowed_traceback=False, - argv_emulation=False, - target_arch=None, - codesign_identity=None, - entitlements_file=None, -) - -coll = COLLECT( - exe, - a.binaries, - a.zipfiles, - a.datas, - strip=False, - upx=True, - upx_exclude=[], - name='run', -) diff --git a/voicevox_engine/setup.cfg b/voicevox_engine/setup.cfg deleted file mode 100644 index 933d570192884099f3aaddb713c588ed7bfb512a..0000000000000000000000000000000000000000 --- a/voicevox_engine/setup.cfg +++ /dev/null @@ -1,39 +0,0 @@ -[flake8] -# automatically generated by pysen -# pysen ignores and overwrites any modifications -# e203: black treats : as a binary operator -# e231: black doesn't put a space after , -# e501: black may exceed the line-length to follow other style rules -# e701: black will collapse ... only functions etc. to a single line -# e704: black will collapse ... only functions etc. to a single line -# w503 or w504: either one needs to be disabled to select w error codes -ignore = E203,E231,E501,E701,E704,W503 -max-line-length = 88 -select = B,B950,C,E,F,W - -[mypy] -# automatically generated by pysen -# pysen ignores and overwrites any modifications -check_untyped_defs = True -disallow_any_decorated = False -disallow_any_generics = False -disallow_any_unimported = False -disallow_incomplete_defs = True -disallow_subclassing_any = True -disallow_untyped_calls = True -disallow_untyped_decorators = False -disallow_untyped_defs = True -ignore_errors = False -ignore_missing_imports = True -no_implicit_optional = True -plugins = numpy.typing.mypy_plugin,pydantic.mypy -python_version = 3.11 -show_error_codes = True -strict_equality = True -strict_optional = True -warn_redundant_casts = True -warn_return_any = True -warn_unreachable = True -warn_unused_configs = True -warn_unused_ignores = False - diff --git a/voicevox_engine/test/__init__.py b/voicevox_engine/test/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/test/benchmark/__init__.py b/voicevox_engine/test/benchmark/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/test/benchmark/engine_preparation.py b/voicevox_engine/test/benchmark/engine_preparation.py deleted file mode 100644 index 21140ffd5d44d11d64e8f39f80b64d2dfc3727c2..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/benchmark/engine_preparation.py +++ /dev/null @@ -1,71 +0,0 @@ -"""VOICEVOX ENGINE へアクセス可能なクライアントの生成""" - -import warnings -from pathlib import Path -from typing import Literal - -import httpx -from fastapi.testclient import TestClient - -from voicevox_engine.app.application import generate_app -from voicevox_engine.core.core_initializer import initialize_cores -from voicevox_engine.engine_manifest import load_manifest -from voicevox_engine.library.library_manager import LibraryManager -from voicevox_engine.preset.preset_manager import PresetManager -from voicevox_engine.setting.setting_manager import SettingHandler -from voicevox_engine.tts_pipeline.tts_engine import make_tts_engines_from_cores -from voicevox_engine.user_dict.user_dict_manager import UserDictionary -from voicevox_engine.utility.path_utility import engine_manifest_path, get_save_dir - - -def _generate_engine_fake_server(root_dir: Path) -> TestClient: - core_manager = initialize_cores( - voicevox_dir=root_dir, use_gpu=False, enable_mock=False - ) - tts_engines = make_tts_engines_from_cores(core_manager) - setting_loader = SettingHandler(Path("./not_exist.yaml")) - preset_manager = PresetManager(Path("./presets.yaml")) - user_dict = UserDictionary() - engine_manifest = load_manifest(engine_manifest_path()) - library_manager = LibraryManager( - get_save_dir() / "installed_libraries", - engine_manifest.supported_vvlib_manifest_version, - engine_manifest.brand_name, - engine_manifest.name, - engine_manifest.uuid, - ) - app = generate_app( - tts_engines=tts_engines, - core_manager=core_manager, - setting_loader=setting_loader, - preset_manager=preset_manager, - character_info_dir=root_dir / "resources" / "character_info", - user_dict=user_dict, - engine_manifest=engine_manifest, - library_manager=library_manager, - ) - return TestClient(app) - - -ServerType = Literal["localhost", "fake"] - - -def generate_client( - server: ServerType, root_dir: Path | None -) -> TestClient | httpx.Client: - """ - VOICEVOX ENGINE へアクセス可能なクライアントを生成する。 - `server=localhost` では http://localhost:50021 へのクライアントを生成する。 - `server=fake` ではネットワークを介さずレスポンスを返す疑似サーバーを生成する。 - """ - - if server == "fake": - if root_dir is None: - warn_msg = "root_dirが未指定であるため、自動的に `VOICEVOX/vv-engine` を `root_dir` に設定します。" - warnings.warn(warn_msg, stacklevel=2) - root_dir = Path("VOICEVOX/vv-engine") - return _generate_engine_fake_server(root_dir) - elif server == "localhost": - return httpx.Client(base_url="http://localhost:50021") - else: - raise Exception(f"{server} はサポートされていないサーバータイプです") diff --git a/voicevox_engine/test/benchmark/speed/__init__.py b/voicevox_engine/test/benchmark/speed/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/test/benchmark/speed/character.py b/voicevox_engine/test/benchmark/speed/character.py deleted file mode 100644 index ca2f5ed45411a94f82ed0cfda3c6d8b6812ef240..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/benchmark/speed/character.py +++ /dev/null @@ -1,109 +0,0 @@ -"""キャラクターに関係したリクエストにかかる時間の測定""" - -import argparse -from pathlib import Path -from test.benchmark.engine_preparation import ServerType, generate_client -from test.benchmark.speed.utility import benchmark_time - - -def benchmark_get_speakers(server: ServerType, root_dir: Path | None = None) -> float: - """`GET /speakers` にかかる時間を測定する。""" - - client = generate_client(server, root_dir) - - def execute() -> None: - """計測対象となる処理を実行する""" - client.get("/speakers", params={}) - - average_time = benchmark_time(execute, n_repeat=10) - return average_time - - -def benchmark_get_speaker_info_all( - server: ServerType, root_dir: Path | None = None -) -> float: - """全ての喋れるキャラクターへの `GET /speaker_info` にかかる時間を測定する。""" - - client = generate_client(server, root_dir) - - # speaker_uuid 一覧を準備 - response = client.get("/speakers", params={}) - assert response.status_code == 200 - talk_characters = response.json() - uuids = list(map(lambda c: c["speaker_uuid"], talk_characters)) - - def execute() -> None: - """計測対象となる処理を実行する""" - for uuid in uuids: - client.get("/speaker_info", params={"speaker_uuid": uuid}) - - average_time = benchmark_time(execute, n_repeat=10) - return average_time - - -def benchmark_request_time_for_all_talk_characters( - server: ServerType, root_dir: Path | None = None -) -> float: - """ - 喋れるキャラクターの数と同じ回数の `GET /` にかかる時間を測定する。 - `GET /` はエンジン内部処理が最小であるため、全ての喋れるキャラクター分のリクエスト-レスポンス(ネットワーク処理部分)にかかる時間を擬似的に計測できる。 - """ - - client = generate_client(server, root_dir) - - # speaker_uuid 一覧を準備 - response = client.get("/speakers", params={}) - assert response.status_code == 200 - talk_characters = response.json() - uuids = list(map(lambda c: c["speaker_uuid"], talk_characters)) - - def execute() -> None: - """計測対象となる処理を実行する""" - for _ in uuids: - client.get("/", params={}) - - average_time = benchmark_time(execute, n_repeat=10) - return average_time - - -if __name__ == "__main__": - # 実行コマンドは `python -m test.benchmark.speed.speaker` である。 - # `server="localhost"` の場合、本ベンチマーク実行に先立ってエンジン起動が必要である。 - # エンジン起動コマンドの一例として以下を示す。 - # (別プロセスで)`python run.py --voicevox_dir=VOICEVOX/vv-engine` - - parser = argparse.ArgumentParser() - parser.add_argument("--voicevox_dir", type=Path) - args = parser.parse_args() - root_dir: Path | None = args.voicevox_dir - - result_speakers_fakeserve = benchmark_get_speakers("fake", root_dir) - result_speakers_localhost = benchmark_get_speakers("localhost", root_dir) - print("`GET /speakers` fakeserve: {:.4f} sec".format(result_speakers_fakeserve)) - print("`GET /speakers` localhost: {:.4f} sec".format(result_speakers_localhost)) - - _result_spk_infos_fakeserve = benchmark_get_speaker_info_all("fake", root_dir) - _result_spk_infos_localhost = benchmark_get_speaker_info_all("localhost", root_dir) - result_spk_infos_fakeserve = "{:.3f}".format(_result_spk_infos_fakeserve) - result_spk_infos_localhost = "{:.3f}".format(_result_spk_infos_localhost) - print( - f"全ての喋れるキャラクター `GET /speaker_info` fakeserve: {result_spk_infos_fakeserve} sec" - ) - print( - f"全ての喋れるキャラクター `GET /speaker_info` localhost: {result_spk_infos_localhost} sec" - ) - - req_time_all_fake = benchmark_request_time_for_all_talk_characters("fake", root_dir) - req_time_all_local = benchmark_request_time_for_all_talk_characters( - "localhost", root_dir - ) - print( - "全ての喋れるキャラクター `GET /` fakeserve: {:.3f} sec".format( - req_time_all_fake - ) - ) - print( - "全ての喋れるキャラクター `GET /` localhost: {:.3f} sec".format( - req_time_all_local - ) - ) diff --git a/voicevox_engine/test/benchmark/speed/request.py b/voicevox_engine/test/benchmark/speed/request.py deleted file mode 100644 index 86485c02438121a3b6ea46427ba387120bc03638..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/benchmark/speed/request.py +++ /dev/null @@ -1,39 +0,0 @@ -"""エンジンへのリクエストにかかる時間の測定""" - -import argparse -from pathlib import Path -from test.benchmark.engine_preparation import ServerType, generate_client -from test.benchmark.speed.utility import benchmark_time - - -def benchmark_request(server: ServerType, root_dir: Path | None = None) -> float: - """ - エンジンへのリクエストにかかる時間を測定する。 - `GET /` はエンジン内部処理が最小であるため、全キャラクター分のリクエスト-レスポンス(ネットワーク処理部分)にかかる時間を擬似的に計測できる。 - """ - - client = generate_client(server, root_dir) - - def execute() -> None: - """計測対象となる処理を実行する""" - client.get("/", params={}) - - average_time = benchmark_time(execute, n_repeat=10) - return average_time - - -if __name__ == "__main__": - # 実行コマンドは `python -m test.benchmark.speed.request` である。 - # `server="localhost"` の場合、本ベンチマーク実行に先立ってエンジン起動が必要である。 - # エンジン起動コマンドの一例として以下を示す。 - # (別プロセスで)`python run.py --voicevox_dir=VOICEVOX/vv-engine` - - parser = argparse.ArgumentParser() - parser.add_argument("--voicevox_dir", type=Path) - args = parser.parse_args() - root_dir: Path | None = args.voicevox_dir - - result_fakeserve = benchmark_request(server="fake", root_dir=root_dir) - result_localhost = benchmark_request(server="localhost", root_dir=root_dir) - print("`GET /` fakeserve: {:.4f} sec".format(result_fakeserve)) - print("`GET /` localhost: {:.4f} sec".format(result_localhost)) diff --git a/voicevox_engine/test/benchmark/speed/utility.py b/voicevox_engine/test/benchmark/speed/utility.py deleted file mode 100644 index cc17c8f243fe0ef1a8d6a741ed5f77bc95e44211..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/benchmark/speed/utility.py +++ /dev/null @@ -1,19 +0,0 @@ -"""速度ベンチマーク用のユーティリティ""" - -import time -from typing import Callable - - -def benchmark_time( - target_function: Callable[[], None], n_repeat: int, sec_sleep: float = 1.0 -) -> float: - """対象関数の平均実行時間を計測する。""" - scores: list[float] = [] - for _ in range(n_repeat): - start = time.perf_counter() - target_function() - end = time.perf_counter() - scores += [end - start] - time.sleep(sec_sleep) - average = sum(scores) / len(scores) - return average diff --git a/voicevox_engine/test/conftest.py b/voicevox_engine/test/conftest.py deleted file mode 100644 index e354d3809be63750a0f9f4c898d628ce45fb6ac3..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/conftest.py +++ /dev/null @@ -1,16 +0,0 @@ -import pytest -from syrupy.assertion import SnapshotAssertion -from syrupy.extensions.json import JSONSnapshotExtension - - -@pytest.fixture -def snapshot_json(snapshot: SnapshotAssertion) -> SnapshotAssertion: - """ - syrupyでJSONをsnapshotするためのfixture。 - - Examples - -------- - >>> def test_foo(snapshot_json: SnapshotAssertion): - >>> assert snapshot_json == {"key": "value"} - """ - return snapshot.use_extension(JSONSnapshotExtension) diff --git a/voicevox_engine/test/e2e/__init__.py b/voicevox_engine/test/e2e/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/test/e2e/__snapshots__/test_characters.ambr b/voicevox_engine/test/e2e/__snapshots__/test_characters.ambr deleted file mode 100644 index d464d8a78ce4c521af6a791dc811ff357afe4746..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/__snapshots__/test_characters.ambr +++ /dev/null @@ -1,157 +0,0 @@ -# serializer version: 1 -# name: test_喋れるキャラクターの情報をURLで取得できる[35b2c544-660e-401e-b503-0e14c635303a_8_icon] - 'MD5:1fe576e75458c752cfeecc1e93a29886' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[35b2c544-660e-401e-b503-0e14c635303a_8_portrait] - 'MD5:56b2cfc4a9118c40a999e151c0ac647e' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[35b2c544-660e-401e-b503-0e14c635303a_8_voice_sample_0] - 'MD5:62cce06e564276499df6014e7182368d' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[35b2c544-660e-401e-b503-0e14c635303a_8_voice_sample_1] - 'MD5:2164af6fc692d5b2117dfd845c880f81' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[35b2c544-660e-401e-b503-0e14c635303a_8_voice_sample_2] - 'MD5:4e81220a91745cf2ab7b632cd528ffbd' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[35b2c544-660e-401e-b503-0e14c635303a_portrait] - 'MD5:bd6cf66dcc652f56892b14b423f6f37c' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_1_icon] - 'MD5:becb1cc2aaf82623a13a1250a39d7393' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_1_voice_sample_0] - 'MD5:a9bf75355816d858213cb116942fe499' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_1_voice_sample_1] - 'MD5:0dc81612c1f305b6210ef325a4518e53' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_1_voice_sample_2] - 'MD5:ba5694044d8e7e0bffa9578d22ba2ba8' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_3_icon] - 'MD5:9a3690c368cd9a4ecb1940ff9eb2c955' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_3_portrait] - 'MD5:0308b1a8e7a849e8be5ea699706f5097' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_3_voice_sample_0] - 'MD5:0fd8a039030ea31560c84e91f955e4cd' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_3_voice_sample_1] - 'MD5:c249264fa985fd4ab5e940c7e813db3e' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_3_voice_sample_2] - 'MD5:6a0bc8b54543fe816f37cb286795ad07' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_portrait] - 'MD5:27777cb0883c98cd9870707005bf1faf' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_0_icon] - 'MD5:1f1da5f25968c638a783bf6ba9df9420' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_0_portrait] - 'MD5:1724b3741e58978f5b9db25eb6575d9b' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_0_voice_sample_0] - 'MD5:79d52a44a8dc8548616c300e49b37a94' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_0_voice_sample_1] - 'MD5:d31e59cf938a46d156add0da486fe5e2' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_0_voice_sample_2] - 'MD5:73d7e1f311263ab7e1b468318cb8575a' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_2_icon] - 'MD5:0b158046338f60a53e9afdb7797c5864' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_2_portrait] - 'MD5:593c75329b6531e5ae0266a708e5ebc0' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_2_voice_sample_0] - 'MD5:8e917c07fe5d444eddd4b451b7dc8d83' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_2_voice_sample_1] - 'MD5:0cf95e313bc5c3314be6a71e5021fad2' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_2_voice_sample_2] - 'MD5:43f9f43e4607015e7ab3bd016bee5509' -# --- -# name: test_喋れるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_portrait] - 'MD5:78228648fe527ee23597b66db59a4f94' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_5_icon] - 'MD5:517ba089e0b03f8868af2ce956f7699d' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_5_voice_sample_0] - 'MD5:d368ea4f7af3fba9f9f7fa862e50590f' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_5_voice_sample_1] - 'MD5:a844eb96e25efd52dfee76d023eda0c8' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_5_voice_sample_2] - 'MD5:4cd9a6ff5ac76ea1c267c99b2cfe925f' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_7_icon] - 'MD5:562ad0f61ca6dd81e89a4479f97dcd9f' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_7_voice_sample_0] - 'MD5:f214d07c3fb5332e429abb17921eecb5' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_7_voice_sample_1] - 'MD5:46296628b586d968054cc43ad733dd4a' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_7_voice_sample_2] - 'MD5:919e8e440b31b13fb0d2aae03061661f' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9_portrait] - 'MD5:27777cb0883c98cd9870707005bf1faf' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_4_icon] - 'MD5:c6a8ddea789d8115372db31b4a76d2aa' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_4_portrait] - 'MD5:2b339e97d7ae0b6b215de842ff12515e' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_4_voice_sample_0] - 'MD5:5333edce35b3806f1818c407cd74b66b' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_4_voice_sample_1] - 'MD5:720ab16616e8e3e8e15535c9f6fd1f03' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_4_voice_sample_2] - 'MD5:444dd9f019828f3773192cca7d1099df' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_6_icon] - 'MD5:d2c7c85a9919372ef62ad49786bd7fc4' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_6_portrait] - 'MD5:6f7cd8ecb9d2d8de0ed410e05350ac72' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_6_voice_sample_0] - 'MD5:4add3a1cf25c4b6ce6d35aaa1f760071' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_6_voice_sample_1] - 'MD5:42d20380d8d6fc95916037e4da990aaa' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_6_voice_sample_2] - 'MD5:af22bcd03f4959dc8f0e4ac1d04854e0' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff_portrait] - 'MD5:78228648fe527ee23597b66db59a4f94' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[b1a81618-b27b-40d2-b0ea-27a9ad408c4b_9_icon] - 'MD5:1e3d0a6e88264b1b99839aeb7c7cbe1f' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[b1a81618-b27b-40d2-b0ea-27a9ad408c4b_9_voice_sample_0] - 'MD5:e8626456ba706690676639e61ad43b73' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[b1a81618-b27b-40d2-b0ea-27a9ad408c4b_9_voice_sample_1] - 'MD5:93e3d5c44bbad3ddfc43953f5c751670' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[b1a81618-b27b-40d2-b0ea-27a9ad408c4b_9_voice_sample_2] - 'MD5:765ff637563e64182ace61fb5ca7daf4' -# --- -# name: test_歌えるキャラクターの情報をURLで取得できる[b1a81618-b27b-40d2-b0ea-27a9ad408c4b_portrait] - 'MD5:381ba07cbcad95f1c99109f5f6d096a8' -# --- diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[35b2c544-660e-401e-b503-0e14c635303a].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[35b2c544-660e-401e-b503-0e14c635303a].json" deleted file mode 100644 index 12c5c306fc16f288d918bfc1883ef5298ff14243..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[35b2c544-660e-401e-b503-0e14c635303a].json" +++ /dev/null @@ -1,16 +0,0 @@ -{ - "policy": "dummy3 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "http://testserver/_resources/06112cbb75adcee7173751694dafd9d05edd90d5f230445290cb51a34caea8d1", - "style_infos": [ - { - "icon": "http://testserver/_resources/759b5b5565e369741809631fcb3bc574c16da011b07d2d8dd9ceaa149d9e139b", - "id": 8, - "portrait": "http://testserver/_resources/9ecaf2beed142fdf6a48b4a8c3726fa2864ef5c1ada4884df2b94fb07685fb14", - "voice_samples": [ - "http://testserver/_resources/7a6a56cb9d571cfb774ac2c3ca8b873e25f68624ede21d6bf2ff625b44245ab5", - "http://testserver/_resources/83fadd140b6b53938654825fa9b8ccd08f235b07de98ddec8c653fc9652f31f6", - "http://testserver/_resources/9a243a14f9b4e20193708598cb76da5dba3a42ebd1f0ad008e0f3205da95bc33" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" deleted file mode 100644 index 0a04d5be80cadff4924e86eee4a56c1815de6fda..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" +++ /dev/null @@ -1,26 +0,0 @@ -{ - "policy": "dummy2 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "http://testserver/_resources/934d5c0f33e027f676543ab7e2b50be9c1abe7e5120b7d0a3b34bdd44efd82ae", - "style_infos": [ - { - "icon": "http://testserver/_resources/71080a525a7629916416d7d3650122fc13ed6539930087372bc56bcda0b3a7b6", - "id": 1, - "portrait": null, - "voice_samples": [ - "http://testserver/_resources/b9b38572be4ef4e05d0d3e763c7a2002b848a33b0fe3fcf7cbc283c489539f56", - "http://testserver/_resources/0867698c258361d6811e800de70c12621865b006e7f4a8ddda70e78d9b43ab36", - "http://testserver/_resources/d70aeae2463763fd4abf93f06305b465c54690922db49427baef14e90fab3bb1" - ] - }, - { - "icon": "http://testserver/_resources/2e4d6acdd84cf9559754f073d7d34ebb3044189e2ad01cbed5cbd1e578fdf8ad", - "id": 3, - "portrait": "http://testserver/_resources/ebe0eb2e71802519f123ddb25debc504ba28b35d8e216667df634327182931d1", - "voice_samples": [ - "http://testserver/_resources/47d116ee6dc96b5fabc2d545287835258fbf4fec2becae5ccdf85c126193637e", - "http://testserver/_resources/df93bb64533008f7165957636ca414a5d898c972065452fb2e8e013c5b56effb", - "http://testserver/_resources/660088d6b340f779f7e95976ba7f9ad7d482d4de51aeb2fc2a3a9f99715f863f" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" deleted file mode 100644 index dc6cd1b8defd0b802c63f6d269fe7fb146984a7a..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" +++ /dev/null @@ -1,26 +0,0 @@ -{ - "policy": "dummy1 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "http://testserver/_resources/bc1db0b6614d4433dc98b4ab3bc7b81954471c16633f8c49c15532fabfad7e27", - "style_infos": [ - { - "icon": "http://testserver/_resources/6b7f0d06aa7306be8f887a8e99fa23dc6e0cb7be80cbbe2ce2823fc304a1c350", - "id": 0, - "portrait": "http://testserver/_resources/62071bcc940cba30d87bf1a617482a0987a96954d307fe9ecd34d913f679fa2a", - "voice_samples": [ - "http://testserver/_resources/2926d3d4670d0be0eae498e8b0422ae1f85a44f7cd3df51bd70c8b8c9f607c0a", - "http://testserver/_resources/4ad32dd8e4793fa610160a3c4ef9e026a874a8399d4c86f897e2584bba171dc4", - "http://testserver/_resources/25158f0e0d2b2da3985a7ef5e2d74b46c517d3c6f6240fc3ef42be780634889b" - ] - }, - { - "icon": "http://testserver/_resources/7706521aeee094e95c0e5fecae4f1253361c60900c378403e89b3142523b7d2c", - "id": 2, - "portrait": "http://testserver/_resources/c038f14a8b3916a6d8723cfd72e949b947ff860e9c7536ad41a7f849de2f2031", - "voice_samples": [ - "http://testserver/_resources/89b799594937ae9df49e3b7caffed2392ac9432b4e30273ba09f47de1ec4e31c", - "http://testserver/_resources/7d47428eb2e765aedc0e040873a926ebbfc19c6bb8c07f0dd5e2181003d57481", - "http://testserver/_resources/106106a9d7bcba3862f79660a0295a46cd32ec4f517405a9d18f595f93cfb540" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[35b2c544-660e-401e-b503-0e14c635303a].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[35b2c544-660e-401e-b503-0e14c635303a].json" deleted file mode 100644 index da10a2bf0d2ee2c1e064e79f2e8b08d608db21ad..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[35b2c544-660e-401e-b503-0e14c635303a].json" +++ /dev/null @@ -1,16 +0,0 @@ -{ - "policy": "dummy3 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "MD5:90b250e0976f792e2fda2b1ad2643c7b", - "style_infos": [ - { - "icon": "MD5:541aeccd87319c0af159cfa13baf26cb", - "id": 8, - "portrait": "MD5:1bb8b584e8499d601a3f3bf0c3216391", - "voice_samples": [ - "MD5:148c72905d47a308cbdf9858c99ef9d7", - "MD5:46fda5f38dec0df94445066eee9ed128", - "MD5:61e7d2d3180c2c891cf096f50b98e317" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" deleted file mode 100644 index b7dea7d7656a93a7e52f8e7aa95d5e6aa07729db..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" +++ /dev/null @@ -1,26 +0,0 @@ -{ - "policy": "dummy2 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "MD5:72ceb00f20b2a1e449f0b45973cc8b24", - "style_infos": [ - { - "icon": "MD5:3248458ae11d28ec1eb482db7f1927d9", - "id": 1, - "portrait": null, - "voice_samples": [ - "MD5:2cdd82264a8b0ad508ff3f5a84d5c920", - "MD5:14b4a96141c6b9e86ce4f38adaac1fcb", - "MD5:4494752eec42b718ff3b9a3fb934596a" - ] - }, - { - "icon": "MD5:3e32a4a66bd2505cb75f91c8028d061c", - "id": 3, - "portrait": "MD5:1dd8a513f11c204c1449172b7a812be8", - "voice_samples": [ - "MD5:2bd7d3be714fdfdda2e96aa98888a9bd", - "MD5:10a9d6d4bcd02a6fa37d13c3f7335df1", - "MD5:6a21d1007f8957fca45843fde1e2d1c2" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" deleted file mode 100644 index 9d5d0588a3bbaffbfdb7cd4e5d500313b2881441..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" +++ /dev/null @@ -1,26 +0,0 @@ -{ - "policy": "dummy1 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "MD5:cab33c9fdf563682108666a012dc9853", - "style_infos": [ - { - "icon": "MD5:529b1750562ca339ba05c1b00f4b2854", - "id": 0, - "portrait": "MD5:6c1c461e54ba4f57d0c17171d17e1d80", - "voice_samples": [ - "MD5:85acb767ac22b1d17915c666cc5cee90", - "MD5:ad9e64177d28f960fb9ce40162cd82c2", - "MD5:16bf0d95c463fff08353a3452bdb8d7c" - ] - }, - { - "icon": "MD5:04cce28c375949935497ec3d5d015be9", - "id": 2, - "portrait": "MD5:0a4e78369adc266672d571f4c0663697", - "voice_samples": [ - "MD5:f508aca632a8f1cfd9eee7ed29cff96c", - "MD5:09984e27d23eee8af13809a0f621f7fd", - "MD5:e3f9a4df3f537bfb9d63d1791eda73e6" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\344\270\200\350\246\247\343\201\214\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213.json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\344\270\200\350\246\247\343\201\214\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213.json" deleted file mode 100644 index bf6d37e5145211dce8a9519466928cf0384f5225..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\345\226\213\343\202\214\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\344\270\200\350\246\247\343\201\214\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213.json" +++ /dev/null @@ -1,57 +0,0 @@ -[ - { - "name": "dummy1", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "styles": [ - { - "id": 0, - "name": "style0", - "type": "talk" - }, - { - "id": 2, - "name": "style1", - "type": "talk" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "ALL" - }, - "version": "mock" - }, - { - "name": "dummy2", - "speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9", - "styles": [ - { - "id": 1, - "name": "style0", - "type": "talk" - }, - { - "id": 3, - "name": "style1", - "type": "talk" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "SELF_ONLY" - }, - "version": "mock" - }, - { - "name": "dummy3", - "speaker_uuid": "35b2c544-660e-401e-b503-0e14c635303a", - "styles": [ - { - "id": 8, - "name": "style0", - "type": "talk" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "NOTHING" - }, - "version": "mock" - } -] diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" deleted file mode 100644 index 2e846f9944648b4fe924bc4ecc9df14d4815d2d0..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" +++ /dev/null @@ -1,26 +0,0 @@ -{ - "policy": "dummy2 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "http://testserver/_resources/934d5c0f33e027f676543ab7e2b50be9c1abe7e5120b7d0a3b34bdd44efd82ae", - "style_infos": [ - { - "icon": "http://testserver/_resources/04cdf27edb6a25e1ba2a0ced57d404151e8d556540f67297ea127984e9ad144b", - "id": 5, - "portrait": null, - "voice_samples": [ - "http://testserver/_resources/8263a333e29381dc24f7412d6b18417b309ce679c446c0dd09aea80a9a9e2c34", - "http://testserver/_resources/5d53a9a385787b822295047093bb9f0745c4cecf1d46957fa392ddb2f1561aa4", - "http://testserver/_resources/da3922b08340941c6fa8f5cb8c1f55093becba8636d5b39e98694780e34bc066" - ] - }, - { - "icon": "http://testserver/_resources/cc23bf07fcf085fbea4015cc7f0e52a67fa0f2c5e6428fb537837fce9b19a6a3", - "id": 7, - "portrait": null, - "voice_samples": [ - "http://testserver/_resources/1db7a4e6530458e5e8998d8f83ade8f3bf9156853c465c16caf1b25ccfc17bdb", - "http://testserver/_resources/8c79bf75f66c9b81c48d251ab34f8bd4bfc28c381a882bdb18053e22e08c7f3b", - "http://testserver/_resources/26a3efd18b612f26186d4b8b6850fe252f43a66607c25d40f4c1d9edc73b4c21" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" deleted file mode 100644 index ab2c3e82a2ba8d44425ba6b48dcc837b1643e94c..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" +++ /dev/null @@ -1,26 +0,0 @@ -{ - "policy": "dummy1 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "http://testserver/_resources/bc1db0b6614d4433dc98b4ab3bc7b81954471c16633f8c49c15532fabfad7e27", - "style_infos": [ - { - "icon": "http://testserver/_resources/a7eeaee45a7ad967e43af7fbc2f006e0a889252083440c85d3ce5d5b525a0be8", - "id": 4, - "portrait": "http://testserver/_resources/541554b529bb689f0c1c3bd6b606b9885583567039f42a61b0b495a96e0450f9", - "voice_samples": [ - "http://testserver/_resources/41f0f4dd473fbd42a68f4dffa90eae79d77f26b82c534b503e22d46e0202ed0e", - "http://testserver/_resources/8ab50e880fba92355649d4eb866fb39635c9d56fc22b1b58db0c110ac143328c", - "http://testserver/_resources/a5f6299bf35c6aa422b4be49d06152289509a436ee7553728d5b68c5fc1ac880" - ] - }, - { - "icon": "http://testserver/_resources/b1697caeef457c1b46e301c3313ac8ea27735e5313a47d92c0a01cde76ab11cf", - "id": 6, - "portrait": "http://testserver/_resources/5c521d46f5e73788cf26b21fa43c6c898f731c3a88b8c23f31bc7ebd83ca788e", - "voice_samples": [ - "http://testserver/_resources/891f871e89ffb2d5dc8e0483613d81b576221660f00a32893700f964552f5e11", - "http://testserver/_resources/2143f339114bad85ff9ff6253a7b0cc6453e7f6268c3052ed29dba3a810a891a", - "http://testserver/_resources/81c8222bbb4778e5e9c9e94adfa3cc1c041fa9ff39181f8a644371ca6087bae0" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[b1a81618-b27b-40d2-b0ea-27a9ad408c4b].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[b1a81618-b27b-40d2-b0ea-27a9ad408c4b].json" deleted file mode 100644 index 5d9238da7c13311d3ca4b01089eb6fdfb06790d7..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222URL\343\201\247\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[b1a81618-b27b-40d2-b0ea-27a9ad408c4b].json" +++ /dev/null @@ -1,16 +0,0 @@ -{ - "policy": "dummy4 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "http://testserver/_resources/18739f6fb92ddcf2e7070737c1d763bc2c5daf1efffc6c012e2bd1720e67abb3", - "style_infos": [ - { - "icon": "http://testserver/_resources/531e97491ca6ecc0e664475b501d5db613d4ac1019f92078ed39c08ad8000ff9", - "id": 9, - "portrait": null, - "voice_samples": [ - "http://testserver/_resources/6edf286a07f2bd462bf8fdb89a8976a3878f3c2f60a90a18425c9371002df7b5", - "http://testserver/_resources/00a74dc38ea0b1130ecda9fdad3e26d4e1a3efbdfa00a6a2c4d393aecc4a4683", - "http://testserver/_resources/83988f1e492cc0bfdd5ebfb801fdec7b5f5be6f8e3a56bba9abf39c418ed5fdb" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" deleted file mode 100644 index f2c119142586c8d1f7258c0c70a357ead41930a6..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[388f246b-8c41-4ac1-8e2d-5d79f3ff56d9].json" +++ /dev/null @@ -1,26 +0,0 @@ -{ - "policy": "dummy2 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "MD5:72ceb00f20b2a1e449f0b45973cc8b24", - "style_infos": [ - { - "icon": "MD5:5f2211c3144b8dee613056bef5893d60", - "id": 5, - "portrait": null, - "voice_samples": [ - "MD5:2b7f17f6751b9f0c76950ad3bcc1a619", - "MD5:4bc9f14cda818955cba931b1532e18fd", - "MD5:9ebfc3cf3fba47513a60c464fc57c705" - ] - }, - { - "icon": "MD5:375ecba26764b7c71ce61731b52f71f8", - "id": 7, - "portrait": null, - "voice_samples": [ - "MD5:fc93b361293ce128afd8f48d4cd89bc5", - "MD5:b74ee50cb135ccf29c0a1be2711f8cca", - "MD5:08c325d1cfe72209949a77c327b60302" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" deleted file mode 100644 index 1923de7002339acbcc0c841f99d14d90dc4875b2..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff].json" +++ /dev/null @@ -1,26 +0,0 @@ -{ - "policy": "dummy1 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "MD5:cab33c9fdf563682108666a012dc9853", - "style_infos": [ - { - "icon": "MD5:9dfc8b32d4afc3c933388ba85a8d8d12", - "id": 4, - "portrait": "MD5:2aba7f7037d00903dada4401582bf31a", - "voice_samples": [ - "MD5:49c763de77c5c6be4967900b08b561a9", - "MD5:d9736740e3735bbf45efd792f8af7383", - "MD5:58bda86215149663b605d0ba0db59bde" - ] - }, - { - "icon": "MD5:53b0f8ce874e450fc8cc5758d6ed2b03", - "id": 6, - "portrait": "MD5:6a79f7e6d8ca9087be9a0e39eac67e7b", - "voice_samples": [ - "MD5:e9fbdc80f22d91a1ad96612ea60391b4", - "MD5:8c403062ffc5fca5605aca46778ed512", - "MD5:95a626ec8a36a3a550d7ba4188937cb3" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[b1a81618-b27b-40d2-b0ea-27a9ad408c4b].json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[b1a81618-b27b-40d2-b0ea-27a9ad408c4b].json" deleted file mode 100644 index 5c1b401fc494d70c2a02cb92ffeba9519d5ffe8e..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\343\201\256\346\203\205\345\240\261\343\202\222\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213[b1a81618-b27b-40d2-b0ea-27a9ad408c4b].json" +++ /dev/null @@ -1,16 +0,0 @@ -{ - "policy": "dummy4 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "MD5:70cb4a361935084f00f6956a4e8e4f32", - "style_infos": [ - { - "icon": "MD5:e1e2fab676912fc0796a5b23320a0b67", - "id": 9, - "portrait": null, - "voice_samples": [ - "MD5:fa1230e97dec17b814ec05da1709be19", - "MD5:714f4c4f2d3c51a1d9597a6960b8367c", - "MD5:bc47fd0d1ea9083c2f4621461ae072b8" - ] - } - ] -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\344\270\200\350\246\247\343\201\214\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213.json" "b/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\344\270\200\350\246\247\343\201\214\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213.json" deleted file mode 100644 index e421371b75678a9c460b9b3b2df954480b42018d..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_characters/test_\346\255\214\343\201\210\343\202\213\343\202\255\343\203\243\343\203\251\343\202\257\343\202\277\343\203\274\344\270\200\350\246\247\343\201\214\345\217\226\345\276\227\343\201\247\343\201\215\343\202\213.json" +++ /dev/null @@ -1,57 +0,0 @@ -[ - { - "name": "dummy1", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "styles": [ - { - "id": 4, - "name": "style2", - "type": "frame_decode" - }, - { - "id": 6, - "name": "style3", - "type": "frame_decode" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "ALL" - }, - "version": "mock" - }, - { - "name": "dummy2", - "speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9", - "styles": [ - { - "id": 5, - "name": "style2", - "type": "frame_decode" - }, - { - "id": 7, - "name": "style3", - "type": "sing" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "SELF_ONLY" - }, - "version": "mock" - }, - { - "name": "dummy4", - "speaker_uuid": "b1a81618-b27b-40d2-b0ea-27a9ad408c4b", - "styles": [ - { - "id": 9, - "name": "style0", - "type": "sing" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "ALL" - }, - "version": "mock" - } -] diff --git a/voicevox_engine/test/e2e/__snapshots__/test_missing_core/test_missing_core_422.json b/voicevox_engine/test/e2e/__snapshots__/test_missing_core/test_missing_core_422.json deleted file mode 100644 index e7f74b49668009f08ff3887dfef9ce83990f38e3..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/__snapshots__/test_missing_core/test_missing_core_422.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "message": "バージョン 4.0.4 のコアが見つかりません" -} diff --git "a/voicevox_engine/test/e2e/__snapshots__/test_openapi/test_OpenAPI\343\201\256\345\275\242\343\201\214\345\244\211\343\202\217\343\201\243\343\201\246\343\201\204\343\201\252\343\201\204\343\201\223\343\201\250\343\202\222\347\242\272\350\252\215.json" "b/voicevox_engine/test/e2e/__snapshots__/test_openapi/test_OpenAPI\343\201\256\345\275\242\343\201\214\345\244\211\343\202\217\343\201\243\343\201\246\343\201\204\343\201\252\343\201\204\343\201\223\343\201\250\343\202\222\347\242\272\350\252\215.json" deleted file mode 100644 index ffea434c0925a7c70ea6e0cdc3b1bf0664b325de..0000000000000000000000000000000000000000 --- "a/voicevox_engine/test/e2e/__snapshots__/test_openapi/test_OpenAPI\343\201\256\345\275\242\343\201\214\345\244\211\343\202\217\343\201\243\343\201\246\343\201\204\343\201\252\343\201\204\343\201\223\343\201\250\343\202\222\347\242\272\350\252\215.json" +++ /dev/null @@ -1,3442 +0,0 @@ -{ - "components": { - "schemas": { - "AccentPhrase": { - "description": "アクセント句ごとの情報", - "properties": { - "accent": { - "description": "アクセント箇所", - "title": "Accent", - "type": "integer" - }, - "is_interrogative": { - "default": false, - "description": "疑問系かどうか", - "title": "Is Interrogative", - "type": "boolean" - }, - "moras": { - "description": "モーラのリスト", - "items": { - "$ref": "#/components/schemas/Mora" - }, - "title": "Moras", - "type": "array" - }, - "pause_mora": { - "allOf": [ - { - "$ref": "#/components/schemas/Mora" - } - ], - "description": "後ろに無音を付けるかどうか", - "title": "Pause Mora" - } - }, - "required": [ - "moras", - "accent" - ], - "title": "AccentPhrase", - "type": "object" - }, - "AudioQuery": { - "description": "音声合成用のクエリ", - "properties": { - "accent_phrases": { - "description": "アクセント句のリスト", - "items": { - "$ref": "#/components/schemas/AccentPhrase" - }, - "title": "Accent Phrases", - "type": "array" - }, - "intonationScale": { - "description": "全体の抑揚", - "title": "Intonationscale", - "type": "number" - }, - "kana": { - "description": "[読み取り専用]AquesTalk 風記法によるテキスト。音声合成用のクエリとしては無視される", - "title": "Kana", - "type": "string" - }, - "outputSamplingRate": { - "description": "音声データの出力サンプリングレート", - "title": "Outputsamplingrate", - "type": "integer" - }, - "outputStereo": { - "description": "音声データをステレオ出力するか否か", - "title": "Outputstereo", - "type": "boolean" - }, - "pauseLength": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "句読点などの無音時間。nullのときは無視される。デフォルト値はnull", - "title": "Pauselength" - }, - "pauseLengthScale": { - "default": 1, - "description": "句読点などの無音時間(倍率)。デフォルト値は1", - "title": "Pauselengthscale", - "type": "number" - }, - "pitchScale": { - "description": "全体の音高", - "title": "Pitchscale", - "type": "number" - }, - "postPhonemeLength": { - "description": "音声の後の無音時間", - "title": "Postphonemelength", - "type": "number" - }, - "prePhonemeLength": { - "description": "音声の前の無音時間", - "title": "Prephonemelength", - "type": "number" - }, - "speedScale": { - "description": "全体の話速", - "title": "Speedscale", - "type": "number" - }, - "volumeScale": { - "description": "全体の音量", - "title": "Volumescale", - "type": "number" - } - }, - "required": [ - "accent_phrases", - "speedScale", - "pitchScale", - "intonationScale", - "volumeScale", - "prePhonemeLength", - "postPhonemeLength", - "outputSamplingRate", - "outputStereo" - ], - "title": "AudioQuery", - "type": "object" - }, - "BaseLibraryInfo": { - "description": "音声ライブラリの情報", - "properties": { - "bytes": { - "description": "音声ライブラリのバイト数", - "title": "Bytes", - "type": "integer" - }, - "download_url": { - "description": "音声ライブラリのダウンロードURL", - "title": "Download Url", - "type": "string" - }, - "name": { - "description": "音声ライブラリの名前", - "title": "Name", - "type": "string" - }, - "speakers": { - "description": "音声ライブラリに含まれるキャラクターのリスト", - "items": { - "$ref": "#/components/schemas/LibrarySpeaker" - }, - "title": "Speakers", - "type": "array" - }, - "uuid": { - "description": "音声ライブラリのUUID", - "title": "Uuid", - "type": "string" - }, - "version": { - "description": "音声ライブラリのバージョン", - "title": "Version", - "type": "string" - } - }, - "required": [ - "name", - "uuid", - "version", - "download_url", - "bytes", - "speakers" - ], - "title": "BaseLibraryInfo", - "type": "object" - }, - "Body_setting_post_setting_post": { - "properties": { - "allow_origin": { - "title": "Allow Origin", - "type": "string" - }, - "cors_policy_mode": { - "$ref": "#/components/schemas/CorsPolicyMode" - } - }, - "required": [ - "cors_policy_mode" - ], - "title": "Body_setting_post_setting_post", - "type": "object" - }, - "Body_sing_frame_volume_sing_frame_volume_post": { - "properties": { - "frame_audio_query": { - "$ref": "#/components/schemas/FrameAudioQuery" - }, - "score": { - "$ref": "#/components/schemas/Score" - } - }, - "required": [ - "score", - "frame_audio_query" - ], - "title": "Body_sing_frame_volume_sing_frame_volume_post", - "type": "object" - }, - "CorsPolicyMode": { - "description": "CORSの許可モード", - "enum": [ - "all", - "localapps" - ], - "title": "CorsPolicyMode", - "type": "string" - }, - "DownloadableLibraryInfo": { - "description": "ダウンロード可能な音声ライブラリの情報", - "properties": { - "bytes": { - "description": "音声ライブラリのバイト数", - "title": "Bytes", - "type": "integer" - }, - "download_url": { - "description": "音声ライブラリのダウンロードURL", - "title": "Download Url", - "type": "string" - }, - "name": { - "description": "音声ライブラリの名前", - "title": "Name", - "type": "string" - }, - "speakers": { - "description": "音声ライブラリに含まれるキャラクターのリスト", - "items": { - "$ref": "#/components/schemas/LibrarySpeaker" - }, - "title": "Speakers", - "type": "array" - }, - "uuid": { - "description": "音声ライブラリのUUID", - "title": "Uuid", - "type": "string" - }, - "version": { - "description": "音声ライブラリのバージョン", - "title": "Version", - "type": "string" - } - }, - "required": [ - "name", - "uuid", - "version", - "download_url", - "bytes", - "speakers" - ], - "title": "DownloadableLibraryInfo", - "type": "object" - }, - "EngineManifest": { - "description": "エンジン自体に関する情報", - "properties": { - "brand_name": { - "description": "ブランド名", - "title": "Brand Name", - "type": "string" - }, - "default_sampling_rate": { - "description": "デフォルトのサンプリング周波数", - "title": "Default Sampling Rate", - "type": "integer" - }, - "dependency_licenses": { - "description": "依存関係のライセンス情報", - "items": { - "$ref": "#/components/schemas/LicenseInfo" - }, - "title": "Dependency Licenses", - "type": "array" - }, - "frame_rate": { - "description": "エンジンのフレームレート", - "title": "Frame Rate", - "type": "number" - }, - "icon": { - "description": "エンジンのアイコンをBASE64エンコードしたもの", - "title": "Icon", - "type": "string" - }, - "manifest_version": { - "description": "マニフェストのバージョン", - "title": "Manifest Version", - "type": "string" - }, - "name": { - "description": "エンジン名", - "title": "Name", - "type": "string" - }, - "supported_features": { - "allOf": [ - { - "$ref": "#/components/schemas/SupportedFeatures" - } - ], - "description": "エンジンが持つ機能" - }, - "supported_vvlib_manifest_version": { - "description": "エンジンが対応するvvlibのバージョン", - "title": "Supported Vvlib Manifest Version", - "type": "string" - }, - "terms_of_service": { - "description": "エンジンの利用規約", - "title": "Terms Of Service", - "type": "string" - }, - "update_infos": { - "description": "エンジンのアップデート情報", - "items": { - "$ref": "#/components/schemas/UpdateInfo" - }, - "title": "Update Infos", - "type": "array" - }, - "url": { - "description": "エンジンのURL", - "title": "Url", - "type": "string" - }, - "uuid": { - "description": "エンジンのUUID", - "title": "Uuid", - "type": "string" - } - }, - "required": [ - "manifest_version", - "name", - "brand_name", - "uuid", - "url", - "icon", - "default_sampling_rate", - "frame_rate", - "terms_of_service", - "update_infos", - "dependency_licenses", - "supported_features" - ], - "title": "EngineManifest", - "type": "object" - }, - "FrameAudioQuery": { - "description": "フレームごとの音声合成用のクエリ", - "properties": { - "f0": { - "description": "フレームごとの基本周波数", - "items": { - "type": "number" - }, - "title": "F0", - "type": "array" - }, - "outputSamplingRate": { - "description": "音声データの出力サンプリングレート", - "title": "Outputsamplingrate", - "type": "integer" - }, - "outputStereo": { - "description": "音声データをステレオ出力するか否か", - "title": "Outputstereo", - "type": "boolean" - }, - "phonemes": { - "description": "音素のリスト", - "items": { - "$ref": "#/components/schemas/FramePhoneme" - }, - "title": "Phonemes", - "type": "array" - }, - "volume": { - "description": "フレームごとの音量", - "items": { - "type": "number" - }, - "title": "Volume", - "type": "array" - }, - "volumeScale": { - "description": "全体の音量", - "title": "Volumescale", - "type": "number" - } - }, - "required": [ - "f0", - "volume", - "phonemes", - "volumeScale", - "outputSamplingRate", - "outputStereo" - ], - "title": "FrameAudioQuery", - "type": "object" - }, - "FramePhoneme": { - "description": "音素の情報", - "properties": { - "frame_length": { - "description": "音素のフレーム長", - "title": "Frame Length", - "type": "integer" - }, - "phoneme": { - "description": "音素", - "title": "Phoneme", - "type": "string" - } - }, - "required": [ - "phoneme", - "frame_length" - ], - "title": "FramePhoneme", - "type": "object" - }, - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "title": "Detail", - "type": "array" - } - }, - "title": "HTTPValidationError", - "type": "object" - }, - "InstalledLibraryInfo": { - "description": "インストール済み音声ライブラリの情報", - "properties": { - "bytes": { - "description": "音声ライブラリのバイト数", - "title": "Bytes", - "type": "integer" - }, - "download_url": { - "description": "音声ライブラリのダウンロードURL", - "title": "Download Url", - "type": "string" - }, - "name": { - "description": "音声ライブラリの名前", - "title": "Name", - "type": "string" - }, - "speakers": { - "description": "音声ライブラリに含まれるキャラクターのリスト", - "items": { - "$ref": "#/components/schemas/LibrarySpeaker" - }, - "title": "Speakers", - "type": "array" - }, - "uninstallable": { - "description": "アンインストール可能かどうか", - "title": "Uninstallable", - "type": "boolean" - }, - "uuid": { - "description": "音声ライブラリのUUID", - "title": "Uuid", - "type": "string" - }, - "version": { - "description": "音声ライブラリのバージョン", - "title": "Version", - "type": "string" - } - }, - "required": [ - "name", - "uuid", - "version", - "download_url", - "bytes", - "speakers", - "uninstallable" - ], - "title": "InstalledLibraryInfo", - "type": "object" - }, - "LibrarySpeaker": { - "description": "音声ライブラリに含まれるキャラクターの情報", - "properties": { - "speaker": { - "$ref": "#/components/schemas/Speaker" - }, - "speaker_info": { - "$ref": "#/components/schemas/SpeakerInfo" - } - }, - "required": [ - "speaker", - "speaker_info" - ], - "title": "LibrarySpeaker", - "type": "object" - }, - "LicenseInfo": { - "description": "依存ライブラリのライセンス情報", - "properties": { - "license": { - "description": "依存ライブラリのライセンス名", - "title": "License", - "type": "string" - }, - "name": { - "description": "依存ライブラリ名", - "title": "Name", - "type": "string" - }, - "text": { - "description": "依存ライブラリのライセンス本文", - "title": "Text", - "type": "string" - }, - "version": { - "description": "依存ライブラリのバージョン", - "title": "Version", - "type": "string" - } - }, - "required": [ - "name", - "text" - ], - "title": "LicenseInfo", - "type": "object" - }, - "Mora": { - "description": "モーラ(子音+母音)ごとの情報", - "properties": { - "consonant": { - "description": "子音の音素", - "title": "Consonant", - "type": "string" - }, - "consonant_length": { - "description": "子音の音長", - "title": "Consonant Length", - "type": "number" - }, - "pitch": { - "description": "音高", - "title": "Pitch", - "type": "number" - }, - "text": { - "description": "文字", - "title": "Text", - "type": "string" - }, - "vowel": { - "description": "母音の音素", - "title": "Vowel", - "type": "string" - }, - "vowel_length": { - "description": "母音の音長", - "title": "Vowel Length", - "type": "number" - } - }, - "required": [ - "text", - "vowel", - "vowel_length", - "pitch" - ], - "title": "Mora", - "type": "object" - }, - "MorphableTargetInfo": { - "properties": { - "is_morphable": { - "description": "指定したキャラクターに対してモーフィングの可否", - "title": "Is Morphable", - "type": "boolean" - } - }, - "required": [ - "is_morphable" - ], - "title": "MorphableTargetInfo", - "type": "object" - }, - "Note": { - "description": "音符ごとの情報", - "properties": { - "frame_length": { - "description": "音符のフレーム長", - "title": "Frame Length", - "type": "integer" - }, - "key": { - "description": "音階", - "title": "Key", - "type": "integer" - }, - "lyric": { - "description": "音符の歌詞", - "title": "Lyric", - "type": "string" - } - }, - "required": [ - "frame_length", - "lyric" - ], - "title": "Note", - "type": "object" - }, - "ParseKanaBadRequest": { - "properties": { - "error_args": { - "additionalProperties": { - "type": "string" - }, - "description": "エラーを起こした箇所", - "title": "Error Args", - "type": "object" - }, - "error_name": { - "description": "エラー名\n\n|name|description|\n|---|---|\n| UNKNOWN_TEXT | 判別できない読み仮名があります: {text} |\n| ACCENT_TOP | 句頭にアクセントは置けません: {text} |\n| ACCENT_TWICE | 1つのアクセント句に二つ以上のアクセントは置けません: {text} |\n| ACCENT_NOTFOUND | アクセントを指定していないアクセント句があります: {text} |\n| EMPTY_PHRASE | {position}番目のアクセント句が空白です |\n| INTERROGATION_MARK_NOT_AT_END | アクセント句末以外に「?」は置けません: {text} |\n| INFINITE_LOOP | 処理時に無限ループになってしまいました...バグ報告をお願いします。 |", - "title": "Error Name", - "type": "string" - }, - "text": { - "description": "エラーメッセージ", - "title": "Text", - "type": "string" - } - }, - "required": [ - "text", - "error_name", - "error_args" - ], - "title": "ParseKanaBadRequest", - "type": "object" - }, - "Preset": { - "description": "プリセット情報", - "properties": { - "id": { - "description": "プリセットID", - "title": "Id", - "type": "integer" - }, - "intonationScale": { - "description": "全体の抑揚", - "title": "Intonationscale", - "type": "number" - }, - "name": { - "description": "プリセット名", - "title": "Name", - "type": "string" - }, - "pauseLength": { - "description": "句読点などの無音時間", - "title": "Pauselength", - "type": "number" - }, - "pauseLengthScale": { - "default": 1, - "description": "句読点などの無音時間(倍率)", - "title": "Pauselengthscale", - "type": "number" - }, - "pitchScale": { - "description": "全体の音高", - "title": "Pitchscale", - "type": "number" - }, - "postPhonemeLength": { - "description": "音声の後の無音時間", - "title": "Postphonemelength", - "type": "number" - }, - "prePhonemeLength": { - "description": "音声の前の無音時間", - "title": "Prephonemelength", - "type": "number" - }, - "speaker_uuid": { - "description": "キャラクターのUUID", - "title": "Speaker Uuid", - "type": "string" - }, - "speedScale": { - "description": "全体の話速", - "title": "Speedscale", - "type": "number" - }, - "style_id": { - "description": "スタイルID", - "title": "Style Id", - "type": "integer" - }, - "volumeScale": { - "description": "全体の音量", - "title": "Volumescale", - "type": "number" - } - }, - "required": [ - "id", - "name", - "speaker_uuid", - "style_id", - "speedScale", - "pitchScale", - "intonationScale", - "volumeScale", - "prePhonemeLength", - "postPhonemeLength" - ], - "title": "Preset", - "type": "object" - }, - "Score": { - "description": "楽譜情報", - "properties": { - "notes": { - "description": "音符のリスト", - "items": { - "$ref": "#/components/schemas/Note" - }, - "title": "Notes", - "type": "array" - } - }, - "required": [ - "notes" - ], - "title": "Score", - "type": "object" - }, - "Speaker": { - "description": "キャラクター情報", - "properties": { - "name": { - "description": "名前", - "title": "Name", - "type": "string" - }, - "speaker_uuid": { - "description": "キャラクターのUUID", - "title": "Speaker Uuid", - "type": "string" - }, - "styles": { - "description": "スタイルの一覧", - "items": { - "$ref": "#/components/schemas/SpeakerStyle" - }, - "title": "Styles", - "type": "array" - }, - "supported_features": { - "allOf": [ - { - "$ref": "#/components/schemas/SpeakerSupportedFeatures" - } - ], - "description": "キャラクターの対応機能" - }, - "version": { - "description": "キャラクターのバージョン", - "title": "Version", - "type": "string" - } - }, - "required": [ - "name", - "speaker_uuid", - "styles", - "version" - ], - "title": "Speaker", - "type": "object" - }, - "SpeakerInfo": { - "description": "キャラクターの追加情報", - "properties": { - "policy": { - "description": "policy.md", - "title": "Policy", - "type": "string" - }, - "portrait": { - "description": "立ち絵画像をbase64エンコードしたもの、あるいはURL", - "title": "Portrait", - "type": "string" - }, - "style_infos": { - "description": "スタイルの追加情報", - "items": { - "$ref": "#/components/schemas/StyleInfo" - }, - "title": "Style Infos", - "type": "array" - } - }, - "required": [ - "policy", - "portrait", - "style_infos" - ], - "title": "SpeakerInfo", - "type": "object" - }, - "SpeakerStyle": { - "description": "キャラクターのスタイル情報", - "properties": { - "id": { - "description": "スタイルID", - "title": "Id", - "type": "integer" - }, - "name": { - "description": "スタイル名", - "title": "Name", - "type": "string" - }, - "type": { - "default": "talk", - "description": "スタイルの種類。talk:音声合成クエリの作成と音声合成が可能。singing_teacher:歌唱音声合成用のクエリの作成が可能。frame_decode:歌唱音声合成が可能。sing:歌唱音声合成用のクエリの作成と歌唱音声合成が可能。", - "enum": [ - "talk", - "singing_teacher", - "frame_decode", - "sing" - ], - "title": "Type", - "type": "string" - } - }, - "required": [ - "name", - "id" - ], - "title": "SpeakerStyle", - "type": "object" - }, - "SpeakerSupportedFeatures": { - "description": "キャラクターの対応機能の情報", - "properties": { - "permitted_synthesis_morphing": { - "default": "ALL", - "description": "モーフィング機能への対応。'ALL' は「全て許可」、'SELF_ONLY' は「同じキャラクター内でのみ許可」、'NOTHING' は「全て禁止」", - "enum": [ - "ALL", - "SELF_ONLY", - "NOTHING" - ], - "title": "Permitted Synthesis Morphing", - "type": "string" - } - }, - "title": "SpeakerSupportedFeatures", - "type": "object" - }, - "StyleInfo": { - "description": "スタイルの追加情報", - "properties": { - "icon": { - "description": "このスタイルのアイコンをbase64エンコードしたもの、あるいはURL", - "title": "Icon", - "type": "string" - }, - "id": { - "description": "スタイルID", - "title": "Id", - "type": "integer" - }, - "portrait": { - "description": "このスタイルの立ち絵画像をbase64エンコードしたもの、あるいはURL", - "title": "Portrait", - "type": "string" - }, - "voice_samples": { - "description": "サンプル音声をbase64エンコードしたもの、あるいはURL", - "items": { - "type": "string" - }, - "title": "Voice Samples", - "type": "array" - } - }, - "required": [ - "id", - "icon", - "voice_samples" - ], - "title": "StyleInfo", - "type": "object" - }, - "SupportedDevicesInfo": { - "description": "対応しているデバイスの情報", - "properties": { - "cpu": { - "description": "CPUに対応しているか", - "title": "Cpu", - "type": "boolean" - }, - "cuda": { - "description": "CUDA(Nvidia GPU)に対応しているか", - "title": "Cuda", - "type": "boolean" - }, - "dml": { - "description": "DirectML(Nvidia GPU/Radeon GPU等)に対応しているか", - "title": "Dml", - "type": "boolean" - } - }, - "required": [ - "cpu", - "cuda", - "dml" - ], - "title": "SupportedDevicesInfo", - "type": "object" - }, - "SupportedFeatures": { - "description": "エンジンが持つ機能の一覧", - "properties": { - "adjust_intonation_scale": { - "description": "全体の抑揚の調整", - "title": "Adjust Intonation Scale", - "type": "boolean" - }, - "adjust_mora_pitch": { - "description": "モーラごとの音高の調整", - "title": "Adjust Mora Pitch", - "type": "boolean" - }, - "adjust_pause_length": { - "description": "句読点などの無音時間の調整", - "title": "Adjust Pause Length", - "type": "boolean" - }, - "adjust_phoneme_length": { - "description": "音素ごとの長さの調整", - "title": "Adjust Phoneme Length", - "type": "boolean" - }, - "adjust_pitch_scale": { - "description": "全体の音高の調整", - "title": "Adjust Pitch Scale", - "type": "boolean" - }, - "adjust_speed_scale": { - "description": "全体の話速の調整", - "title": "Adjust Speed Scale", - "type": "boolean" - }, - "adjust_volume_scale": { - "description": "全体の音量の調整", - "title": "Adjust Volume Scale", - "type": "boolean" - }, - "interrogative_upspeak": { - "description": "疑問文の自動調整", - "title": "Interrogative Upspeak", - "type": "boolean" - }, - "manage_library": { - "description": "音声ライブラリのインストール・アンインストール", - "title": "Manage Library", - "type": "boolean" - }, - "return_resource_url": { - "description": "speaker_info・singer_infoのリソースをURLで返送", - "title": "Return Resource Url", - "type": "boolean" - }, - "sing": { - "description": "歌唱音声合成", - "title": "Sing", - "type": "boolean" - }, - "synthesis_morphing": { - "description": "2種類のスタイルでモーフィングした音声を合成", - "title": "Synthesis Morphing", - "type": "boolean" - } - }, - "required": [ - "adjust_mora_pitch", - "adjust_phoneme_length", - "adjust_speed_scale", - "adjust_pitch_scale", - "adjust_intonation_scale", - "adjust_volume_scale", - "interrogative_upspeak", - "synthesis_morphing" - ], - "title": "SupportedFeatures", - "type": "object" - }, - "UpdateInfo": { - "description": "エンジンのアップデート情報", - "properties": { - "contributors": { - "description": "貢献者名", - "items": { - "type": "string" - }, - "title": "Contributors", - "type": "array" - }, - "descriptions": { - "description": "アップデートの詳細についての説明", - "items": { - "type": "string" - }, - "title": "Descriptions", - "type": "array" - }, - "version": { - "description": "エンジンのバージョン名", - "title": "Version", - "type": "string" - } - }, - "required": [ - "version", - "descriptions" - ], - "title": "UpdateInfo", - "type": "object" - }, - "UserDictWord": { - "description": "辞書のコンパイルに使われる情報", - "properties": { - "accent_associative_rule": { - "description": "アクセント結合規則", - "title": "Accent Associative Rule", - "type": "string" - }, - "accent_type": { - "description": "アクセント型", - "title": "Accent Type", - "type": "integer" - }, - "context_id": { - "default": 1348, - "description": "文脈ID", - "title": "Context Id", - "type": "integer" - }, - "inflectional_form": { - "description": "活用形", - "title": "Inflectional Form", - "type": "string" - }, - "inflectional_type": { - "description": "活用型", - "title": "Inflectional Type", - "type": "string" - }, - "mora_count": { - "description": "モーラ数", - "title": "Mora Count", - "type": "integer" - }, - "part_of_speech": { - "description": "品詞", - "title": "Part Of Speech", - "type": "string" - }, - "part_of_speech_detail_1": { - "description": "品詞細分類1", - "title": "Part Of Speech Detail 1", - "type": "string" - }, - "part_of_speech_detail_2": { - "description": "品詞細分類2", - "title": "Part Of Speech Detail 2", - "type": "string" - }, - "part_of_speech_detail_3": { - "description": "品詞細分類3", - "title": "Part Of Speech Detail 3", - "type": "string" - }, - "priority": { - "description": "優先度", - "maximum": 10.0, - "minimum": 0.0, - "title": "Priority", - "type": "integer" - }, - "pronunciation": { - "description": "発音", - "title": "Pronunciation", - "type": "string" - }, - "stem": { - "description": "原形", - "title": "Stem", - "type": "string" - }, - "surface": { - "description": "表層形", - "title": "Surface", - "type": "string" - }, - "yomi": { - "description": "読み", - "title": "Yomi", - "type": "string" - } - }, - "required": [ - "surface", - "priority", - "part_of_speech", - "part_of_speech_detail_1", - "part_of_speech_detail_2", - "part_of_speech_detail_3", - "inflectional_type", - "inflectional_form", - "stem", - "yomi", - "pronunciation", - "accent_type", - "accent_associative_rule" - ], - "title": "UserDictWord", - "type": "object" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "title": "Location", - "type": "array" - }, - "msg": { - "title": "Message", - "type": "string" - }, - "type": { - "title": "Error Type", - "type": "string" - } - }, - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError", - "type": "object" - }, - "VvlibManifest": { - "description": "vvlib(VOICEVOX Library)に関する情報", - "properties": { - "brand_name": { - "description": "エンジンのブランド名", - "title": "Brand Name", - "type": "string" - }, - "engine_name": { - "description": "エンジン名", - "title": "Engine Name", - "type": "string" - }, - "engine_uuid": { - "description": "エンジンのUUID", - "title": "Engine Uuid", - "type": "string" - }, - "manifest_version": { - "description": "マニフェストバージョン", - "title": "Manifest Version", - "type": "string" - }, - "name": { - "description": "音声ライブラリ名", - "title": "Name", - "type": "string" - }, - "uuid": { - "description": "音声ライブラリのUUID", - "title": "Uuid", - "type": "string" - }, - "version": { - "description": "音声ライブラリバージョン", - "title": "Version", - "type": "string" - } - }, - "required": [ - "manifest_version", - "name", - "version", - "uuid", - "brand_name", - "engine_name", - "engine_uuid" - ], - "title": "VvlibManifest", - "type": "object" - }, - "WordTypes": { - "description": "品詞", - "enum": [ - "PROPER_NOUN", - "COMMON_NOUN", - "VERB", - "ADJECTIVE", - "SUFFIX" - ], - "title": "WordTypes", - "type": "string" - } - } - }, - "info": { - "description": "DUMMY の音声合成エンジンです。", - "title": "DUMMY Engine", - "version": "latest" - }, - "openapi": "3.1.0", - "paths": { - "/": { - "get": { - "description": "ポータルページを返します。", - "operationId": "get_portal_page__get", - "responses": { - "200": { - "content": { - "text/html": { - "schema": { - "type": "string" - } - } - }, - "description": "Successful Response" - } - }, - "summary": "Get Portal Page", - "tags": [ - "その他" - ] - } - }, - "/accent_phrases": { - "post": { - "description": "テキストからアクセント句を得ます。\nis_kanaが`true`のとき、テキストは次のAquesTalk 風記法で解釈されます。デフォルトは`false`です。\n* 全てのカナはカタカナで記述される\n* アクセント句は`/`または`、`で区切る。`、`で区切った場合に限り無音区間が挿入される。\n* カナの手前に`_`を入れるとそのカナは無声化される\n* アクセント位置を`'`で指定する。全てのアクセント句にはアクセント位置を1つ指定する必要がある。\n* アクセント句末に`?`(全角)を入れることにより疑問文の発音ができる。", - "operationId": "accent_phrases_accent_phrases_post", - "parameters": [ - { - "in": "query", - "name": "text", - "required": true, - "schema": { - "title": "Text", - "type": "string" - } - }, - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "is_kana", - "required": false, - "schema": { - "default": false, - "title": "Is Kana", - "type": "boolean" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/AccentPhrase" - }, - "title": "Response Accent Phrases Accent Phrases Post", - "type": "array" - } - } - }, - "description": "Successful Response" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ParseKanaBadRequest" - } - } - }, - "description": "読み仮名のパースに失敗" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "テキストからアクセント句を得る", - "tags": [ - "クエリ編集" - ] - } - }, - "/add_preset": { - "post": { - "description": "新しいプリセットを追加します", - "operationId": "add_preset_add_preset_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Preset" - } - ], - "description": "新しいプリセット。プリセットIDが既存のものと重複している場合は、新規のプリセットIDが採番されます。", - "title": "Preset" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "title": "Response Add Preset Add Preset Post", - "type": "integer" - } - } - }, - "description": "追加したプリセットのプリセットID" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Add Preset", - "tags": [ - "その他" - ] - } - }, - "/audio_query": { - "post": { - "description": "音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。", - "operationId": "audio_query_audio_query_post", - "parameters": [ - { - "in": "query", - "name": "text", - "required": true, - "schema": { - "title": "Text", - "type": "string" - } - }, - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AudioQuery" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "音声合成用のクエリを作成する", - "tags": [ - "クエリ作成" - ] - } - }, - "/audio_query_from_preset": { - "post": { - "description": "音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。", - "operationId": "audio_query_from_preset_audio_query_from_preset_post", - "parameters": [ - { - "in": "query", - "name": "text", - "required": true, - "schema": { - "title": "Text", - "type": "string" - } - }, - { - "in": "query", - "name": "preset_id", - "required": true, - "schema": { - "title": "Preset Id", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AudioQuery" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "音声合成用のクエリをプリセットを用いて作成する", - "tags": [ - "クエリ作成" - ] - } - }, - "/cancellable_synthesis": { - "post": { - "operationId": "cancellable_synthesis_cancellable_synthesis_post", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AudioQuery" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "audio/wav": { - "schema": { - "format": "binary", - "type": "string" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "音声合成する(キャンセル可能)", - "tags": [ - "音声合成" - ] - } - }, - "/connect_waves": { - "post": { - "description": "base64エンコードされたwavデータを一纏めにし、wavファイルで返します。", - "operationId": "connect_waves_connect_waves_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "type": "string" - }, - "title": "Waves", - "type": "array" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "audio/wav": { - "schema": { - "format": "binary", - "type": "string" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "base64エンコードされた複数のwavデータを一つに結合する", - "tags": [ - "その他" - ] - } - }, - "/core_versions": { - "get": { - "description": "利用可能なコアのバージョン一覧を取得します。", - "operationId": "core_versions_core_versions_get", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "type": "string" - }, - "title": "Response Core Versions Core Versions Get", - "type": "array" - } - } - }, - "description": "Successful Response" - } - }, - "summary": "Core Versions", - "tags": [ - "その他" - ] - } - }, - "/delete_preset": { - "post": { - "description": "既存のプリセットを削除します", - "operationId": "delete_preset_delete_preset_post", - "parameters": [ - { - "description": "削除するプリセットのプリセットID", - "in": "query", - "name": "id", - "required": true, - "schema": { - "description": "削除するプリセットのプリセットID", - "title": "Id", - "type": "integer" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Delete Preset", - "tags": [ - "その他" - ] - } - }, - "/downloadable_libraries": { - "get": { - "description": "ダウンロード可能な音声ライブラリの情報を返します。", - "operationId": "downloadable_libraries_downloadable_libraries_get", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/DownloadableLibraryInfo" - }, - "title": "Response Downloadable Libraries Downloadable Libraries Get", - "type": "array" - } - } - }, - "description": "ダウンロード可能な音声ライブラリの情報リスト" - } - }, - "summary": "Downloadable Libraries", - "tags": [ - "音声ライブラリ管理" - ] - } - }, - "/engine_manifest": { - "get": { - "description": "エンジンマニフェストを取得します。", - "operationId": "engine_manifest_engine_manifest_get", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EngineManifest" - } - } - }, - "description": "Successful Response" - } - }, - "summary": "Engine Manifest", - "tags": [ - "その他" - ] - } - }, - "/frame_synthesis": { - "post": { - "description": "歌唱音声合成を行います。", - "operationId": "frame_synthesis_frame_synthesis_post", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FrameAudioQuery" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "audio/wav": { - "schema": { - "format": "binary", - "type": "string" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Frame Synthesis", - "tags": [ - "音声合成" - ] - } - }, - "/import_user_dict": { - "post": { - "description": "他のユーザー辞書をインポートします。", - "operationId": "import_user_dict_words_import_user_dict_post", - "parameters": [ - { - "description": "重複したエントリがあった場合、上書きするかどうか", - "in": "query", - "name": "override", - "required": true, - "schema": { - "description": "重複したエントリがあった場合、上書きするかどうか", - "title": "Override", - "type": "boolean" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "additionalProperties": { - "$ref": "#/components/schemas/UserDictWord" - }, - "description": "インポートするユーザー辞書のデータ", - "title": "Import Dict Data", - "type": "object" - } - } - }, - "required": true - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Import User Dict Words", - "tags": [ - "ユーザー辞書" - ] - } - }, - "/initialize_speaker": { - "post": { - "description": "指定されたスタイルを初期化します。\n実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。", - "operationId": "initialize_speaker_initialize_speaker_post", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "description": "既に初期化済みのスタイルの再初期化をスキップするかどうか", - "in": "query", - "name": "skip_reinit", - "required": false, - "schema": { - "default": false, - "description": "既に初期化済みのスタイルの再初期化をスキップするかどうか", - "title": "Skip Reinit", - "type": "boolean" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Initialize Speaker", - "tags": [ - "その他" - ] - } - }, - "/install_library/{library_uuid}": { - "post": { - "description": "音声ライブラリをインストールします。\n音声ライブラリのZIPファイルをリクエストボディとして送信してください。", - "operationId": "install_library_install_library__library_uuid__post", - "parameters": [ - { - "description": "音声ライブラリのID", - "in": "path", - "name": "library_uuid", - "required": true, - "schema": { - "description": "音声ライブラリのID", - "title": "Library Uuid", - "type": "string" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Install Library", - "tags": [ - "音声ライブラリ管理" - ] - } - }, - "/installed_libraries": { - "get": { - "description": "インストールした音声ライブラリの情報を返します。", - "operationId": "installed_libraries_installed_libraries_get", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "additionalProperties": { - "$ref": "#/components/schemas/InstalledLibraryInfo" - }, - "title": "Response Installed Libraries Installed Libraries Get", - "type": "object" - } - } - }, - "description": "インストールした音声ライブラリの情報" - } - }, - "summary": "Installed Libraries", - "tags": [ - "音声ライブラリ管理" - ] - } - }, - "/is_initialized_speaker": { - "get": { - "description": "指定されたスタイルが初期化されているかどうかを返します。", - "operationId": "is_initialized_speaker_is_initialized_speaker_get", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "title": "Response Is Initialized Speaker Is Initialized Speaker Get", - "type": "boolean" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Is Initialized Speaker", - "tags": [ - "その他" - ] - } - }, - "/mora_data": { - "post": { - "operationId": "mora_data_mora_data_post", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/AccentPhrase" - }, - "title": "Accent Phrases", - "type": "array" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/AccentPhrase" - }, - "title": "Response Mora Data Mora Data Post", - "type": "array" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "アクセント句から音高・音素長を得る", - "tags": [ - "クエリ編集" - ] - } - }, - "/mora_length": { - "post": { - "operationId": "mora_length_mora_length_post", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/AccentPhrase" - }, - "title": "Accent Phrases", - "type": "array" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/AccentPhrase" - }, - "title": "Response Mora Length Mora Length Post", - "type": "array" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "アクセント句から音素長を得る", - "tags": [ - "クエリ編集" - ] - } - }, - "/mora_pitch": { - "post": { - "operationId": "mora_pitch_mora_pitch_post", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/AccentPhrase" - }, - "title": "Accent Phrases", - "type": "array" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/AccentPhrase" - }, - "title": "Response Mora Pitch Mora Pitch Post", - "type": "array" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "アクセント句から音高を得る", - "tags": [ - "クエリ編集" - ] - } - }, - "/morphable_targets": { - "post": { - "description": "指定されたベーススタイルに対してエンジン内の各キャラクターがモーフィング機能を利用可能か返します。\nモーフィングの許可/禁止は`/speakers`の`speaker.supported_features.synthesis_morphing`に記載されています。\nプロパティが存在しない場合は、モーフィングが許可されているとみなします。\n返り値のスタイルIDはstring型なので注意。", - "operationId": "morphable_targets_morphable_targets_post", - "parameters": [ - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "type": "integer" - }, - "title": "Base Style Ids", - "type": "array" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "additionalProperties": { - "$ref": "#/components/schemas/MorphableTargetInfo" - }, - "type": "object" - }, - "title": "Response Morphable Targets Morphable Targets Post", - "type": "array" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "指定したスタイルに対してエンジン内のキャラクターがモーフィングが可能か判定する", - "tags": [ - "音声合成" - ] - } - }, - "/multi_synthesis": { - "post": { - "operationId": "multi_synthesis_multi_synthesis_post", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/AudioQuery" - }, - "title": "Queries", - "type": "array" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/zip": { - "schema": { - "format": "binary", - "type": "string" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "複数まとめて音声合成する", - "tags": [ - "音声合成" - ] - } - }, - "/presets": { - "get": { - "description": "エンジンが保持しているプリセットの設定を返します", - "operationId": "get_presets_presets_get", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/Preset" - }, - "title": "Response Get Presets Presets Get", - "type": "array" - } - } - }, - "description": "プリセットのリスト" - } - }, - "summary": "Get Presets", - "tags": [ - "その他" - ] - } - }, - "/setting": { - "get": { - "description": "設定ページを返します。", - "operationId": "setting_get_setting_get", - "responses": { - "200": { - "description": "Successful Response" - } - }, - "summary": "Setting Get", - "tags": [ - "設定" - ] - }, - "post": { - "description": "設定を更新します。", - "operationId": "setting_post_setting_post", - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Body_setting_post_setting_post" - } - } - }, - "required": true - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Setting Post", - "tags": [ - "設定" - ] - } - }, - "/sing_frame_audio_query": { - "post": { - "description": "歌唱音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま歌唱音声合成に利用できます。各値の意味は`Schemas`を参照してください。", - "operationId": "sing_frame_audio_query_sing_frame_audio_query_post", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Score" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FrameAudioQuery" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "歌唱音声合成用のクエリを作成する", - "tags": [ - "クエリ作成" - ] - } - }, - "/sing_frame_volume": { - "post": { - "operationId": "sing_frame_volume_sing_frame_volume_post", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Body_sing_frame_volume_sing_frame_volume_post" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "type": "number" - }, - "title": "Response Sing Frame Volume Sing Frame Volume Post", - "type": "array" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "スコア・歌唱音声合成用のクエリからフレームごとの音量を得る", - "tags": [ - "クエリ編集" - ] - } - }, - "/singer_info": { - "get": { - "description": "UUID で指定された歌えるキャラクターの情報を返します。\n画像や音声はresource_formatで指定した形式で返されます。", - "operationId": "singer_info_singer_info_get", - "parameters": [ - { - "in": "query", - "name": "speaker_uuid", - "required": true, - "schema": { - "title": "Speaker Uuid", - "type": "string" - } - }, - { - "in": "query", - "name": "resource_format", - "required": false, - "schema": { - "default": "base64", - "enum": [ - "base64", - "url" - ], - "title": "Resource Format", - "type": "string" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SpeakerInfo" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Singer Info", - "tags": [ - "その他" - ] - } - }, - "/singers": { - "get": { - "description": "歌えるキャラクターの情報の一覧を返します。", - "operationId": "singers_singers_get", - "parameters": [ - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/Speaker" - }, - "title": "Response Singers Singers Get", - "type": "array" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Singers", - "tags": [ - "その他" - ] - } - }, - "/speaker_info": { - "get": { - "description": "UUID で指定された喋れるキャラクターの情報を返します。\n画像や音声はresource_formatで指定した形式で返されます。", - "operationId": "speaker_info_speaker_info_get", - "parameters": [ - { - "in": "query", - "name": "speaker_uuid", - "required": true, - "schema": { - "title": "Speaker Uuid", - "type": "string" - } - }, - { - "in": "query", - "name": "resource_format", - "required": false, - "schema": { - "default": "base64", - "enum": [ - "base64", - "url" - ], - "title": "Resource Format", - "type": "string" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SpeakerInfo" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Speaker Info", - "tags": [ - "その他" - ] - } - }, - "/speakers": { - "get": { - "description": "喋れるキャラクターの情報の一覧を返します。", - "operationId": "speakers_speakers_get", - "parameters": [ - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/Speaker" - }, - "title": "Response Speakers Speakers Get", - "type": "array" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Speakers", - "tags": [ - "その他" - ] - } - }, - "/supported_devices": { - "get": { - "description": "対応デバイスの一覧を取得します。", - "operationId": "supported_devices_supported_devices_get", - "parameters": [ - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SupportedDevicesInfo" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Supported Devices", - "tags": [ - "その他" - ] - } - }, - "/synthesis": { - "post": { - "operationId": "synthesis_synthesis_post", - "parameters": [ - { - "in": "query", - "name": "speaker", - "required": true, - "schema": { - "title": "Speaker", - "type": "integer" - } - }, - { - "description": "疑問系のテキストが与えられたら語尾を自動調整する", - "in": "query", - "name": "enable_interrogative_upspeak", - "required": false, - "schema": { - "default": true, - "description": "疑問系のテキストが与えられたら語尾を自動調整する", - "title": "Enable Interrogative Upspeak", - "type": "boolean" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AudioQuery" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "audio/wav": { - "schema": { - "format": "binary", - "type": "string" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "音声合成する", - "tags": [ - "音声合成" - ] - } - }, - "/synthesis_morphing": { - "post": { - "description": "指定された2種類のスタイルで音声を合成、指定した割合でモーフィングした音声を得ます。\nモーフィングの割合は`morph_rate`で指定でき、0.0でベースのスタイル、1.0でターゲットのスタイルに近づきます。", - "operationId": "_synthesis_morphing_synthesis_morphing_post", - "parameters": [ - { - "in": "query", - "name": "base_speaker", - "required": true, - "schema": { - "title": "Base Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "target_speaker", - "required": true, - "schema": { - "title": "Target Speaker", - "type": "integer" - } - }, - { - "in": "query", - "name": "morph_rate", - "required": true, - "schema": { - "maximum": 1.0, - "minimum": 0.0, - "title": "Morph Rate", - "type": "number" - } - }, - { - "in": "query", - "name": "core_version", - "required": false, - "schema": { - "title": "Core Version", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AudioQuery" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "audio/wav": { - "schema": { - "format": "binary", - "type": "string" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "2種類のスタイルでモーフィングした音声を合成する", - "tags": [ - "音声合成" - ] - } - }, - "/uninstall_library/{library_uuid}": { - "post": { - "description": "音声ライブラリをアンインストールします。", - "operationId": "uninstall_library_uninstall_library__library_uuid__post", - "parameters": [ - { - "description": "音声ライブラリのID", - "in": "path", - "name": "library_uuid", - "required": true, - "schema": { - "description": "音声ライブラリのID", - "title": "Library Uuid", - "type": "string" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Uninstall Library", - "tags": [ - "音声ライブラリ管理" - ] - } - }, - "/update_preset": { - "post": { - "description": "既存のプリセットを更新します", - "operationId": "update_preset_update_preset_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Preset" - } - ], - "description": "更新するプリセット。プリセットIDが更新対象と一致している必要があります。", - "title": "Preset" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "title": "Response Update Preset Update Preset Post", - "type": "integer" - } - } - }, - "description": "更新したプリセットのプリセットID" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Update Preset", - "tags": [ - "その他" - ] - } - }, - "/user_dict": { - "get": { - "description": "ユーザー辞書に登録されている単語の一覧を返します。\n単語の表層形(surface)は正規化済みの物を返します。", - "operationId": "get_user_dict_words_user_dict_get", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "additionalProperties": { - "$ref": "#/components/schemas/UserDictWord" - }, - "title": "Response Get User Dict Words User Dict Get", - "type": "object" - } - } - }, - "description": "単語のUUIDとその詳細" - } - }, - "summary": "Get User Dict Words", - "tags": [ - "ユーザー辞書" - ] - } - }, - "/user_dict_word": { - "post": { - "description": "ユーザー辞書に言葉を追加します。", - "operationId": "add_user_dict_word_user_dict_word_post", - "parameters": [ - { - "description": "言葉の表層形", - "in": "query", - "name": "surface", - "required": true, - "schema": { - "description": "言葉の表層形", - "title": "Surface", - "type": "string" - } - }, - { - "description": "言葉の発音(カタカナ)", - "in": "query", - "name": "pronunciation", - "required": true, - "schema": { - "description": "言葉の発音(カタカナ)", - "title": "Pronunciation", - "type": "string" - } - }, - { - "description": "アクセント型(音が下がる場所を指す)", - "in": "query", - "name": "accent_type", - "required": true, - "schema": { - "description": "アクセント型(音が下がる場所を指す)", - "title": "Accent Type", - "type": "integer" - } - }, - { - "description": "PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか", - "in": "query", - "name": "word_type", - "required": false, - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/WordTypes" - } - ], - "description": "PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか", - "title": "Word Type" - } - }, - { - "description": "単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨", - "in": "query", - "name": "priority", - "required": false, - "schema": { - "description": "単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨", - "maximum": 10, - "minimum": 0, - "title": "Priority", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "title": "Response Add User Dict Word User Dict Word Post", - "type": "string" - } - } - }, - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Add User Dict Word", - "tags": [ - "ユーザー辞書" - ] - } - }, - "/user_dict_word/{word_uuid}": { - "delete": { - "description": "ユーザー辞書に登録されている言葉を削除します。", - "operationId": "delete_user_dict_word_user_dict_word__word_uuid__delete", - "parameters": [ - { - "description": "削除する言葉のUUID", - "in": "path", - "name": "word_uuid", - "required": true, - "schema": { - "description": "削除する言葉のUUID", - "title": "Word Uuid", - "type": "string" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Delete User Dict Word", - "tags": [ - "ユーザー辞書" - ] - }, - "put": { - "description": "ユーザー辞書に登録されている言葉を更新します。", - "operationId": "rewrite_user_dict_word_user_dict_word__word_uuid__put", - "parameters": [ - { - "description": "更新する言葉のUUID", - "in": "path", - "name": "word_uuid", - "required": true, - "schema": { - "description": "更新する言葉のUUID", - "title": "Word Uuid", - "type": "string" - } - }, - { - "description": "言葉の表層形", - "in": "query", - "name": "surface", - "required": true, - "schema": { - "description": "言葉の表層形", - "title": "Surface", - "type": "string" - } - }, - { - "description": "言葉の発音(カタカナ)", - "in": "query", - "name": "pronunciation", - "required": true, - "schema": { - "description": "言葉の発音(カタカナ)", - "title": "Pronunciation", - "type": "string" - } - }, - { - "description": "アクセント型(音が下がる場所を指す)", - "in": "query", - "name": "accent_type", - "required": true, - "schema": { - "description": "アクセント型(音が下がる場所を指す)", - "title": "Accent Type", - "type": "integer" - } - }, - { - "description": "PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか", - "in": "query", - "name": "word_type", - "required": false, - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/WordTypes" - } - ], - "description": "PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか", - "title": "Word Type" - } - }, - { - "description": "単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。", - "in": "query", - "name": "priority", - "required": false, - "schema": { - "description": "単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。", - "maximum": 10, - "minimum": 0, - "title": "Priority", - "type": "integer" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "Rewrite User Dict Word", - "tags": [ - "ユーザー辞書" - ] - } - }, - "/validate_kana": { - "post": { - "description": "テキストがAquesTalk 風記法に従っているかどうかを判定します。\n従っていない場合はエラーが返ります。", - "operationId": "validate_kana_validate_kana_post", - "parameters": [ - { - "description": "判定する対象の文字列", - "in": "query", - "name": "text", - "required": true, - "schema": { - "description": "判定する対象の文字列", - "title": "Text", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "title": "Response Validate Kana Validate Kana Post", - "type": "boolean" - } - } - }, - "description": "Successful Response" - }, - "400": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ParseKanaBadRequest" - } - } - }, - "description": "テキストが不正です" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation Error" - } - }, - "summary": "テキストがAquesTalk 風記法に従っているか判定する", - "tags": [ - "その他" - ] - } - }, - "/version": { - "get": { - "description": "エンジンのバージョンを取得します。", - "operationId": "version_version_get", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "title": "Response Version Version Get", - "type": "string" - } - } - }, - "description": "Successful Response" - } - }, - "summary": "Version", - "tags": [ - "その他" - ] - } - } - } -} diff --git a/voicevox_engine/test/e2e/__snapshots__/test_tts.ambr b/voicevox_engine/test/e2e/__snapshots__/test_tts.ambr deleted file mode 100644 index 091a376a59be3ae57a6b61d4714ba40f1ad50bd1..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/__snapshots__/test_tts.ambr +++ /dev/null @@ -1,4 +0,0 @@ -# serializer version: 1 -# name: test_テキストとキャラクターIDから音声を合成できる - 'MD5:8f7ddc461c68542d4d8ef4cd5c54ca82' -# --- diff --git a/voicevox_engine/test/e2e/conftest.py b/voicevox_engine/test/e2e/conftest.py deleted file mode 100644 index c70a121211a1b7c4849ecb382603658503e9ea5d..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/conftest.py +++ /dev/null @@ -1,121 +0,0 @@ -import json -import shutil -from pathlib import Path -from typing import Any - -import pytest -from fastapi import FastAPI -from fastapi.testclient import TestClient - -from voicevox_engine.app.application import generate_app -from voicevox_engine.core.core_initializer import initialize_cores -from voicevox_engine.engine_manifest import load_manifest -from voicevox_engine.library.library_manager import LibraryManager -from voicevox_engine.preset.preset_manager import PresetManager -from voicevox_engine.setting.setting_manager import SettingHandler -from voicevox_engine.tts_pipeline.tts_engine import make_tts_engines_from_cores -from voicevox_engine.user_dict.user_dict_manager import ( - DEFAULT_DICT_PATH, - UserDictionary, -) -from voicevox_engine.utility.path_utility import engine_manifest_path, get_save_dir - - -def _copy_under_dir(file_path: Path, dir_path: Path) -> Path: - """指定ディレクトリ下へファイルをコピーし、生成されたファイルのパスを返す。""" - copied_file_path = dir_path / file_path.name - shutil.copyfile(file_path, copied_file_path) - return copied_file_path - - -@pytest.fixture() -def app_params(tmp_path: Path) -> dict[str, Any]: - core_manager = initialize_cores(use_gpu=False, enable_mock=True) - tts_engines = make_tts_engines_from_cores(core_manager) - setting_loader = SettingHandler(tmp_path / "not_exist.yaml") - - # テスト用に隔離されたプリセットを生成する - preset_path = Path("./presets.yaml") - preset_manager = PresetManager(_copy_under_dir(preset_path, tmp_path)) - - # テスト用に隔離されたユーザー辞書を生成する - user_dict = UserDictionary( - default_dict_path=_copy_under_dir(DEFAULT_DICT_PATH, tmp_path), - user_dict_path=_generate_user_dict(tmp_path), - compiled_dict_path=tmp_path / "user.dic", - ) - - engine_manifest = load_manifest(engine_manifest_path()) - library_manager = LibraryManager( - get_save_dir() / "installed_libraries", - engine_manifest.supported_vvlib_manifest_version, - engine_manifest.brand_name, - engine_manifest.name, - engine_manifest.uuid, - ) - - return { - "tts_engines": tts_engines, - "core_manager": core_manager, - "setting_loader": setting_loader, - "preset_manager": preset_manager, - "user_dict": user_dict, - "engine_manifest": engine_manifest, - "library_manager": library_manager, - } - - -@pytest.fixture() -def app(app_params: dict) -> FastAPI: - return generate_app(**app_params) - - -@pytest.fixture() -def client(app: FastAPI) -> TestClient: - return TestClient(app) - - -def _generate_user_dict(dir_path: Path) -> Path: - """指定されたディレクトリ下にユーザー辞書ファイルを生成し、生成されたファイルのパスを返す。""" - contents = { - "a89596ad-caa8-4f4e-8eb3-3d2261c798fd": { - "surface": "test1", - "context_id": 1348, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "inflectional_type": "*", - "inflectional_form": "*", - "stem": "*", - "yomi": "テストイチ", - "pronunciation": "テストイチ", - "accent_type": 1, - "mora_count": 3, - "accent_associative_rule": "*", - "cost": 8609, - }, - "c89596ad-caa8-4f4e-8eb3-3d2261c798fd": { - "surface": "test2", - "context_id": 1348, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "inflectional_type": "*", - "inflectional_form": "*", - "stem": "*", - "yomi": "テストニ", - "pronunciation": "テストニ", - "accent_type": 1, - "mora_count": 2, - "accent_associative_rule": "*", - "cost": 8608, - }, - } - contents_json = json.dumps(contents, ensure_ascii=False) - - file_path = dir_path / "user_dict_for_test.json" - file_path.write_text(contents_json, encoding="utf-8") - - return file_path diff --git a/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_core_versions/test_get_core_versions_200.json b/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_core_versions/test_get_core_versions_200.json deleted file mode 100644 index 360feec375d7684814f82e1f424ee8fb461ff887..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_core_versions/test_get_core_versions_200.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "0.0.0" -] diff --git a/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_engine_manifest/test_get_engine_manifest_200.json b/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_engine_manifest/test_get_engine_manifest_200.json deleted file mode 100644 index d24ff2283c470bf9f30fa1f84ad1aa89b836d3b2..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_engine_manifest/test_get_engine_manifest_200.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "brand_name": "DUMMY", - "default_sampling_rate": 24000, - "dependency_licenses": [ - { - "license": "dummy license", - "name": "dummy library", - "text": "dummy license text", - "version": "0.0.1" - } - ], - "frame_rate": 93.75, - "icon": "MD5:f957eb4f5daedccb4eb6a5170f384bf4", - "manifest_version": "0.13.1", - "name": "DUMMY Engine", - "supported_features": { - "adjust_intonation_scale": true, - "adjust_mora_pitch": true, - "adjust_pause_length": true, - "adjust_phoneme_length": true, - "adjust_pitch_scale": true, - "adjust_speed_scale": true, - "adjust_volume_scale": true, - "interrogative_upspeak": true, - "manage_library": true, - "return_resource_url": true, - "sing": true, - "synthesis_morphing": true - }, - "supported_vvlib_manifest_version": null, - "terms_of_service": "dummy teams of service", - "update_infos": [ - { - "contributors": [], - "descriptions": [ - "キャラクター「後鬼」のスタイルを追加" - ], - "version": "0.19.1" - }, - { - "contributors": [ - "sabonerune", - "tarepan", - "y-chan" - ], - "descriptions": [ - "ソング:音量取得APIを追加", - "開発環境の向上" - ], - "version": "0.19.0" - }, - { - "contributors": [ - "Hiroshiba", - "qryxip" - ], - "descriptions": [ - "キャラクター「†聖騎士 紅桜†」「雀松朱司」「麒ヶ島宗麟」「春歌ナナ」「猫使アル」「猫使ビィ」「中国うさぎ」のハミングを追加", - "キャラクター「栗田まろん」「あいえるたん」「満別花丸」「琴詠ニア」のハミングを追加", - "起動に必要なメモリ量を大幅に削減" - ], - "version": "0.18.1" - }, - { - "contributors": [ - "Hiroshiba", - "sabonerune", - "siketyan", - "tarepan", - "tomoish" - ], - "descriptions": [ - "キャラクター「WhiteCUL」「後鬼」「No.7」のハミングを追加", - "キャラクター「ちび式じい」「櫻歌ミコ」「小夜/SAYO」「ナースロボ_タイプT」のハミングを追加", - "キャラクター「四国めたん」「ずんだもん」「波音リツ」のハミングスタイルを追加", - "デフォルトで全てのCPUを使うことがあるバグを修正", - "デフォルトで127.0.0.1と::1を待ち受けるように変更", - "開発環境の向上" - ], - "version": "0.18.0" - }, - { - "contributors": [ - "PickledChair" - ], - "descriptions": [ - "キャラクター「玄野武宏」「白上虎太郎」「青山龍星」「冥鳴ひまり」「九州そら」のハミングを追加", - "キャラクター「もち子さん」「剣崎雌雄」のハミングを追加", - "バグ修正" - ], - "version": "0.17.1" - }, - { - "contributors": [ - "Hiroshiba", - "misogihagi", - "tarepan", - "tuna2134" - ], - "descriptions": [ - "開発環境の向上" - ], - "version": "0.17.0" - }, - { - "contributors": [ - "Hiroshiba", - "y-chan" - ], - "descriptions": [ - "ソングAPIを追加", - "キャラクター「四国めたん」「ずんだもん」「春日部つむぎ」「雨晴はう」「波音リツ」のハミングを追加", - "キャラクター「波音リツ」のソングを追加" - ], - "version": "0.16.0" - }, - { - "contributors": [], - "descriptions": [ - "ビルド成果物のディレクトリ構造を元に戻した" - ], - "version": "0.15.1" - }, - { - "contributors": [ - "aoirint", - "FujisakiEx", - "Hiroshiba", - "K-shir0", - "My-MC", - "nagi-miaow", - "okaits", - "raa0121", - "sabonerune", - "sevenc-nanashi", - "siketyan", - "stmtk1", - "takana-v", - "tarepan", - "tomoish", - "tuna2134", - "weweweok", - "whiteball", - "y-chan" - ], - "descriptions": [ - "/validate_kana APIを追加", - "起動時のエンジン設定項目追加", - "ユーザー辞書のインポート・エクスポート機能追加", - "ビルド成果物のディレクトリ構造を変更", - "書き込み系APIを一括で無効化可能に", - "開発環境の向上", - "バグ修正" - ], - "version": "0.15.0" - }, - { - "contributors": [], - "descriptions": [ - "キャラクター「小夜」「ずんだもん」「もち子さん」「青山龍星」のスタイルを追加・更新" - ], - "version": "0.14.7" - }, - { - "contributors": [], - "descriptions": [ - "キャラクター「栗田まろん」「あいえるたん」「満別花丸」「琴詠ニア」を追加" - ], - "version": "0.14.6" - }, - { - "contributors": [], - "descriptions": [ - "キャラクター「中国うさぎ」を追加", - "キャラクター「波音リツ」「もち子さん」のスタイルを追加" - ], - "version": "0.14.5" - }, - { - "contributors": [ - "Hiroshiba" - ], - "descriptions": [ - "キャラクター「春歌ナナ」「猫使アル」「猫使ビィ」を追加", - "バグ修正" - ], - "version": "0.14.4" - }, - { - "contributors": [ - "Hiroshiba" - ], - "descriptions": [ - "キャラクター「†聖騎士 紅桜†」「雀松朱司」「麒ヶ島宗麟」を追加", - "同時書き込みで辞書が破損する問題を修正" - ], - "version": "0.14.3" - }, - { - "contributors": [], - "descriptions": [ - "DirectML版の生成が遅い問題を修正" - ], - "version": "0.14.2" - }, - { - "contributors": [], - "descriptions": [ - "AquesTalkライクな記法で生成した音声のバグを修正" - ], - "version": "0.14.1" - }, - { - "contributors": [ - "aoirint", - "Appletigerv", - "haru3me", - "Hiroshiba", - "ksk001100", - "masinc", - "misogihagi", - "My-MC", - "nebocco", - "PickledChair", - "qryxip", - "qwerty2501", - "sabonerune", - "sarisia", - "Segu-g", - "sevenc-nanashi", - "shigobu", - "smly", - "takana-v", - "ts-klassen", - "whiteball", - "y-chan" - ], - "descriptions": [ - "コアをRust言語に移行", - "セキュリティアップデート", - "スタイルごとに異なる立ち絵の提供を可能に", - "VVPPファイルの提供", - "設定GUIの提供", - "プリセットの保存", - "モーフィングAPIの仕様変更", - "DirectML利用時に適したGPUを自動選択", - "開発環境の向上", - "バグ修正" - ], - "version": "0.14.0" - } - ], - "url": "https://github.com/VOICEVOX/voicevox_engine", - "uuid": "c7b58856-bd56-4aa1-afb7-b8415f824b06" -} diff --git a/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_supported_devices/test_get_supported_devices_200.json b/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_supported_devices/test_get_supported_devices_200.json deleted file mode 100644 index ebaa77464b7e648170941cb9f7c262b2bc516851..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_supported_devices/test_get_supported_devices_200.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "cpu": true, - "cuda": false, - "dml": false -} diff --git a/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_version/test_get_version_200.json b/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_version/test_get_version_200.json deleted file mode 100644 index a80477dc3e074a03d6ca3db894bbdda908a2b86e..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/engine_info/__snapshots__/test_version/test_get_version_200.json +++ /dev/null @@ -1 +0,0 @@ -"latest" diff --git a/voicevox_engine/test/e2e/single_api/engine_info/test_core_versions.py b/voicevox_engine/test/e2e/single_api/engine_info/test_core_versions.py deleted file mode 100644 index 530b6c4f6410b438a706832fd3b5260c695145b6..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/engine_info/test_core_versions.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -/core_versions API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_core_versions_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get("/core_versions", params={}) - assert response.status_code == 200 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/engine_info/test_engine_manifest.py b/voicevox_engine/test/e2e/single_api/engine_info/test_engine_manifest.py deleted file mode 100644 index 2e04aabcaa64893a98f7d980a412f27fb6af955a..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/engine_info/test_engine_manifest.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -/engine_manifest API のテスト -""" - -from test.utility import hash_long_string - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_engine_manifest_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get("/engine_manifest") - assert response.status_code == 200 - assert snapshot_json == hash_long_string(response.json()) diff --git a/voicevox_engine/test/e2e/single_api/engine_info/test_supported_devices.py b/voicevox_engine/test/e2e/single_api/engine_info/test_supported_devices.py deleted file mode 100644 index aef3abe3af8abb4149582ebdcaf0fcbd46070b89..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/engine_info/test_supported_devices.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -/supported_devices API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_supported_devices_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get("/supported_devices", params={}) - assert response.status_code == 200 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/engine_info/test_version.py b/voicevox_engine/test/e2e/single_api/engine_info/test_version.py deleted file mode 100644 index fbae11beb54d89506e797e72b4f39e2dd2181d57..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/engine_info/test_version.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -/version API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_version_200(client: TestClient, snapshot_json: SnapshotAssertion) -> None: - response = client.get("/version", params={}) - assert response.status_code == 200 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/morphing/__snapshots__/test_morphable_targets/test_post_morphable_targets_200.json b/voicevox_engine/test/e2e/single_api/morphing/__snapshots__/test_morphable_targets/test_post_morphable_targets_200.json deleted file mode 100644 index 5e94662db9c36f9ec4db1957812ba42820b302f3..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/morphing/__snapshots__/test_morphable_targets/test_post_morphable_targets_200.json +++ /dev/null @@ -1,34 +0,0 @@ -[ - { - "0": { - "is_morphable": true - }, - "1": { - "is_morphable": false - }, - "2": { - "is_morphable": true - }, - "3": { - "is_morphable": false - }, - "4": { - "is_morphable": true - }, - "5": { - "is_morphable": false - }, - "6": { - "is_morphable": true - }, - "7": { - "is_morphable": false - }, - "8": { - "is_morphable": false - }, - "9": { - "is_morphable": true - } - } -] diff --git a/voicevox_engine/test/e2e/single_api/morphing/test_morphable_targets.py b/voicevox_engine/test/e2e/single_api/morphing/test_morphable_targets.py deleted file mode 100644 index d31cf594d3b66f279c4aff576bc39436be3393d6..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/morphing/test_morphable_targets.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -/morphable_targets API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_morphable_targets_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.post("/morphable_targets", json=[0]) - assert response.status_code == 200 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/morphing/test_synthesis_morphing.py b/voicevox_engine/test/e2e/single_api/morphing/test_synthesis_morphing.py deleted file mode 100644 index 6284d79900e18dd14922ec082d1f12c2c5fddc9f..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/morphing/test_synthesis_morphing.py +++ /dev/null @@ -1,48 +0,0 @@ -""" -/synthesis_morphing API のテスト -""" - -from test.e2e.single_api.utils import gen_mora - -from fastapi.testclient import TestClient - - -def test_post_synthesis_morphing_200(client: TestClient) -> None: - queries = { - "accent_phrases": [ - { - "moras": [ - gen_mora("テ", "t", 2.3, "e", 0.8, 3.3), - gen_mora("ス", "s", 2.1, "U", 0.3, 0.0), - gen_mora("ト", "t", 2.3, "o", 1.8, 4.1), - ], - "accent": 1, - "pause_mora": None, - "is_interrogative": False, - } - ], - "speedScale": 1.0, - "pitchScale": 1.0, - "intonationScale": 1.0, - "volumeScale": 1.0, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - "outputSamplingRate": 24000, - "outputStereo": False, - "kana": "テ'_スト", - } - response = client.post( - "/synthesis_morphing", - params={"base_speaker": 0, "target_speaker": 0, "morph_rate": 0.8}, - json=queries, - ) - assert response.status_code == 200 - - # FIXME: LinuxとMacOSで計算結果が一致しないためスナップショットテストがコケる(原因不明) - # from test.utility import summarize_wav_bytes - # from syrupy.assertion import SnapshotAssertion - # # FileResponse 内の .wav から抽出された音声波形が一致する - # assert response.headers["content-type"] == "audio/wav" - # assert snapshot == summarize_wav_bytes(response.read()) diff --git a/voicevox_engine/test/e2e/single_api/portal_page/__snapshots__/test_get_root.ambr b/voicevox_engine/test/e2e/single_api/portal_page/__snapshots__/test_get_root.ambr deleted file mode 100644 index 5233f5ea60e528af65b20f940d491007c9480021..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/portal_page/__snapshots__/test_get_root.ambr +++ /dev/null @@ -1,18 +0,0 @@ -# serializer version: 1 -# name: test_get_root_200 - ''' - - - - DUMMY Engine - - -

DUMMY Engine

- DUMMY Engine へようこそ! - - - ''' -# --- diff --git a/voicevox_engine/test/e2e/single_api/portal_page/test_get_root.py b/voicevox_engine/test/e2e/single_api/portal_page/test_get_root.py deleted file mode 100644 index a1e4b665cc6747e2613fbd561a56cde2b418d5fe..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/portal_page/test_get_root.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -/ API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_root_200(client: TestClient, snapshot: SnapshotAssertion) -> None: - response = client.get("/") - assert response.status_code == 200 - assert snapshot == response.content.decode("utf-8") diff --git a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_add_preset/test_post_add_preset_200.json b/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_add_preset/test_post_add_preset_200.json deleted file mode 100644 index 3c2df076c2fbf45c71d624a6cea8ed81d2ac5ee8..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_add_preset/test_post_add_preset_200.json +++ /dev/null @@ -1 +0,0 @@ -9999 diff --git a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_delete_preset.ambr b/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_delete_preset.ambr deleted file mode 100644 index aed06a4e51fa0aeb3873cfc55ce051902efcc379..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_delete_preset.ambr +++ /dev/null @@ -1,4 +0,0 @@ -# serializer version: 1 -# name: test_post_delete_preset_204 - b'' -# --- diff --git a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_delete_preset/test_post_delete_preset_422.json b/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_delete_preset/test_post_delete_preset_422.json deleted file mode 100644 index daaa6995e3d1876ef6761ac2c3c43082fec6cbc5..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_delete_preset/test_post_delete_preset_422.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "detail": "削除対象のプリセットが存在しません" -} diff --git a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_presets/test_get_presets_200.json b/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_presets/test_get_presets_200.json deleted file mode 100644 index 5d2d53328f46826dac6aa98934ada135ba906263..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_presets/test_get_presets_200.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "id": 1, - "intonationScale": 1.0, - "name": "サンプルプリセット", - "pauseLength": null, - "pauseLengthScale": 1.0, - "pitchScale": 0.0, - "postPhonemeLength": 0.1, - "prePhonemeLength": 0.1, - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "speedScale": 1.0, - "style_id": 0, - "volumeScale": 1.0 - } -] diff --git a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_update_preset/test_post_update_preset_200.json b/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_update_preset/test_post_update_preset_200.json deleted file mode 100644 index d00491fd7e5bb6fa28c517a0bb32b8b506539d4d..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_update_preset/test_post_update_preset_200.json +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_update_preset/test_post_update_preset_422.json b/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_update_preset/test_post_update_preset_422.json deleted file mode 100644 index f95655e5e3f08b5889b9344bea0c9a49322dbfc9..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/preset/__snapshots__/test_update_preset/test_post_update_preset_422.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "detail": "更新先のプリセットが存在しません" -} diff --git a/voicevox_engine/test/e2e/single_api/preset/test_add_preset.py b/voicevox_engine/test/e2e/single_api/preset/test_add_preset.py deleted file mode 100644 index c0baa41d822403898b0bcd394e381c61c7d2035e..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/preset/test_add_preset.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -/add_preset API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_add_preset_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - preset = { - "id": 9999, - "name": "test_preset", - "speaker_uuid": "123-456-789-234", - "style_id": 9999, - "speedScale": 1, - "pitchScale": 1, - "intonationScale": 1, - "volumeScale": 1, - "prePhonemeLength": 10, - "postPhonemeLength": 10, - "pauseLength": None, - "pauseLengthScale": 1, - } - response = client.post("/add_preset", params={}, json=preset) - assert response.status_code == 200 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/preset/test_delete_preset.py b/voicevox_engine/test/e2e/single_api/preset/test_delete_preset.py deleted file mode 100644 index bebed0e3f2e1b585a13c7cecb3fcf5fa665be1fa..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/preset/test_delete_preset.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -/delete_preset API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_delete_preset_204( - client: TestClient, snapshot: SnapshotAssertion -) -> None: - response = client.post("/delete_preset", params={"id": 1}) - assert response.status_code == 204 - assert snapshot == response.content - - -def test_post_delete_preset_422( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.post("/delete_preset", params={"id": 4040000000}) - assert response.status_code == 422 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/preset/test_presets.py b/voicevox_engine/test/e2e/single_api/preset/test_presets.py deleted file mode 100644 index b8385ccc1913efe302c796aebf311266147a6cd7..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/preset/test_presets.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -/presets API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_presets_200(client: TestClient, snapshot_json: SnapshotAssertion) -> None: - response = client.get("/presets") - assert response.status_code == 200 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/preset/test_update_preset.py b/voicevox_engine/test/e2e/single_api/preset/test_update_preset.py deleted file mode 100644 index ad2d34bf04853499a2bb8ad6e2f7f0dd989ed008..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/preset/test_update_preset.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -/update_preset API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_update_preset_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - preset = { - "id": 1, - "name": "test_preset", - "speaker_uuid": "123-456-789-234", - "style_id": 9999, - "speedScale": 1, - "pitchScale": 1, - "intonationScale": 1, - "volumeScale": 1, - "prePhonemeLength": 10, - "postPhonemeLength": 10, - "pauseLength": None, - "pauseLengthScale": 1, - } - response = client.post("/update_preset", params={}, json=preset) - assert response.status_code == 200 - assert snapshot_json == response.json() - - -def test_post_update_preset_422( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - preset = { - "id": 4040000000, - "name": "Nessie", - "speaker_uuid": "404-404-404-404", - "style_id": 404, - "speedScale": 404, - "pitchScale": 404, - "intonationScale": 404, - "volumeScale": 404, - "prePhonemeLength": 404, - "postPhonemeLength": 404, - "pauseLength": 404, - "pauseLengthScale": 404, - } - response = client.post("/update_preset", params={}, json=preset) - assert response.status_code == 422 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/setting/__snapshots__/test_setting_api.ambr b/voicevox_engine/test/e2e/single_api/setting/__snapshots__/test_setting_api.ambr deleted file mode 100644 index a720bd08c3b9851d3201a5a0c2584c2637798d65..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/setting/__snapshots__/test_setting_api.ambr +++ /dev/null @@ -1,376 +0,0 @@ -# serializer version: 1 -# name: test_get_setting_200 - ''' - - - - - - - - VOICEVOX Engine 設定 - - - - - - - -
-

読み込み中です。表示には数秒かかることがあります。

-
- - - - - - - - ''' -# --- -# name: test_post_setting_204 - b'' -# --- diff --git a/voicevox_engine/test/e2e/single_api/setting/test_setting_api.py b/voicevox_engine/test/e2e/single_api/setting/test_setting_api.py deleted file mode 100644 index 4bfec16473a7f31f0be8b6e427f093d5b90966cb..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/setting/test_setting_api.py +++ /dev/null @@ -1,21 +0,0 @@ -""" -/setting API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_setting_200(client: TestClient, snapshot: SnapshotAssertion) -> None: - response = client.get("/setting") - assert response.status_code == 200 - # HTML string をテスト - assert snapshot == response.content.decode("utf-8") - - -def test_post_setting_204(client: TestClient, snapshot: SnapshotAssertion) -> None: - response = client.post( - "/setting", data={"cors_policy_mode": "all", "allow_origin": "vv"} - ) - assert response.status_code == 204 - assert snapshot == response.content diff --git a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_singer_info/test_get_singer_info_200.json b/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_singer_info/test_get_singer_info_200.json deleted file mode 100644 index 5c1b401fc494d70c2a02cb92ffeba9519d5ffe8e..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_singer_info/test_get_singer_info_200.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "policy": "dummy4 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "MD5:70cb4a361935084f00f6956a4e8e4f32", - "style_infos": [ - { - "icon": "MD5:e1e2fab676912fc0796a5b23320a0b67", - "id": 9, - "portrait": null, - "voice_samples": [ - "MD5:fa1230e97dec17b814ec05da1709be19", - "MD5:714f4c4f2d3c51a1d9597a6960b8367c", - "MD5:bc47fd0d1ea9083c2f4621461ae072b8" - ] - } - ] -} diff --git a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_singer_info/test_get_singer_info_with_url_200.json b/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_singer_info/test_get_singer_info_with_url_200.json deleted file mode 100644 index 5d9238da7c13311d3ca4b01089eb6fdfb06790d7..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_singer_info/test_get_singer_info_with_url_200.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "policy": "dummy4 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "http://testserver/_resources/18739f6fb92ddcf2e7070737c1d763bc2c5daf1efffc6c012e2bd1720e67abb3", - "style_infos": [ - { - "icon": "http://testserver/_resources/531e97491ca6ecc0e664475b501d5db613d4ac1019f92078ed39c08ad8000ff9", - "id": 9, - "portrait": null, - "voice_samples": [ - "http://testserver/_resources/6edf286a07f2bd462bf8fdb89a8976a3878f3c2f60a90a18425c9371002df7b5", - "http://testserver/_resources/00a74dc38ea0b1130ecda9fdad3e26d4e1a3efbdfa00a6a2c4d393aecc4a4683", - "http://testserver/_resources/83988f1e492cc0bfdd5ebfb801fdec7b5f5be6f8e3a56bba9abf39c418ed5fdb" - ] - } - ] -} diff --git a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_singers/test_get_singers_200.json b/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_singers/test_get_singers_200.json deleted file mode 100644 index e421371b75678a9c460b9b3b2df954480b42018d..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_singers/test_get_singers_200.json +++ /dev/null @@ -1,57 +0,0 @@ -[ - { - "name": "dummy1", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "styles": [ - { - "id": 4, - "name": "style2", - "type": "frame_decode" - }, - { - "id": 6, - "name": "style3", - "type": "frame_decode" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "ALL" - }, - "version": "mock" - }, - { - "name": "dummy2", - "speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9", - "styles": [ - { - "id": 5, - "name": "style2", - "type": "frame_decode" - }, - { - "id": 7, - "name": "style3", - "type": "sing" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "SELF_ONLY" - }, - "version": "mock" - }, - { - "name": "dummy4", - "speaker_uuid": "b1a81618-b27b-40d2-b0ea-27a9ad408c4b", - "styles": [ - { - "id": 9, - "name": "style0", - "type": "sing" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "ALL" - }, - "version": "mock" - } -] diff --git a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_speaker_info/test_get_singer_info_with_url_200.json b/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_speaker_info/test_get_singer_info_with_url_200.json deleted file mode 100644 index 0a04d5be80cadff4924e86eee4a56c1815de6fda..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_speaker_info/test_get_singer_info_with_url_200.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "policy": "dummy2 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "http://testserver/_resources/934d5c0f33e027f676543ab7e2b50be9c1abe7e5120b7d0a3b34bdd44efd82ae", - "style_infos": [ - { - "icon": "http://testserver/_resources/71080a525a7629916416d7d3650122fc13ed6539930087372bc56bcda0b3a7b6", - "id": 1, - "portrait": null, - "voice_samples": [ - "http://testserver/_resources/b9b38572be4ef4e05d0d3e763c7a2002b848a33b0fe3fcf7cbc283c489539f56", - "http://testserver/_resources/0867698c258361d6811e800de70c12621865b006e7f4a8ddda70e78d9b43ab36", - "http://testserver/_resources/d70aeae2463763fd4abf93f06305b465c54690922db49427baef14e90fab3bb1" - ] - }, - { - "icon": "http://testserver/_resources/2e4d6acdd84cf9559754f073d7d34ebb3044189e2ad01cbed5cbd1e578fdf8ad", - "id": 3, - "portrait": "http://testserver/_resources/ebe0eb2e71802519f123ddb25debc504ba28b35d8e216667df634327182931d1", - "voice_samples": [ - "http://testserver/_resources/47d116ee6dc96b5fabc2d545287835258fbf4fec2becae5ccdf85c126193637e", - "http://testserver/_resources/df93bb64533008f7165957636ca414a5d898c972065452fb2e8e013c5b56effb", - "http://testserver/_resources/660088d6b340f779f7e95976ba7f9ad7d482d4de51aeb2fc2a3a9f99715f863f" - ] - } - ] -} diff --git a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_speaker_info/test_get_speaker_info_200.json b/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_speaker_info/test_get_speaker_info_200.json deleted file mode 100644 index b7dea7d7656a93a7e52f8e7aa95d5e6aa07729db..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_speaker_info/test_get_speaker_info_200.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "policy": "dummy2 policy\n\nhttps://voicevox.hiroshiba.jp/\n", - "portrait": "MD5:72ceb00f20b2a1e449f0b45973cc8b24", - "style_infos": [ - { - "icon": "MD5:3248458ae11d28ec1eb482db7f1927d9", - "id": 1, - "portrait": null, - "voice_samples": [ - "MD5:2cdd82264a8b0ad508ff3f5a84d5c920", - "MD5:14b4a96141c6b9e86ce4f38adaac1fcb", - "MD5:4494752eec42b718ff3b9a3fb934596a" - ] - }, - { - "icon": "MD5:3e32a4a66bd2505cb75f91c8028d061c", - "id": 3, - "portrait": "MD5:1dd8a513f11c204c1449172b7a812be8", - "voice_samples": [ - "MD5:2bd7d3be714fdfdda2e96aa98888a9bd", - "MD5:10a9d6d4bcd02a6fa37d13c3f7335df1", - "MD5:6a21d1007f8957fca45843fde1e2d1c2" - ] - } - ] -} diff --git a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_speakers/test_get_speakers_200.json b/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_speakers/test_get_speakers_200.json deleted file mode 100644 index bf6d37e5145211dce8a9519466928cf0384f5225..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/speaker/__snapshots__/test_speakers/test_get_speakers_200.json +++ /dev/null @@ -1,57 +0,0 @@ -[ - { - "name": "dummy1", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "styles": [ - { - "id": 0, - "name": "style0", - "type": "talk" - }, - { - "id": 2, - "name": "style1", - "type": "talk" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "ALL" - }, - "version": "mock" - }, - { - "name": "dummy2", - "speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9", - "styles": [ - { - "id": 1, - "name": "style0", - "type": "talk" - }, - { - "id": 3, - "name": "style1", - "type": "talk" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "SELF_ONLY" - }, - "version": "mock" - }, - { - "name": "dummy3", - "speaker_uuid": "35b2c544-660e-401e-b503-0e14c635303a", - "styles": [ - { - "id": 8, - "name": "style0", - "type": "talk" - } - ], - "supported_features": { - "permitted_synthesis_morphing": "NOTHING" - }, - "version": "mock" - } -] diff --git a/voicevox_engine/test/e2e/single_api/speaker/test_singer_info.py b/voicevox_engine/test/e2e/single_api/speaker/test_singer_info.py deleted file mode 100644 index 92ef880d9f5b2de1c4a6dab56814a01738e138c5..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/speaker/test_singer_info.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -/singer_info API のテスト -""" - -from test.utility import hash_long_string - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_singer_info_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get( - "/singer_info", params={"speaker_uuid": "b1a81618-b27b-40d2-b0ea-27a9ad408c4b"} - ) - assert response.status_code == 200 - assert snapshot_json == hash_long_string(response.json()) - - -def test_get_singer_info_with_url_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get( - "/singer_info", - params={ - "speaker_uuid": "b1a81618-b27b-40d2-b0ea-27a9ad408c4b", - "resource_format": "url", - }, - ) - assert response.status_code == 200 - assert snapshot_json == hash_long_string(response.json()) diff --git a/voicevox_engine/test/e2e/single_api/speaker/test_singers.py b/voicevox_engine/test/e2e/single_api/speaker/test_singers.py deleted file mode 100644 index 51e375f8266c68dfe36473a17649abcc16f241d2..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/speaker/test_singers.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -/singers API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_singers_200(client: TestClient, snapshot_json: SnapshotAssertion) -> None: - response = client.get("/singers", params={}) - assert response.status_code == 200 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/speaker/test_speaker_info.py b/voicevox_engine/test/e2e/single_api/speaker/test_speaker_info.py deleted file mode 100644 index eb7e729622115d750ee9dced27f12fa6ecde4df8..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/speaker/test_speaker_info.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -/speaker_info API のテスト -""" - -from test.utility import hash_long_string - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_speaker_info_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get( - "/speaker_info", params={"speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9"} - ) - assert response.status_code == 200 - assert snapshot_json == hash_long_string(response.json()) - - -def test_get_singer_info_with_url_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get( - "/speaker_info", - params={ - "speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9", - "resource_format": "url", - }, - ) - assert response.status_code == 200 - assert snapshot_json == hash_long_string(response.json()) diff --git a/voicevox_engine/test/e2e/single_api/speaker/test_speakers.py b/voicevox_engine/test/e2e/single_api/speaker/test_speakers.py deleted file mode 100644 index eea81f27c25f281402b7e1f77a4f73748c801440..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/speaker/test_speakers.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -/speakers API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_speakers_200(client: TestClient, snapshot_json: SnapshotAssertion) -> None: - response = client.get("/speakers", params={}) - assert response.status_code == 200 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_accent_phrases/test_post_accent_phrases_200.json b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_accent_phrases/test_post_accent_phrases_200.json deleted file mode 100644 index 9a61f7ac02ab73283b2a05f73a83b32b498021ca..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_accent_phrases/test_post_accent_phrases_200.json +++ /dev/null @@ -1,49 +0,0 @@ -[ - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "t", - "consonant_length": 2.31, - "pitch": 3.38, - "text": "テ", - "vowel": "e", - "vowel_length": 0.88 - }, - { - "consonant": "s", - "consonant_length": 2.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 0.38 - }, - { - "consonant": "t", - "consonant_length": 2.31, - "pitch": 4.19, - "text": "ト", - "vowel": "o", - "vowel_length": 1.88 - }, - { - "consonant": "d", - "consonant_length": 0.75, - "pitch": 1.62, - "text": "デ", - "vowel": "e", - "vowel_length": 0.88 - }, - { - "consonant": "s", - "consonant_length": 2.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 0.38 - } - ], - "pause_mora": null - } -] diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_audio_query/test_post_audio_query_200.json b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_audio_query/test_post_audio_query_200.json deleted file mode 100644 index bebc440d2894215ab158dd50042595dd0ae2309f..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_audio_query/test_post_audio_query_200.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "accent_phrases": [ - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "t", - "consonant_length": 2.31, - "pitch": 3.38, - "text": "テ", - "vowel": "e", - "vowel_length": 0.88 - }, - { - "consonant": "s", - "consonant_length": 2.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 0.38 - }, - { - "consonant": "t", - "consonant_length": 2.31, - "pitch": 4.19, - "text": "ト", - "vowel": "o", - "vowel_length": 1.88 - }, - { - "consonant": "d", - "consonant_length": 0.75, - "pitch": 1.62, - "text": "デ", - "vowel": "e", - "vowel_length": 0.88 - }, - { - "consonant": "s", - "consonant_length": 2.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 0.38 - } - ], - "pause_mora": null - } - ], - "intonationScale": 1.0, - "kana": "テ'_ストデ_ス", - "outputSamplingRate": 24000, - "outputStereo": false, - "pauseLength": null, - "pauseLengthScale": 1.0, - "pitchScale": 0.0, - "postPhonemeLength": 0.1, - "prePhonemeLength": 0.1, - "speedScale": 1.0, - "volumeScale": 1.0 -} diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_audio_query_from_preset/test_post_audio_query_from_preset_200.json b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_audio_query_from_preset/test_post_audio_query_from_preset_200.json deleted file mode 100644 index bc144a6175b174f3cb1cc7ab8f9ef79acd2df8b6..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_audio_query_from_preset/test_post_audio_query_from_preset_200.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "accent_phrases": [ - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "t", - "consonant_length": 10001.31, - "pitch": 10002.38, - "text": "テ", - "vowel": "e", - "vowel_length": 9999.88 - }, - { - "consonant": "s", - "consonant_length": 10001.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 9999.38 - }, - { - "consonant": "t", - "consonant_length": 10001.31, - "pitch": 10003.19, - "text": "ト", - "vowel": "o", - "vowel_length": 10000.88 - }, - { - "consonant": "d", - "consonant_length": 9999.75, - "pitch": 10000.62, - "text": "デ", - "vowel": "e", - "vowel_length": 9999.88 - }, - { - "consonant": "s", - "consonant_length": 10001.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 9999.38 - } - ], - "pause_mora": null - } - ], - "intonationScale": 1.2, - "kana": "テ'_ストデ_ス", - "outputSamplingRate": 24000, - "outputStereo": false, - "pauseLength": 15.0, - "pauseLengthScale": 1.4, - "pitchScale": 0.9, - "postPhonemeLength": 5.0, - "prePhonemeLength": 20.0, - "speedScale": 1.1, - "volumeScale": 1.3 -} diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_audio_query_from_preset/test_post_audio_query_from_preset_422.json b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_audio_query_from_preset/test_post_audio_query_from_preset_422.json deleted file mode 100644 index 74d573c91be1489d8c96a62ec3811f4ad60cc533..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_audio_query_from_preset/test_post_audio_query_from_preset_422.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "detail": "該当するプリセットIDが見つかりません" -} diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_frame_synthesis.ambr b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_frame_synthesis.ambr deleted file mode 100644 index ec1568011f035a69e11c2cfc704b320d990601d6..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_frame_synthesis.ambr +++ /dev/null @@ -1,4 +0,0 @@ -# serializer version: 1 -# name: test_post_frame_synthesis_200 - 'MD5:1c385210acba238994604a8cee96aee3' -# --- diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_initialize_speaker.ambr b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_initialize_speaker.ambr deleted file mode 100644 index 7d6397d4d4e2c50b54b8e0763c937f57d7b177b3..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_initialize_speaker.ambr +++ /dev/null @@ -1,4 +0,0 @@ -# serializer version: 1 -# name: test_post_initialize_speaker_204 - b'' -# --- diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_is_initialized_speaker/test_get_is_initialized_speaker_200.json b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_is_initialized_speaker/test_get_is_initialized_speaker_200.json deleted file mode 100644 index 27ba77ddaf61532f217964734769a42cdabc17dc..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_is_initialized_speaker/test_get_is_initialized_speaker_200.json +++ /dev/null @@ -1 +0,0 @@ -true diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_mora_data/test_post_mora_data_200.json b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_mora_data/test_post_mora_data_200.json deleted file mode 100644 index 8882a2dbb4934b2ca033ac909898f6d7e1467e75..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_mora_data/test_post_mora_data_200.json +++ /dev/null @@ -1,33 +0,0 @@ -[ - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "t", - "consonant_length": 2.31, - "pitch": 3.38, - "text": "テ", - "vowel": "e", - "vowel_length": 0.88 - }, - { - "consonant": "s", - "consonant_length": 2.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 0.38 - }, - { - "consonant": "t", - "consonant_length": 2.31, - "pitch": 4.25, - "text": "ト", - "vowel": "o", - "vowel_length": 1.88 - } - ], - "pause_mora": null - } -] diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_mora_length/test_post_mora_length_200.json b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_mora_length/test_post_mora_length_200.json deleted file mode 100644 index 2fcfc63f08dfe917424a083ca9204e2c76a41406..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_mora_length/test_post_mora_length_200.json +++ /dev/null @@ -1,33 +0,0 @@ -[ - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "t", - "consonant_length": 2.31, - "pitch": 3.3, - "text": "テ", - "vowel": "e", - "vowel_length": 0.88 - }, - { - "consonant": "s", - "consonant_length": 2.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 0.38 - }, - { - "consonant": "t", - "consonant_length": 2.31, - "pitch": 4.1, - "text": "ト", - "vowel": "o", - "vowel_length": 1.88 - } - ], - "pause_mora": null - } -] diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_mora_pitch/test_post_mora_pitch_200.json b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_mora_pitch/test_post_mora_pitch_200.json deleted file mode 100644 index 075eac34da037ab845ca0759408ea7dbf593ed9f..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_mora_pitch/test_post_mora_pitch_200.json +++ /dev/null @@ -1,33 +0,0 @@ -[ - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "t", - "consonant_length": 2.3, - "pitch": 3.38, - "text": "テ", - "vowel": "e", - "vowel_length": 0.8 - }, - { - "consonant": "s", - "consonant_length": 2.1, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 0.3 - }, - { - "consonant": "t", - "consonant_length": 2.3, - "pitch": 4.25, - "text": "ト", - "vowel": "o", - "vowel_length": 1.8 - } - ], - "pause_mora": null - } -] diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_sing_frame_audio_query/test_post_sing_frame_audio_query_200.json b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_sing_frame_audio_query/test_post_sing_frame_audio_query_200.json deleted file mode 100644 index 4914aa6d99a99e77577d13c7789b0639c5823ad3..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_sing_frame_audio_query/test_post_sing_frame_audio_query_200.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "f0": [ - 0.0, - 0.0, - 46.64, - 46.64, - 46.64, - 46.64, - 46.64, - 46.64, - 46.64, - 46.64, - 46.4, - 46.4, - 46.62, - 46.67, - 83.1, - 83.1, - 82.97, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "outputSamplingRate": 24000, - "outputStereo": false, - "phonemes": [ - { - "frame_length": 2, - "phoneme": "pau" - }, - { - "frame_length": 8, - "phoneme": "t" - }, - { - "frame_length": 2, - "phoneme": "e" - }, - { - "frame_length": 1, - "phoneme": "s" - }, - { - "frame_length": 1, - "phoneme": "u" - }, - { - "frame_length": 2, - "phoneme": "t" - }, - { - "frame_length": 1, - "phoneme": "o" - }, - { - "frame_length": 10, - "phoneme": "pau" - } - ], - "volume": [ - 0.0, - 0.0, - 0.33, - 0.33, - 0.33, - 0.33, - 0.33, - 0.33, - 0.33, - 0.33, - 0.13, - 0.13, - 0.32, - 0.36, - 0.79, - 0.79, - 0.64, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - "volumeScale": 1.0 -} diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_sing_frame_volume/test_post_sing_frame_volume_200.json b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_sing_frame_volume/test_post_sing_frame_volume_200.json deleted file mode 100644 index d5b255fbcbdc282717f9f4d57d13222508fd7ec7..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_sing_frame_volume/test_post_sing_frame_volume_200.json +++ /dev/null @@ -1,167 +0,0 @@ -[ - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.85, - 0.95, - 2.63, - 2.73, - 2.77, - 2.73, - 2.7, - 2.67, - 2.67, - 2.68, - 2.69, - 2.72, - 2.76, - 2.8, - 2.84, - 2.86, - 2.89, - 2.92, - 2.97, - 3.01, - 3.05, - 3.06, - 3.07, - 3.07, - 3.07, - 3.07, - 3.07, - 3.06, - 3.04, - 3.03, - 3.02, - 3.02, - 3.03, - 3.04, - 3.05, - 3.05, - 3.05, - 3.05, - 3.05, - 3.05, - 3.06, - 3.07, - 3.08, - 3.51, - 3.51, - 3.58, - 3.67, - 1.6, - 1.64, - 1.67, - 1.68, - 1.68, - 1.68, - 1.68, - 1.67, - 1.65, - 1.64, - 1.62, - 1.61, - 1.61, - 1.61, - 1.61, - 1.62, - 1.63, - 1.64, - 1.65, - 1.66, - 1.66, - 1.66, - 1.67, - 1.67, - 1.68, - 1.68, - 1.67, - 1.67, - 1.66, - 1.66, - 1.66, - 1.66, - 1.67, - 1.67, - 1.67, - 1.67, - 1.67, - 1.67, - 1.66, - 1.63, - 3.03, - 3.04, - 3.06, - 3.07, - 3.11, - 2.63, - 2.71, - 2.73, - 2.76, - 2.79, - 2.83, - 2.85, - 2.85, - 2.83, - 2.8, - 2.77, - 2.77, - 2.78, - 2.79, - 2.81, - 2.82, - 2.84, - 2.87, - 2.9, - 2.94, - 2.96, - 2.97, - 2.96, - 2.94, - 2.91, - 2.87, - 2.83, - 2.79, - 2.78, - 2.78, - 2.79, - 2.82, - 2.84, - 2.87, - 2.9, - 2.92, - 2.93, - 2.94, - 2.94, - 2.92, - 2.87, - 2.77, - 2.7, - 2.75, - 2.78, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 -] diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_synthesis.ambr b/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_synthesis.ambr deleted file mode 100644 index a8970cf021dc706983f42e1a456e0c505015fa00..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/__snapshots__/test_synthesis.ambr +++ /dev/null @@ -1,7 +0,0 @@ -# serializer version: 1 -# name: test_post_synthesis_200 - 'MD5:f7d42ce5787856549abc3d2d7561c06f' -# --- -# name: test_post_synthesis_old_audio_query_200 - 'MD5:f7d42ce5787856549abc3d2d7561c06f' -# --- diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_accent_phrases.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_accent_phrases.py deleted file mode 100644 index 5b1d600012357bfdd864450bf8432467ff1c5345..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_accent_phrases.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -/accent_phrases API のテスト -""" - -from test.utility import round_floats - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_accent_phrases_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.post( - "/accent_phrases", params={"text": "テストです", "speaker": 0} - ) - assert response.status_code == 200 - assert snapshot_json == round_floats(response.json(), 2) diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_audio_query.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_audio_query.py deleted file mode 100644 index e57ee66a18fb7a88ec6c2367155a7ed3dd1ee782..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_audio_query.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -/audio_query API のテスト -""" - -from test.utility import round_floats - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_audio_query_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.post("/audio_query", params={"text": "テストです", "speaker": 0}) - assert response.status_code == 200 - assert snapshot_json == round_floats(response.json(), round_value=2) diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_audio_query_from_preset.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_audio_query_from_preset.py deleted file mode 100644 index 0ec5dff5104a63820c2a877a9671ac406161e454..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_audio_query_from_preset.py +++ /dev/null @@ -1,47 +0,0 @@ -""" -/audio_query_from_preset API のテスト -""" - -from test.utility import round_floats - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_audio_query_from_preset_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - # Setup - # NOTE: 事前準備用のプリセット API が壊れた場合、このテストが偽陽性で failed になる可能性がある - preset = { - "id": 8888, - "name": "test_preset", - "speaker_uuid": "123-456-789-234", - "style_id": 9999, - "speedScale": 1.1, - "pitchScale": 0.9, - "intonationScale": 1.2, - "volumeScale": 1.3, - "prePhonemeLength": 20, - "postPhonemeLength": 5, - "pauseLength": 15, - "pauseLengthScale": 1.4, - } - client.post("/add_preset", params={}, json=preset) - - # Test - response = client.post( - "/audio_query_from_preset", params={"text": "テストです", "preset_id": 8888} - ) - assert response.status_code == 200 - assert snapshot_json == round_floats(response.json(), 2) - - -def test_post_audio_query_from_preset_422( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.post( - "/audio_query_from_preset", params={"text": "テストです", "preset_id": 404} - ) - assert response.status_code == 422 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_frame_synthesis.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_frame_synthesis.py deleted file mode 100644 index 836b52ac72366c862d7683c17a4c61a52619463a..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_frame_synthesis.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -/frame_synthesis API のテスト -""" - -from test.utility import hash_wave_floats_from_wav_bytes - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_frame_synthesis_200( - client: TestClient, snapshot: SnapshotAssertion -) -> None: - query = { - "f0": [ - 0.0, - 0.0, - 46.63821792602539, - 46.63821792602539, - 46.63821792602539, - 46.63821792602539, - 46.63821792602539, - 46.63821792602539, - 46.63821792602539, - 46.63821792602539, - 46.396461486816406, - 46.396461486816406, - 46.61719512939453, - 46.66975021362305, - 83.099853515625, - 83.099853515625, - 82.96875762939453, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - ], - "volume": [ - 0.0, - 0.0, - 0.3342486023902893, - 0.3342486023902893, - 0.3342486023902893, - 0.3342486023902893, - 0.3342486023902893, - 0.3342486023902893, - 0.3342486023902893, - 0.3342486023902893, - 0.12581685185432434, - 0.12581685185432434, - 0.316038578748703, - 0.36159414052963257, - 0.794084370136261, - 0.794084370136261, - 0.6428364515304565, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - ], - "phonemes": [ - {"phoneme": "pau", "frame_length": 2}, - {"phoneme": "t", "frame_length": 8}, - {"phoneme": "e", "frame_length": 2}, - {"phoneme": "s", "frame_length": 1}, - {"phoneme": "u", "frame_length": 1}, - {"phoneme": "t", "frame_length": 2}, - {"phoneme": "o", "frame_length": 1}, - {"phoneme": "pau", "frame_length": 10}, - ], - "volumeScale": 1.0, - "outputSamplingRate": 24000, - "outputStereo": False, - } - response = client.post("/frame_synthesis", params={"speaker": 0}, json=query) - assert response.status_code == 200 - - # FileResponse 内の .wav から抽出された音声波形が一致する - assert response.headers["content-type"] == "audio/wav" - assert snapshot == hash_wave_floats_from_wav_bytes(response.read()) diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_initialize_speaker.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_initialize_speaker.py deleted file mode 100644 index 0aceeff407a42c5714e3c86b371e23b740b53a1c..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_initialize_speaker.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -/initialize_speaker API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_initialize_speaker_204( - client: TestClient, snapshot: SnapshotAssertion -) -> None: - response = client.post("/initialize_speaker", params={"speaker": 0}) - assert response.status_code == 204 - assert snapshot == response.content diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_is_initialized_speaker.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_is_initialized_speaker.py deleted file mode 100644 index 8da91b9e5f0e09d1257bb3d6816ce509044e9ac1..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_is_initialized_speaker.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -/is_initialized_speaker API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_is_initialized_speaker_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get("/is_initialized_speaker", params={"speaker": 0}) - assert response.status_code == 200 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_mora_data.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_mora_data.py deleted file mode 100644 index d5b97d7bc7c3d76edb203892b4e16d4af6104990..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_mora_data.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -/mora_data API のテスト -""" - -from test.e2e.single_api.utils import gen_mora -from test.utility import round_floats - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_mora_data_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - accent_phrases = [ - { - "moras": [ - gen_mora("テ", "t", 2.3, "e", 0.8, 3.3), - gen_mora("ス", "s", 2.1, "U", 0.3, 0.0), - gen_mora("ト", "t", 2.3, "o", 1.8, 4.1), - ], - "accent": 1, - "pause_mora": None, - "is_interrogative": False, - } - ] - response = client.post("/mora_data", params={"speaker": 0}, json=accent_phrases) - assert response.status_code == 200 - assert snapshot_json == round_floats(response.json(), 2) diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_mora_length.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_mora_length.py deleted file mode 100644 index 33f6bb837e140d3c67d8ef5fd154d86d3911f1e7..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_mora_length.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -/mora_length API のテスト -""" - -from test.e2e.single_api.utils import gen_mora -from test.utility import round_floats - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_mora_length_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - accent_phrases = [ - { - "moras": [ - gen_mora("テ", "t", 2.3, "e", 0.8, 3.3), - gen_mora("ス", "s", 2.1, "U", 0.3, 0.0), - gen_mora("ト", "t", 2.3, "o", 1.8, 4.1), - ], - "accent": 1, - "pause_mora": None, - "is_interrogative": False, - } - ] - response = client.post("/mora_length", params={"speaker": 0}, json=accent_phrases) - assert response.status_code == 200 - assert snapshot_json == round_floats(response.json(), 2) diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_mora_pitch.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_mora_pitch.py deleted file mode 100644 index c0fb5c9c9c8ba2ce17284cc2399a9ee0f2ca9988..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_mora_pitch.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -/mora_pitch API のテスト -""" - -from test.e2e.single_api.utils import gen_mora -from test.utility import round_floats - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_mora_pitch_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - accent_phrases = [ - { - "moras": [ - gen_mora("テ", "t", 2.3, "e", 0.8, 3.3), - gen_mora("ス", "s", 2.1, "U", 0.3, 0.0), - gen_mora("ト", "t", 2.3, "o", 1.8, 4.1), - ], - "accent": 1, - "pause_mora": None, - "is_interrogative": False, - } - ] - response = client.post("/mora_pitch", params={"speaker": 0}, json=accent_phrases) - assert response.status_code == 200 - assert snapshot_json == round_floats(response.json(), 2) diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_multi_synthesis.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_multi_synthesis.py deleted file mode 100644 index 50a8b50a79ab143e48ed95efd412f1b3c770e801..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_multi_synthesis.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -/multi_synthesis API のテスト -""" - -from test.e2e.single_api.utils import gen_mora - -from fastapi.testclient import TestClient - - -def test_post_multi_synthesis_200(client: TestClient) -> None: - queries = [ - { - "accent_phrases": [ - { - "moras": [ - gen_mora("テ", "t", 2.3, "e", 0.8, 3.3), - gen_mora("ス", "s", 2.1, "U", 0.3, 0.0), - gen_mora("ト", "t", 2.3, "o", 1.8, 4.1), - ], - "accent": 1, - "pause_mora": None, - "is_interrogative": False, - } - ], - "speedScale": 1.0, - "pitchScale": 1.0, - "intonationScale": 1.0, - "volumeScale": 1.0, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - "outputSamplingRate": 24000, - "outputStereo": False, - "kana": "テ'_スト", - }, - { - "accent_phrases": [ - { - "moras": [ - gen_mora("テ", "t", 2.3, "e", 0.8, 3.3), - gen_mora("ス", "s", 2.1, "U", 0.3, 0.0), - gen_mora("ト", "t", 2.3, "o", 1.8, 4.1), - gen_mora("ト", "t", 2.3, "o", 1.8, 4.1), - ], - "accent": 1, - "pause_mora": None, - "is_interrogative": False, - } - ], - "speedScale": 1.0, - "pitchScale": 1.0, - "intonationScale": 1.0, - "volumeScale": 1.0, - "prePhonemeLength": 0.2, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - "outputSamplingRate": 24000, - "outputStereo": False, - "kana": "テ'_ストト", - }, - ] - response = client.post("/multi_synthesis", params={"speaker": 0}, json=queries) - assert response.status_code == 200 - - # FileResponse 内の zip ファイルに圧縮された .wav から抽出された音声波形が一致する - # FIXME: スナップショットテストを足す - # NOTE: ZIP ファイル内の .wav に Linux-Windows 数値精度問題があるため解凍が必要 - assert response.headers["content-type"] == "application/zip" - # from test.utility import summarize_wav_bytes - # from syrupy.assertion import SnapshotAssertion - # # zip 解凍 - # wav_summarys = map(lambda wav_byte: summarize_wav_bytes(wav_byte), wav_bytes) - # wavs_summary = concatenate_func(wav_summarys) - # assert snapshot == wavs_summary diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_sing_frame_audio_query.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_sing_frame_audio_query.py deleted file mode 100644 index 31ec684bddef4231e499e62dab3c09cef1bf95ec..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_sing_frame_audio_query.py +++ /dev/null @@ -1,25 +0,0 @@ -""" -/sing_frame_audio_query API のテスト -""" - -from test.utility import round_floats - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_sing_frame_audio_query_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - score = { - "notes": [ - {"key": None, "frame_length": 10, "lyric": ""}, - {"key": 30, "frame_length": 3, "lyric": "て"}, - {"key": 30, "frame_length": 3, "lyric": "す"}, - {"key": 40, "frame_length": 1, "lyric": "と"}, - {"key": None, "frame_length": 10, "lyric": ""}, - ] - } - response = client.post("/sing_frame_audio_query", params={"speaker": 0}, json=score) - assert response.status_code == 200 - assert snapshot_json == round_floats(response.json(), 2) diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_sing_frame_volume.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_sing_frame_volume.py deleted file mode 100644 index 2b85faa4a6c4c225f00af1f984a960e0cf0bac5b..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_sing_frame_volume.py +++ /dev/null @@ -1,381 +0,0 @@ -""" -/sing_frame_audio_query API のテスト -""" - -from test.utility import round_floats - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_sing_frame_volume_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - score = { - "notes": [ - {"key": None, "frame_length": 15, "lyric": ""}, - {"key": 60, "frame_length": 45, "lyric": "ド"}, - {"key": 62, "frame_length": 45, "lyric": "レ"}, - {"key": 64, "frame_length": 45, "lyric": "ミ"}, - {"key": None, "frame_length": 15, "lyric": ""}, - ] - } - - frame_audio_query = { - "f0": [ - 203.12020874023438, - 203.22958374023438, - 203.18966674804688, - 203.2109832763672, - 203.19461059570312, - 203.1883087158203, - 203.20797729492188, - 203.20526123046875, - 203.19091796875, - 203.1884002685547, - 203.28414916992188, - 203.3013153076172, - 202.45860290527344, - 183.76019287109375, - 204.18850708007812, - 226.11729431152344, - 234.71311950683594, - 237.92971801757812, - 235.15191650390625, - 231.90707397460938, - 229.99266052246094, - 229.66290283203125, - 230.2884063720703, - 231.7293243408203, - 234.10093688964844, - 237.48324584960938, - 241.1653289794922, - 244.013916015625, - 246.09280395507812, - 248.35073852539062, - 251.46533203125, - 255.3215789794922, - 259.22845458984375, - 262.0407409667969, - 263.4653015136719, - 264.0202941894531, - 264.0643615722656, - 264.0140075683594, - 264.18475341796875, - 264.071533203125, - 263.0423889160156, - 261.5002746582031, - 260.30755615234375, - 259.74737548828125, - 259.97265625, - 260.8736877441406, - 261.92633056640625, - 262.47418212890625, - 262.64044189453125, - 262.7281188964844, - 262.550537109375, - 262.14971923828125, - 262.1888732910156, - 262.9635009765625, - 264.0044250488281, - 265.0442810058594, - 265.5814514160156, - 266.043701171875, - 270.6605224609375, - 278.0888366699219, - 286.00537109375, - 292.86920166015625, - 297.3049621582031, - 299.27734375, - 300.3929443359375, - 300.6061706542969, - 299.57958984375, - 297.44024658203125, - 294.6528015136719, - 291.82952880859375, - 289.404052734375, - 287.65704345703125, - 286.74700927734375, - 286.7215881347656, - 287.2806091308594, - 288.5699462890625, - 290.4000244140625, - 292.43536376953125, - 294.1000061035156, - 295.3788146972656, - 296.26678466796875, - 296.9929504394531, - 297.8184509277344, - 298.62176513671875, - 299.185302734375, - 299.1925964355469, - 298.5477294921875, - 297.5537109375, - 296.7957458496094, - 296.4950256347656, - 296.5893249511719, - 297.08233642578125, - 297.6444091796875, - 298.2401123046875, - 298.5912780761719, - 298.34576416015625, - 297.736083984375, - 297.81304931640625, - 297.0906982421875, - 291.0978088378906, - 281.9891357421875, - 282.7239990234375, - 285.04388427734375, - 285.44024658203125, - 289.8936767578125, - 303.32220458984375, - 312.589599609375, - 314.6080322265625, - 317.6407470703125, - 321.5991516113281, - 325.74896240234375, - 327.905517578125, - 328.0322265625, - 326.0955505371094, - 322.309326171875, - 319.3800354003906, - 319.07257080078125, - 319.984130859375, - 321.45501708984375, - 323.28179931640625, - 325.30828857421875, - 327.5245361328125, - 330.62957763671875, - 334.59619140625, - 338.2353515625, - 340.77130126953125, - 341.728759765625, - 340.83551025390625, - 338.66802978515625, - 335.49774169921875, - 330.9483642578125, - 325.6497497558594, - 321.55267333984375, - 319.8941345214844, - 320.3050231933594, - 322.0650634765625, - 324.57373046875, - 327.59454345703125, - 330.9676208496094, - 334.1003723144531, - 336.59857177734375, - 338.0997314453125, - 338.8575134277344, - 338.69305419921875, - 336.66839599609375, - 330.25885009765625, - 319.44140625, - 311.1017150878906, - 316.9340515136719, - 319.87322998046875, - 305.58660888671875, - 298.75933837890625, - 309.8575134277344, - 314.0906066894531, - 316.8128662109375, - 333.0500793457031, - 355.0403747558594, - 355.17584228515625, - 355.1917724609375, - 355.20037841796875, - 355.1678771972656, - 355.1257019042969, - 355.2730712890625, - 355.0054931640625, - 354.0846252441406, - ], - "volume": [ - 0.0004787147045135498, - 0.0010405704379081726, - 0.0014588013291358948, - 0.0012274235486984253, - 0.0010905563831329346, - 0.0009400248527526855, - 0.0009405165910720825, - 0.0006652474403381348, - 0.0002709329128265381, - -0.0002336353063583374, - -0.0002986416220664978, - 0.0005924627184867859, - 0.003974780440330505, - 0.017938457429409027, - 0.039812393486499786, - 0.0595753975212574, - 0.08433514088392258, - 0.09954013675451279, - 0.10054653882980347, - 0.0972367525100708, - 0.09018714725971222, - 0.0851733461022377, - 0.07580415159463882, - 0.06871049106121063, - 0.06137121468782425, - 0.05629901587963104, - 0.05338696017861366, - 0.05235457420349121, - 0.052907101809978485, - 0.05187157168984413, - 0.05293390154838562, - 0.05417793244123459, - 0.05544605106115341, - 0.05646364018321037, - 0.05738266557455063, - 0.05892559885978699, - 0.05947083234786987, - 0.05872538313269615, - 0.0584573820233345, - 0.05720439925789833, - 0.05803307890892029, - 0.05679874122142792, - 0.05562245100736618, - 0.05525610223412514, - 0.05318000912666321, - 0.05259035527706146, - 0.05080951377749443, - 0.05003567039966583, - 0.0496600866317749, - 0.04906811937689781, - 0.04923130199313164, - 0.04877219721674919, - 0.0484158918261528, - 0.048542704433202744, - 0.04962582886219025, - 0.045066948980093, - 0.037152379751205444, - 0.03356718644499779, - 0.036367204040288925, - 0.05020733177661896, - 0.06368612498044968, - 0.07467876374721527, - 0.07978153228759766, - 0.08049686998128891, - 0.0795092061161995, - 0.07859177887439728, - 0.07510609179735184, - 0.07104776799678802, - 0.06727584451436996, - 0.06365916877985, - 0.06015634536743164, - 0.058127306401729584, - 0.05694492161273956, - 0.05727839097380638, - 0.05793873220682144, - 0.06043902784585953, - 0.06278379261493683, - 0.06741152703762054, - 0.06920691579580307, - 0.07085863500833511, - 0.0709768608212471, - 0.07126042246818542, - 0.07135792076587677, - 0.07060225307941437, - 0.0693637952208519, - 0.06815081089735031, - 0.06793922185897827, - 0.06794025748968124, - 0.06763045489788055, - 0.06797683238983154, - 0.0699392557144165, - 0.07168693840503693, - 0.07338269054889679, - 0.07539191842079163, - 0.07654494792222977, - 0.07708939164876938, - 0.07883097976446152, - 0.08011248707771301, - 0.0797126516699791, - 0.07450003921985626, - 0.06884774565696716, - 0.0707208514213562, - 0.08004502952098846, - 0.09337422251701355, - 0.1131061464548111, - 0.13021202385425568, - 0.14446872472763062, - 0.14968127012252808, - 0.15179219841957092, - 0.14891058206558228, - 0.1466791033744812, - 0.14219200611114502, - 0.1366046965122223, - 0.12968313694000244, - 0.12211640924215317, - 0.11668159067630768, - 0.11206194758415222, - 0.10870714485645294, - 0.10816323757171631, - 0.11024853587150574, - 0.11374224722385406, - 0.12013312429189682, - 0.12631694972515106, - 0.1320280134677887, - 0.13775652647018433, - 0.14057473838329315, - 0.14202912151813507, - 0.13998106122016907, - 0.1357124000787735, - 0.12879544496536255, - 0.11972789466381073, - 0.10934856534004211, - 0.10000964999198914, - 0.09129352122545242, - 0.08448395133018494, - 0.07895656675100327, - 0.07746186852455139, - 0.07585690915584564, - 0.07549901306629181, - 0.0747423842549324, - 0.07375279814004898, - 0.0723096951842308, - 0.06903150677680969, - 0.06309784948825836, - 0.05319780111312866, - 0.043854743242263794, - 0.03212194889783859, - 0.020242862403392792, - 0.010037116706371307, - 0.003522723913192749, - 0.001071922481060028, - 0.00034518539905548096, - 0.0006061941385269165, - 0.0007827728986740112, - 0.0006604194641113281, - 0.0008484125137329102, - 0.0013152658939361572, - 0.00047776103019714355, - 0.00029630959033966064, - 0.0005781650543212891, - 0.00028308480978012085, - 0.00037220120429992676, - -8.973479270935059e-05, - 0.0009073689579963684, - -0.001959472894668579, - ], - "phonemes": [ - {"phoneme": "pau", "frame_length": 13}, - {"phoneme": "d", "frame_length": 2}, - {"phoneme": "o", "frame_length": 41}, - {"phoneme": "r", "frame_length": 4}, - {"phoneme": "e", "frame_length": 40}, - {"phoneme": "m", "frame_length": 5}, - {"phoneme": "i", "frame_length": 45}, - {"phoneme": "pau", "frame_length": 15}, - ], - "volumeScale": 1.0, - "outputSamplingRate": 24000, - "outputStereo": False, - } - - response = client.post( - "/sing_frame_volume", - params={"speaker": 0}, - json={"score": score, "frame_audio_query": frame_audio_query}, - ) - print(response.text) - assert response.status_code == 200 - assert snapshot_json == round_floats(response.json(), 2) diff --git a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_synthesis.py b/voicevox_engine/test/e2e/single_api/tts_pipeline/test_synthesis.py deleted file mode 100644 index 1827eba3eebf0bc424b833c9d54a8522d4b015d3..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/tts_pipeline/test_synthesis.py +++ /dev/null @@ -1,77 +0,0 @@ -""" -/synthesis API のテスト -""" - -from test.e2e.single_api.utils import gen_mora -from test.utility import hash_wave_floats_from_wav_bytes - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_synthesis_200(client: TestClient, snapshot: SnapshotAssertion) -> None: - query = { - "accent_phrases": [ - { - "moras": [ - gen_mora("テ", "t", 2.3, "e", 0.8, 3.3), - gen_mora("ス", "s", 2.1, "U", 0.3, 0.0), - gen_mora("ト", "t", 2.3, "o", 1.8, 4.1), - ], - "accent": 1, - "pause_mora": None, - "is_interrogative": False, - } - ], - "speedScale": 1.0, - "pitchScale": 1.0, - "intonationScale": 1.0, - "volumeScale": 1.0, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - "outputSamplingRate": 24000, - "outputStereo": False, - "kana": "テ'_スト", - } - response = client.post("/synthesis", params={"speaker": 0}, json=query) - assert response.status_code == 200 - - # 音声波形が一致する - assert response.headers["content-type"] == "audio/wav" - assert snapshot == hash_wave_floats_from_wav_bytes(response.read()) - - -def test_post_synthesis_old_audio_query_200( - client: TestClient, snapshot: SnapshotAssertion -) -> None: - """古いバージョンの audio_query でもエラーなく合成できる""" - query = { - "accent_phrases": [ - { - "moras": [ - gen_mora("テ", "t", 2.3, "e", 0.8, 3.3), - gen_mora("ス", "s", 2.1, "U", 0.3, 0.0), - gen_mora("ト", "t", 2.3, "o", 1.8, 4.1), - ], - "accent": 1, - "pause_mora": None, - "is_interrogative": False, - } - ], - "speedScale": 1.0, - "pitchScale": 1.0, - "intonationScale": 1.0, - "volumeScale": 1.0, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "outputSamplingRate": 24000, - "outputStereo": False, - } - response = client.post("/synthesis", params={"speaker": 0}, json=query) - assert response.status_code == 200 - - # 音声波形が一致する - assert response.headers["content-type"] == "audio/wav" - assert snapshot == hash_wave_floats_from_wav_bytes(response.read()) diff --git a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_import_user_dict.ambr b/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_import_user_dict.ambr deleted file mode 100644 index b9b231460d3512308e22a709899b833725a7ad20..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_import_user_dict.ambr +++ /dev/null @@ -1,4 +0,0 @@ -# serializer version: 1 -# name: test_post_import_user_dict_204 - b'' -# --- diff --git a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_import_user_dict/test_post_import_user_dict_contents.json b/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_import_user_dict/test_post_import_user_dict_contents.json deleted file mode 100644 index bbd43328b2ec22d0b71a36b8eabe76ea6c816be5..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_import_user_dict/test_post_import_user_dict_contents.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "a11196ad-caa8-4f4e-8eb3-3d2261c798fd": { - "accent_associative_rule": "*", - "accent_type": 1, - "context_id": 1348, - "inflectional_form": "*", - "inflectional_type": "*", - "mora_count": 3, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "priority": 4, - "pronunciation": "テストサン", - "stem": "*", - "surface": "test3", - "yomi": "テストサン" - }, - "a89596ad-caa8-4f4e-8eb3-3d2261c798fd": { - "accent_associative_rule": "*", - "accent_type": 1, - "context_id": 1348, - "inflectional_form": "*", - "inflectional_type": "*", - "mora_count": 3, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "priority": 5, - "pronunciation": "テストイチ", - "stem": "*", - "surface": "test1", - "yomi": "テストイチ" - }, - "c89596ad-caa8-4f4e-8eb3-3d2261c798fd": { - "accent_associative_rule": "*", - "accent_type": 1, - "context_id": 1348, - "inflectional_form": "*", - "inflectional_type": "*", - "mora_count": 2, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "priority": 5, - "pronunciation": "テストニ", - "stem": "*", - "surface": "test2", - "yomi": "テストニ" - } -} diff --git a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_api/test_get_user_dict_200.json b/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_api/test_get_user_dict_200.json deleted file mode 100644 index 47d27104474f61d9d5fed7bb9715a6a66529e906..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_api/test_get_user_dict_200.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "a89596ad-caa8-4f4e-8eb3-3d2261c798fd": { - "accent_associative_rule": "*", - "accent_type": 1, - "context_id": 1348, - "inflectional_form": "*", - "inflectional_type": "*", - "mora_count": 3, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "priority": 5, - "pronunciation": "テストイチ", - "stem": "*", - "surface": "test1", - "yomi": "テストイチ" - }, - "c89596ad-caa8-4f4e-8eb3-3d2261c798fd": { - "accent_associative_rule": "*", - "accent_type": 1, - "context_id": 1348, - "inflectional_form": "*", - "inflectional_type": "*", - "mora_count": 2, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "priority": 5, - "pronunciation": "テストニ", - "stem": "*", - "surface": "test2", - "yomi": "テストニ" - } -} diff --git a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word.ambr b/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word.ambr deleted file mode 100644 index fb7083adc411ea7b4923887330bc03f2eac8f788..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word.ambr +++ /dev/null @@ -1,7 +0,0 @@ -# serializer version: 1 -# name: test_delete_user_dict_word_204 - b'' -# --- -# name: test_put_user_dict_word_204 - b'' -# --- diff --git a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_delete_user_dict_word_422.json b/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_delete_user_dict_word_422.json deleted file mode 100644 index e6391a606bc28a96645619dc69c9ef56f9d464d7..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_delete_user_dict_word_422.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "detail": "IDに該当するワードが見つかりませんでした" -} diff --git a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_delete_user_dict_word_contents.json b/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_delete_user_dict_word_contents.json deleted file mode 100644 index 0702969caafbafa26bbd2a5de9f210bf88b92e26..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_delete_user_dict_word_contents.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "c89596ad-caa8-4f4e-8eb3-3d2261c798fd": { - "accent_associative_rule": "*", - "accent_type": 1, - "context_id": 1348, - "inflectional_form": "*", - "inflectional_type": "*", - "mora_count": 2, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "priority": 5, - "pronunciation": "テストニ", - "stem": "*", - "surface": "test2", - "yomi": "テストニ" - } -} diff --git a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_post_user_dict_word_200.json b/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_post_user_dict_word_200.json deleted file mode 100644 index ada06114d8e51fdb80919fa1e79a4a5f01fa5555..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_post_user_dict_word_200.json +++ /dev/null @@ -1 +0,0 @@ -"" diff --git a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_post_user_dict_word_422.json b/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_post_user_dict_word_422.json deleted file mode 100644 index c5a1e1d7925316d21b7aa04f4edef2a5acdc135f..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_post_user_dict_word_422.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "detail": [ - { - "ctx": { - "le": 10 - }, - "input": "100", - "loc": [ - "query", - "priority" - ], - "msg": "Input should be less than or equal to 10", - "type": "less_than_equal" - } - ] -} diff --git a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_put_user_dict_word_422.json b/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_put_user_dict_word_422.json deleted file mode 100644 index 5363b2aa282213e901dcbb6c88674327aef61467..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_put_user_dict_word_422.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "detail": "UUIDに該当するワードが見つかりませんでした" -} diff --git a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_put_user_dict_word_contents.json b/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_put_user_dict_word_contents.json deleted file mode 100644 index e9acc637a1447f19b25157581e2376fb3ed8a52a..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/__snapshots__/test_user_dict_word/test_put_user_dict_word_contents.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "a89596ad-caa8-4f4e-8eb3-3d2261c798fd": { - "accent_associative_rule": "*", - "accent_type": 1, - "context_id": 1348, - "inflectional_form": "*", - "inflectional_type": "*", - "mora_count": 3, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "priority": 1, - "pronunciation": "テスト", - "stem": "*", - "surface": "test", - "yomi": "テスト" - }, - "c89596ad-caa8-4f4e-8eb3-3d2261c798fd": { - "accent_associative_rule": "*", - "accent_type": 1, - "context_id": 1348, - "inflectional_form": "*", - "inflectional_type": "*", - "mora_count": 2, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "priority": 5, - "pronunciation": "テストニ", - "stem": "*", - "surface": "test2", - "yomi": "テストニ" - } -} diff --git a/voicevox_engine/test/e2e/single_api/user_dict/test_import_user_dict.py b/voicevox_engine/test/e2e/single_api/user_dict/test_import_user_dict.py deleted file mode 100644 index 9913fe83a83d5dd0eff1bc6929e6a0c30e7618a2..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/test_import_user_dict.py +++ /dev/null @@ -1,47 +0,0 @@ -""" -/import_user_dict APIのテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_import_user_dict_204( - client: TestClient, snapshot: SnapshotAssertion -) -> None: - user_dict: dict[str, dict[str, str | int]] = {} - response = client.post( - "/import_user_dict", json=user_dict, params={"override": True} - ) - assert response.status_code == 204 - assert snapshot == response.content - - -def test_post_import_user_dict_contents( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - """辞書インポートは内容が正しく反映されている。""" - - user_dict: dict[str, dict[str, str | int]] = { - "a11196ad-caa8-4f4e-8eb3-3d2261c798fd": { - "accent_associative_rule": "*", - "accent_type": 1, - "context_id": 1348, - "inflectional_form": "*", - "inflectional_type": "*", - "mora_count": 3, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "priority": 4, - "pronunciation": "テストサン", - "stem": "*", - "surface": "test3", - "yomi": "テストサン", - }, - } - client.post("/import_user_dict", json=user_dict, params={"override": True}) - # NOTE: 'GET /user_dict' が正しく機能することを前提とする - response = client.get("/user_dict", params={}) - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/user_dict/test_user_dict_api.py b/voicevox_engine/test/e2e/single_api/user_dict/test_user_dict_api.py deleted file mode 100644 index fc0bc14ed1957ad2a91e06f2ba41eec01b59f76e..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/test_user_dict_api.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -/user_dict API のテスト -""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_get_user_dict_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get("/user_dict", params={}) - assert response.status_code == 200 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/user_dict/test_user_dict_word.py b/voicevox_engine/test/e2e/single_api/user_dict/test_user_dict_word.py deleted file mode 100644 index 573669e053c522a0b4b11947191814072b9f8180..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/user_dict/test_user_dict_word.py +++ /dev/null @@ -1,129 +0,0 @@ -""" -ユーザー辞書の言葉のAPIのテスト -""" - -import re - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_post_user_dict_word_200( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - params: dict[str, str | int] = { - "surface": "test", - "pronunciation": "テスト", - "accent_type": 1, - "word_type": "PROPER_NOUN", - "priority": 5, - } - response = client.post("/user_dict_word", params=params) - assert response.status_code == 200 - - # NOTE: ランダム付与される UUID を固定値へ置換する - response_json = response.json() - assert isinstance(response_json, str) - uuidv4_pattern = r"[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}" - response_json = re.sub(uuidv4_pattern, "", response_json) - - assert snapshot_json == response_json - - -def test_post_user_dict_word_422( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - params: dict[str, str | int] = { - "surface": "test", - "pronunciation": "テスト", - "accent_type": 1, - "word_type": "PROPER_NOUN", - "priority": 100, - } - # 範囲外の優先度はエラー - response = client.post("/user_dict_word", params=params) - assert response.status_code == 422 - assert snapshot_json == response.json() - - -def test_put_user_dict_word_204( - client: TestClient, snapshot: SnapshotAssertion -) -> None: - word_uuid = "a89596ad-caa8-4f4e-8eb3-3d2261c798fd" - params: dict[str, str | int] = { - "surface": "test", - "pronunciation": "テスト", - "accent_type": 1, - "word_uuid": word_uuid, - "word_type": "PROPER_NOUN", - "priority": 1, - } - response = client.put(f"/user_dict_word/{word_uuid}", params=params) - assert response.status_code == 204 - assert snapshot == response.content - - -def test_put_user_dict_word_contents( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - """単語更新は内容が正しく反映されている。""" - word_uuid = "a89596ad-caa8-4f4e-8eb3-3d2261c798fd" - params: dict[str, str | int] = { - "surface": "test", - "pronunciation": "テスト", - "accent_type": 1, - "word_uuid": word_uuid, - "word_type": "PROPER_NOUN", - "priority": 1, - } - client.put(f"/user_dict_word/{word_uuid}", params=params) - # NOTE: 'GET /user_dict' が正しく機能することを前提とする - response = client.get("/user_dict", params={}) - assert snapshot_json == response.json() - - -def test_put_user_dict_word_422( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - word_uuid = "40400000" - params: dict[str, str | int] = { - "surface": "test", - "pronunciation": "テスト", - "accent_type": 1, - "word_uuid": word_uuid, - "word_type": "PROPER_NOUN", - "priority": 1, - } - # 存在しない word はエラー - response = client.put(f"/user_dict_word/{word_uuid}", params=params) - assert response.status_code == 422 - assert snapshot_json == response.json() - - -def test_delete_user_dict_word_204( - client: TestClient, snapshot: SnapshotAssertion -) -> None: - word_uuid = "a89596ad-caa8-4f4e-8eb3-3d2261c798fd" - response = client.delete(f"/user_dict_word/{word_uuid}", params={}) - assert response.status_code == 204 - assert snapshot == response.content - - -def test_delete_user_dict_word_contents( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - word_uuid = "a89596ad-caa8-4f4e-8eb3-3d2261c798fd" - client.delete(f"/user_dict_word/{word_uuid}", params={}) - # NOTE: 'GET /user_dict' が正しく機能することを前提とする - response = client.get("/user_dict", params={}) - assert snapshot_json == response.json() - - -def test_delete_user_dict_word_422( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - word_uuid = "40400000" - # 存在しない word はエラー - response = client.delete(f"/user_dict_word/{word_uuid}", params={}) - assert response.status_code == 422 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/single_api/utils.py b/voicevox_engine/test/e2e/single_api/utils.py deleted file mode 100644 index 5b2515dca54b17e9956036da9abeff86d525c388..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/single_api/utils.py +++ /dev/null @@ -1,28 +0,0 @@ -from typing import TypedDict - - -class MoraForTest(TypedDict): - text: str - consonant: str - consonant_length: float - vowel: str - vowel_length: float - pitch: float - - -def gen_mora( - text: str, - consonant: str, - consonant_length: float, - vowel: str, - vowel_length: float, - pitch: float, -) -> MoraForTest: - return { - "text": text, - "consonant": consonant, - "consonant_length": consonant_length, - "vowel": vowel, - "vowel_length": vowel_length, - "pitch": pitch, - } diff --git a/voicevox_engine/test/e2e/test_characters.py b/voicevox_engine/test/e2e/test_characters.py deleted file mode 100644 index 3da7ec324c9b27629c339f1a616e28865040b2b7..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/test_characters.py +++ /dev/null @@ -1,126 +0,0 @@ -"""キャラクターのテスト""" - -import hashlib -from test.utility import hash_long_string - -from fastapi.testclient import TestClient -from pydantic import TypeAdapter -from syrupy.assertion import SnapshotAssertion - -from voicevox_engine.metas.Metas import Speaker, SpeakerInfo - -_speaker_list_adapter = TypeAdapter(list[Speaker]) - - -def _hash_bytes(value: bytes) -> str: - """バイト列をハッシュ化する""" - return "MD5:" + hashlib.md5(value).hexdigest() - - -def _assert_resource_url( - client: TestClient, snapshot: SnapshotAssertion, url: str, name: str -) -> None: - """ - URLからデータが正しく取得できるかスナップショットテストをする - """ - response = client.get(url) - assert response.status_code == 200 - assert snapshot(name=name) == _hash_bytes(response.content) - - -def test_喋れるキャラクター一覧が取得できる( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get("/speakers") - assert response.status_code == 200 - assert snapshot_json == response.json() - - -def test_喋れるキャラクターの情報を取得できる( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - talkers = _speaker_list_adapter.validate_python(client.get("/speakers").json()) - for talker in talkers: - response = client.get( - "/speaker_info", params={"speaker_uuid": talker.speaker_uuid} - ) - assert snapshot_json( - name=talker.speaker_uuid, - ) == hash_long_string(response.json()) - - -def test_喋れるキャラクターの情報をURLで取得できる( - client: TestClient, snapshot_json: SnapshotAssertion, snapshot: SnapshotAssertion -) -> None: - def assert_resource_url(url: str, name: str) -> None: - _assert_resource_url(client, snapshot, url, name) - - speakers = _speaker_list_adapter.validate_json(client.get("/speakers").content) - for speaker in speakers: - speaker_id = speaker.speaker_uuid - response = client.get( - "/speaker_info", - params={"speaker_uuid": speaker_id, "resource_format": "url"}, - ) - assert snapshot_json(name=speaker_id) == response.json() - - speaker_info = SpeakerInfo.model_validate_json(response.content) - assert_resource_url(speaker_info.portrait, f"{speaker_id}_portrait") - - for style in speaker_info.style_infos: - assert_resource_url(style.icon, f"{speaker_id}_{style.id}_icon") - if style.portrait is not None: - assert_resource_url(style.portrait, f"{speaker_id}_{style.id}_portrait") - for i, voice_sample in enumerate(style.voice_samples): - assert_resource_url( - voice_sample, f"{speaker_id}_{style.id}_voice_sample_{i}" - ) - - -def test_歌えるキャラクター一覧が取得できる( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - response = client.get("/singers") - assert response.status_code == 200 - assert snapshot_json == response.json() - - -def test_歌えるキャラクターの情報を取得できる( - client: TestClient, snapshot_json: SnapshotAssertion -) -> None: - singers = _speaker_list_adapter.validate_python(client.get("/singers").json()) - for singer in singers: - response = client.get( - "/singer_info", params={"speaker_uuid": singer.speaker_uuid} - ) - assert snapshot_json( - name=singer.speaker_uuid, - ) == hash_long_string(response.json()) - - -def test_歌えるキャラクターの情報をURLで取得できる( - client: TestClient, snapshot_json: SnapshotAssertion, snapshot: SnapshotAssertion -) -> None: - def assert_resource_url(url: str, name: str) -> None: - _assert_resource_url(client, snapshot, url, name) - - singers = _speaker_list_adapter.validate_json(client.get("/singers").content) - for singer in singers: - singer_id = singer.speaker_uuid - response = client.get( - "/singer_info", - params={"speaker_uuid": singer_id, "resource_format": "url"}, - ) - assert snapshot_json(name=singer_id) == response.json() - - speaker_info = SpeakerInfo.model_validate_json(response.content) - assert_resource_url(speaker_info.portrait, f"{singer_id}_portrait") - - for style in speaker_info.style_infos: - assert_resource_url(style.icon, f"{singer_id}_{style.id}_icon") - if style.portrait is not None: - assert_resource_url(style.portrait, f"{singer_id}_{style.id}_portrait") - for i, voice_sample in enumerate(style.voice_samples): - assert_resource_url( - voice_sample, f"{singer_id}_{style.id}_voice_sample_{i}" - ) diff --git a/voicevox_engine/test/e2e/test_disable_api.py b/voicevox_engine/test/e2e/test_disable_api.py deleted file mode 100644 index 6b03fbc35ccccc05907447f841dc39961799b378..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/test_disable_api.py +++ /dev/null @@ -1,52 +0,0 @@ -""" -APIを無効化するテスト -""" - -from typing import Literal - -from fastapi.testclient import TestClient - -from voicevox_engine.app.application import generate_app - - -# clientとschemaとパスを受け取ってリクエストを送信し、レスポンスが403であることを確認する -def _assert_request_and_response_403( - client: TestClient, - method: Literal["post", "get", "put", "delete"], - path: str, -) -> None: - if method == "post": - response = client.post(path) - elif method == "get": - response = client.get(path) - elif method == "put": - response = client.put(path) - elif method == "delete": - response = client.delete(path) - else: - raise ValueError("methodはpost, get, put, deleteのいずれかである必要があります") - - assert response.status_code == 403, f"{method} {path} が403を返しませんでした" - - -def test_disable_mutable_api(app_params: dict) -> None: - """エンジンの静的なデータを変更するAPIを無効化するテスト""" - client = TestClient(generate_app(**app_params, disable_mutable_api=True)) - - # APIが無効化されているか確認 - _assert_request_and_response_403(client, "post", "/add_preset") - _assert_request_and_response_403(client, "post", "/update_preset") - _assert_request_and_response_403(client, "post", "/delete_preset") - _assert_request_and_response_403(client, "post", "/user_dict_word") - _assert_request_and_response_403(client, "put", "/user_dict_word/dummy") - _assert_request_and_response_403(client, "delete", "/user_dict_word/dummy") - _assert_request_and_response_403(client, "post", "/import_user_dict") - _assert_request_and_response_403(client, "post", "/setting") - - # FIXME: EngineManifestをDI可能にし、EngineManifestに従ってこれらのAPIを加える - # _assert_request_and_response_403(client, "post", "/install_library/dummy") - # _assert_request_and_response_403(client, "post", "/uninstall_library/dummy") - - # 他のAPIは有効 - response = client.get("/version") - assert response.status_code == 200 diff --git a/voicevox_engine/test/e2e/test_missing_core.py b/voicevox_engine/test/e2e/test_missing_core.py deleted file mode 100644 index 2365cecd492d9f78bc2260edb2284f2763e251b4..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/test_missing_core.py +++ /dev/null @@ -1,11 +0,0 @@ -"""コア取得失敗のテスト""" - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_missing_core_422(client: TestClient, snapshot_json: SnapshotAssertion) -> None: - """存在しないコアを指定するとエラーを返す。""" - response = client.get("/speakers", params={"core_version": "4.0.4"}) - assert response.status_code == 422 - assert snapshot_json == response.json() diff --git a/voicevox_engine/test/e2e/test_openapi.py b/voicevox_engine/test/e2e/test_openapi.py deleted file mode 100644 index 1cdb3b9b94cac9de5c0676e5e80a0c58d275eb66..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/test_openapi.py +++ /dev/null @@ -1,14 +0,0 @@ -from typing import Any - -from fastapi import FastAPI -from syrupy.assertion import SnapshotAssertion - - -def test_OpenAPIの形が変わっていないことを確認( - app: FastAPI, snapshot_json: SnapshotAssertion -) -> None: - # 変更があった場合はREADMEの「スナップショットの更新」の手順で更新可能 - openapi: Any = ( - app.openapi() - ) # snapshot_jsonがmypyに対応していないのでワークアラウンド - assert snapshot_json == openapi diff --git a/voicevox_engine/test/e2e/test_tts.py b/voicevox_engine/test/e2e/test_tts.py deleted file mode 100644 index 66c8e60a5a554e39c38f794ecfed69df5c230fbf..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/e2e/test_tts.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -TTSのテスト -""" - -from test.utility import hash_wave_floats_from_wav_bytes - -from fastapi.testclient import TestClient -from syrupy.assertion import SnapshotAssertion - - -def test_テキストとキャラクターIDから音声を合成できる( - client: TestClient, snapshot: SnapshotAssertion -) -> None: - # テキストとキャラクター ID から AudioQuery を生成する - audio_query_res = client.post( - "/audio_query", params={"text": "テストです", "speaker": 0} - ) - audio_query = audio_query_res.json() - - # AudioQuery から音声波形を生成する - synthesis_res = client.post("/synthesis", params={"speaker": 0}, json=audio_query) - - # リクエストが成功している - assert synthesis_res.status_code == 200 - - # FileResponse 内の .wav から抽出された音声波形が一致する - assert synthesis_res.headers["content-type"] == "audio/wav" - assert snapshot == hash_wave_floats_from_wav_bytes(synthesis_res.read()) diff --git a/voicevox_engine/test/unit/library/test_library_manager.py b/voicevox_engine/test/unit/library/test_library_manager.py deleted file mode 100644 index 061d4778795143deba907d5f3bae98c6acec4aad..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/library/test_library_manager.py +++ /dev/null @@ -1,258 +0,0 @@ -import copy -import glob -import json -import os -from io import BytesIO -from pathlib import Path -from tempfile import TemporaryDirectory -from typing import Any -from unittest import TestCase -from zipfile import ZipFile - -from voicevox_engine.library.library_manager import ( - LibraryFormatInvalidError, - LibraryManager, - LibraryNotFoundError, - LibraryUnsupportedError, -) - -VVLIB_MANIFEST_NAME = "vvlib_manifest.json" - - -def create_vvlib_manifest(template_vvlib: Any, **kwargs: Any) -> dict[str, Any]: - """テンプレートの vvlib から指定の属性を追加・上書きした、新たな vvlib オブジェクトを生成する。""" - vvlib_manifest = copy.deepcopy(template_vvlib) - return {**vvlib_manifest, **kwargs} - - -def create_vvlib_without_manifest(filename: str, template_vvlib_path: Path) -> None: - """テンプレートの vvlib からマニフェストファイルを削除した、新たな vvlib ファイルを指定パスに生成する。""" - with ( - ZipFile(filename, "w") as zf_out, - ZipFile(template_vvlib_path, "r") as zf_in, - ): - for file in zf_in.infolist(): - buffer = zf_in.read(file.filename) - if file.filename != VVLIB_MANIFEST_NAME: - zf_out.writestr(file, buffer) - - -def append_any_as_manifest_to_vvlib(obj: Any, vvlib_path: str) -> None: - """指定 vvlib へ任意の Python オブジェクトをマニフェストファイルとして追加する。""" - with ZipFile(vvlib_path, "a") as zf: - if isinstance(obj, str): - obj_str = obj - else: - obj_str = json.dumps(obj) - zf.writestr(VVLIB_MANIFEST_NAME, obj_str) - - -class TestLibraryManager(TestCase): - def setUp(self) -> None: - super().setUp() - self.tmp_dir = TemporaryDirectory() - self.tmp_dir_path = Path(self.tmp_dir.name) - self.engine_name = "Test Engine" - self.library_manger = LibraryManager( - self.tmp_dir_path, - "0.15.0", - "Test", - self.engine_name, - "c7b58856-bd56-4aa1-afb7-b8415f824b06", - ) - self.library_filename = Path("test/test.vvlib") - with open("test/unit/library/vvlib_manifest.json") as f: - self.vvlib_manifest = json.loads(f.read()) - self.library_uuid = self.vvlib_manifest["uuid"] - with ZipFile(self.library_filename, "w") as zf: - character_infos = glob.glob("resources/character_info/**", recursive=True) - for info in character_infos: - zf.write(info) - zf.writestr(VVLIB_MANIFEST_NAME, json.dumps(self.vvlib_manifest)) - self.library_file = open(self.library_filename, "br") - - def tearDown(self) -> None: - self.tmp_dir.cleanup() - self.library_file.close() - self.library_filename.unlink() - - def test_installed_libraries(self) -> None: - self.assertEqual(self.library_manger.installed_libraries(), {}) - - self.library_manger.install_library( - self.library_uuid, - self.library_file, - ) - # 内容はdownloadable_library.jsonを元に生成されるので、内容は確認しない - self.assertEqual( - list(self.library_manger.installed_libraries().keys())[0], self.library_uuid - ) - - self.library_manger.uninstall_library(self.library_uuid) - self.assertEqual(self.library_manger.installed_libraries(), {}) - - def test_install_unauthorized_library(self) -> None: - """エンジンの受け入れリストに ID の無い音声ライブラリはインストールできない。""" - invalid_uuid = "52398bd5-3cc3-406c-a159-dfec5ace4bab" - with self.assertRaises(LibraryNotFoundError): - self.library_manger.install_library(invalid_uuid, self.library_file) - - def test_install_non_zip_file(self) -> None: - """非 ZIP ファイルは音声ライブラリとしてインストールできない。""" - with self.assertRaises(LibraryFormatInvalidError): - self.library_manger.install_library(self.library_uuid, BytesIO()) - - def test_install_manifest_less_library(self) -> None: - """マニフェストの無い ZIP ファイルは音声ライブラリとしてインストールできない。""" - invalid_vvlib_name = "test/invalid.vvlib" - create_vvlib_without_manifest(invalid_vvlib_name, self.library_filename) - with ( - open(invalid_vvlib_name, "br") as f, - self.assertRaises(LibraryFormatInvalidError), - ): - self.library_manger.install_library(self.library_uuid, f) - - # Teardown - # TODO: tmp ファイルを用いた自動削除、あるいは、共通 teardown による削除へ実装し直す - os.remove(invalid_vvlib_name) - - def test_install_broken_manifest_library(self) -> None: - """不正な形式の vvlib_manifest.json をもつ ZIP ファイルは音声ライブラリとしてインストールできない。""" - - # Inputs - invalid_vvlib_name = "test/invalid.vvlib" - invalid_vvlib_manifest = "test" - create_vvlib_without_manifest(invalid_vvlib_name, self.library_filename) - append_any_as_manifest_to_vvlib(invalid_vvlib_manifest, invalid_vvlib_name) - - with ( - open(invalid_vvlib_name, "br") as f, - self.assertRaises(LibraryFormatInvalidError), - ): - self.library_manger.install_library(self.library_uuid, f) - - # Teardown - os.remove(invalid_vvlib_name) - - def test_install_invalid_type_manifest_library(self) -> None: - """不正な形式の vvlib_manifest.json をもつ ZIP ファイルは音声ライブラリとしてインストールできない。""" - - # Inputs - invalid_vvlib_name = "test/invalid.vvlib" - invalid_vvlib_manifest = create_vvlib_manifest( - template_vvlib=self.vvlib_manifest, version=10 - ) - create_vvlib_without_manifest(invalid_vvlib_name, self.library_filename) - append_any_as_manifest_to_vvlib(invalid_vvlib_manifest, invalid_vvlib_name) - - # Tests - with ( - open(invalid_vvlib_name, "br") as f, - self.assertRaises(LibraryFormatInvalidError), - ): - self.library_manger.install_library(self.library_uuid, f) - - # Teardown - os.remove(invalid_vvlib_name) - - def test_install_invalid_version_manifest_library(self) -> None: - # vvlib_manifestの不正なversionのテスト - - # Inputs - invalid_vvlib_name = "test/invalid.vvlib" - invalid_vvlib_manifest = create_vvlib_manifest( - template_vvlib=self.vvlib_manifest, version="10" - ) - create_vvlib_without_manifest(invalid_vvlib_name, self.library_filename) - append_any_as_manifest_to_vvlib(invalid_vvlib_manifest, invalid_vvlib_name) - - # Tests - with ( - open(invalid_vvlib_name, "br") as f, - self.assertRaises(LibraryFormatInvalidError), - ): - self.library_manger.install_library(self.library_uuid, f) - - # Teardown - os.remove(invalid_vvlib_name) - - def test_install_invalid_manifest_version_library(self) -> None: - # vvlib_manifestの不正なmanifest_versionのテスト - - # Inputs - invalid_vvlib_name = "test/invalid.vvlib" - invalid_vvlib_manifest = create_vvlib_manifest( - template_vvlib=self.vvlib_manifest, manifest_version="10" - ) - create_vvlib_without_manifest(invalid_vvlib_name, self.library_filename) - append_any_as_manifest_to_vvlib(invalid_vvlib_manifest, invalid_vvlib_name) - - # Tests - with ( - open(invalid_vvlib_name, "br") as f, - self.assertRaises(LibraryFormatInvalidError), - ): - self.library_manger.install_library(self.library_uuid, f) - - # Teardown - os.remove(invalid_vvlib_name) - - def test_install_invalid_manifest_version_library_2(self) -> None: - # vvlib_manifestの未対応のmanifest_versionのテスト - - # Inputs - invalid_vvlib_name = "test/invalid.vvlib" - invalid_vvlib_manifest = create_vvlib_manifest( - template_vvlib=self.vvlib_manifest, manifest_version="999.999.999" - ) - create_vvlib_without_manifest(invalid_vvlib_name, self.library_filename) - append_any_as_manifest_to_vvlib(invalid_vvlib_manifest, invalid_vvlib_name) - - # Tests - with ( - open(invalid_vvlib_name, "br") as f, - self.assertRaises(LibraryUnsupportedError), - ): - self.library_manger.install_library(self.library_uuid, f) - - # Teardown - os.remove(invalid_vvlib_name) - - def test_install_non_target_engine_library(self) -> None: - # vvlib_manifestのインストール先エンジンの検証のテスト - - # Inputs - invalid_vvlib_name = "test/invalid.vvlib" - invalid_vvlib_manifest = create_vvlib_manifest( - template_vvlib=self.vvlib_manifest, - engine_uuid="26f7823b-20c6-40c5-bf86-6dd5d9d45c18", - ) - create_vvlib_without_manifest(invalid_vvlib_name, self.library_filename) - append_any_as_manifest_to_vvlib(invalid_vvlib_manifest, invalid_vvlib_name) - - # Tests - with ( - open(invalid_vvlib_name, "br") as f, - self.assertRaises(LibraryUnsupportedError), - ): - self.library_manger.install_library(self.library_uuid, f) - - # Teardown - os.remove(invalid_vvlib_name) - - def test_install(self) -> None: - # 正しいライブラリをインストールして問題が起きないか - library_path = self.library_manger.install_library( - self.library_uuid, self.library_file - ) - self.assertEqual(self.tmp_dir_path / self.library_uuid, library_path) - - self.library_manger.uninstall_library(self.library_uuid) - - def test_uninstall_library(self) -> None: - # TODO: アンインストール出来ないライブラリをテストできるようにしたい - with self.assertRaises(LibraryNotFoundError): - self.library_manger.uninstall_library(self.library_uuid) - - self.library_manger.install_library(self.library_uuid, self.library_file) - self.library_manger.uninstall_library(self.library_uuid) diff --git a/voicevox_engine/test/unit/library/vvlib_manifest.json b/voicevox_engine/test/unit/library/vvlib_manifest.json deleted file mode 100644 index f12d59eebed45f672a9c4ee61acc81a725552468..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/library/vvlib_manifest.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "manifest_version": "0.15.0", - "name": "Test vvlib", - "version": "0.0.1", - "uuid": "2bb8bccf-1c3f-4bc9-959a-f388e37af3ad", - "engine_name": "Test Engine", - "brand_name": "Test", - "engine_uuid": "c7b58856-bd56-4aa1-afb7-b8415f824b06" -} \ No newline at end of file diff --git a/voicevox_engine/test/unit/preset/presets-test-1.yaml b/voicevox_engine/test/unit/preset/presets-test-1.yaml deleted file mode 100644 index 260413c47be9149668c109825246eacfc56af538..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/preset/presets-test-1.yaml +++ /dev/null @@ -1,25 +0,0 @@ -- id: 1 - name: test - speaker_uuid: 7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff - style_id: 0 - speedScale: 1 - pitchScale: 0 - intonationScale: 1 - volumeScale: 1 - prePhonemeLength: 0.1 - postPhonemeLength: 0.1 - pauseLength: null - pauseLengthScale: 1.0 - -- id: 2 - name: test2 - speaker_uuid: 7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff - style_id: 2 - speedScale: 1.5 - pitchScale: 0 - intonationScale: 1 - volumeScale: 0.7 - prePhonemeLength: 0.5 - postPhonemeLength: 0.5 - pauseLength: null - pauseLengthScale: 1.0 diff --git a/voicevox_engine/test/unit/preset/presets-test-2.yaml b/voicevox_engine/test/unit/preset/presets-test-2.yaml deleted file mode 100644 index def610df7ec1229f1a46fa76b0afa2cf34e78587..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/preset/presets-test-2.yaml +++ /dev/null @@ -1,25 +0,0 @@ -- id: 1 - name: test - speaker_uuid: 7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff - style_id: not_int - speedScale: 1 - pitchScale: 0 - intonationScale: 1 - volumeScale: 1 - prePhonemeLength: 0.1 - postPhonemeLength: 0.1 - pauseLength: null - pauseLengthScale: 1.0 - -- id: 2 - name: test2 - speaker_uuid: 7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff - style_id: 2 - speedScale: 1.5 - pitchScale: 0 - intonationScale: 1 - volumeScale: 0.7 - prePhonemeLength: 0.5 - postPhonemeLength: 0.5 - pauseLength: null - pauseLengthScale: 1.0 diff --git a/voicevox_engine/test/unit/preset/presets-test-3.yaml b/voicevox_engine/test/unit/preset/presets-test-3.yaml deleted file mode 100644 index d9c80c6b085337382fd7b93f4e5064e9ced59aae..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/preset/presets-test-3.yaml +++ /dev/null @@ -1,25 +0,0 @@ -- id: 1 - name: test - speaker_uuid: 7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff - style_id: 0 - speedScale: 1 - pitchScale: 0 - intonationScale: 1 - volumeScale: 1 - prePhonemeLength: 0.1 - postPhonemeLength: 0.1 - pauseLength: null - pauseLengthScale: 1.0 - -- id: 1 - name: test2 - speaker_uuid: 7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff - style_id: 2 - speedScale: 1.5 - pitchScale: 0 - intonationScale: 1 - volumeScale: 0.7 - prePhonemeLength: 0.5 - postPhonemeLength: 0.5 - pauseLength: null - pauseLengthScale: 1.0 diff --git a/voicevox_engine/test/unit/preset/presets-test-4.yaml b/voicevox_engine/test/unit/preset/presets-test-4.yaml deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/test/unit/preset/test_preset.py b/voicevox_engine/test/unit/preset/test_preset.py deleted file mode 100644 index 10f983b35746d98786d71889ab75b304ea771191..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/preset/test_preset.py +++ /dev/null @@ -1,353 +0,0 @@ -from os import remove -from pathlib import Path -from shutil import copyfile - -import pytest - -from voicevox_engine.preset.model import Preset -from voicevox_engine.preset.preset_manager import ( - PresetInputError, - PresetInternalError, - PresetManager, -) - -presets_test_1_yaml_path = Path("test/unit/preset/presets-test-1.yaml") -presets_test_2_yaml_path = Path("test/unit/preset/presets-test-2.yaml") -presets_test_3_yaml_path = Path("test/unit/preset/presets-test-3.yaml") -presets_test_4_yaml_path = Path("test/unit/preset/presets-test-4.yaml") - - -def test_validation() -> None: - preset_manager = PresetManager(preset_path=presets_test_1_yaml_path) - presets = preset_manager.load_presets() - assert presets is not None - - -def test_validation_same() -> None: - preset_manager = PresetManager(preset_path=presets_test_1_yaml_path) - presets = preset_manager.load_presets() - presets2 = preset_manager.load_presets() - assert presets is not None - assert presets == presets2 - - -def test_validation_2() -> None: - preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) - true_msg = "プリセットの設定ファイルにミスがあります" - with pytest.raises(PresetInternalError, match=true_msg): - preset_manager.load_presets() - - -def test_preset_id() -> None: - preset_manager = PresetManager(preset_path=presets_test_3_yaml_path) - true_msg = "プリセットのidに重複があります" - with pytest.raises(PresetInternalError, match=true_msg): - preset_manager.load_presets() - - -def test_empty_file() -> None: - preset_manager = PresetManager(preset_path=presets_test_4_yaml_path) - true_msg = "プリセットの設定ファイルが空の内容です" - with pytest.raises(PresetInternalError, match=true_msg): - preset_manager.load_presets() - - -def test_not_exist_file() -> None: - preset_manager = PresetManager(preset_path=Path("test/presets-dummy.yaml")) - true_msg = "プリセットの設定ファイルが見つかりません" - with pytest.raises(PresetInternalError, match=true_msg): - preset_manager.load_presets() - - -def test_add_preset(tmp_path: Path) -> None: - preset_path = tmp_path / "presets.yaml" - copyfile(presets_test_1_yaml_path, preset_path) - preset_manager = PresetManager(preset_path=preset_path) - preset = Preset( - **{ - "id": 10, - "name": "test10", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "style_id": 2, - "speedScale": 1, - "pitchScale": 1, - "intonationScale": 0.5, - "volumeScale": 1, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - } - ) - id = preset_manager.add_preset(preset) - assert id == 10 - assert len(preset_manager.presets) == 3 - for _preset in preset_manager.presets: - if _preset.id == id: - assert _preset == preset - remove(preset_path) - - -def test_add_preset_load_failure() -> None: - preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) - true_msg = "プリセットの設定ファイルにミスがあります" - with pytest.raises(PresetInternalError, match=true_msg): - preset_manager.add_preset( - Preset( - **{ - "id": 1, - "name": "", - "speaker_uuid": "", - "style_id": 0, - "speedScale": 0, - "pitchScale": 0, - "intonationScale": 0, - "volumeScale": 0, - "prePhonemeLength": 0, - "postPhonemeLength": 0, - "pauseLength": 0, - "pauseLengthScale": 0, - } - ) - ) - - -def test_add_preset_conflict_id(tmp_path: Path) -> None: - preset_path = tmp_path / "presets.yaml" - copyfile(presets_test_1_yaml_path, preset_path) - preset_manager = PresetManager(preset_path=preset_path) - preset = Preset( - **{ - "id": 2, - "name": "test3", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "style_id": 2, - "speedScale": 1, - "pitchScale": 1, - "intonationScale": 0.5, - "volumeScale": 1, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - } - ) - id = preset_manager.add_preset(preset) - assert id == 3 - assert len(preset_manager.presets) == 3 - for _preset in preset_manager.presets: - if _preset.id == id: - assert _preset == preset - remove(preset_path) - - -def test_add_preset_conflict_id2(tmp_path: Path) -> None: - preset_path = tmp_path / "presets.yaml" - copyfile(presets_test_1_yaml_path, preset_path) - preset_manager = PresetManager(preset_path=preset_path) - preset = Preset( - **{ - "id": -1, - "name": "test3", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "style_id": 2, - "speedScale": 1, - "pitchScale": 1, - "intonationScale": 0.5, - "volumeScale": 1, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - } - ) - id = preset_manager.add_preset(preset) - assert id == 3 - assert len(preset_manager.presets) == 3 - for _preset in preset_manager.presets: - if _preset.id == id: - assert _preset == preset - remove(preset_path) - - -def test_add_preset_write_failure(tmp_path: Path) -> None: - preset_path = tmp_path / "presets.yaml" - copyfile(presets_test_1_yaml_path, preset_path) - preset_manager = PresetManager(preset_path=preset_path) - preset = Preset( - **{ - "id": 10, - "name": "test10", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "style_id": 2, - "speedScale": 1, - "pitchScale": 1, - "intonationScale": 0.5, - "volumeScale": 1, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - } - ) - preset_manager.load_presets() - preset_manager._refresh_cache = lambda: None # type:ignore[method-assign] - preset_manager.preset_path = "" # type: ignore[assignment] - true_msg = "プリセットの設定ファイルが見つかりません" - with pytest.raises(PresetInternalError, match=true_msg): - preset_manager.add_preset(preset) - assert len(preset_manager.presets) == 2 - remove(preset_path) - - -def test_update_preset(tmp_path: Path) -> None: - preset_path = tmp_path / "presets.yaml" - copyfile(presets_test_1_yaml_path, preset_path) - preset_manager = PresetManager(preset_path=preset_path) - preset = Preset( - **{ - "id": 1, - "name": "test1 new", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "style_id": 2, - "speedScale": 1, - "pitchScale": 1, - "intonationScale": 0.5, - "volumeScale": 1, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - } - ) - id = preset_manager.update_preset(preset) - assert id == 1 - assert len(preset_manager.presets) == 2 - for _preset in preset_manager.presets: - if _preset.id == id: - assert _preset == preset - remove(preset_path) - - -def test_update_preset_load_failure() -> None: - preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) - true_msg = "プリセットの設定ファイルにミスがあります" - with pytest.raises(PresetInternalError, match=true_msg): - preset_manager.update_preset( - Preset( - **{ - "id": 1, - "name": "", - "speaker_uuid": "", - "style_id": 0, - "speedScale": 0, - "pitchScale": 0, - "intonationScale": 0, - "volumeScale": 0, - "prePhonemeLength": 0, - "postPhonemeLength": 0, - "pauseLength": 0, - "pauseLengthScale": 0, - } - ) - ) - - -def test_update_preset_not_found(tmp_path: Path) -> None: - preset_path = tmp_path / "presets.yaml" - copyfile(presets_test_1_yaml_path, preset_path) - preset_manager = PresetManager(preset_path=preset_path) - preset = Preset( - **{ - "id": 10, - "name": "test1 new", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "style_id": 2, - "speedScale": 1, - "pitchScale": 1, - "intonationScale": 0.5, - "volumeScale": 1, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - } - ) - true_msg = "更新先のプリセットが存在しません" - with pytest.raises(PresetInputError, match=true_msg): - preset_manager.update_preset(preset) - assert len(preset_manager.presets) == 2 - remove(preset_path) - - -def test_update_preset_write_failure(tmp_path: Path) -> None: - preset_path = tmp_path / "presets.yaml" - copyfile(presets_test_1_yaml_path, preset_path) - preset_manager = PresetManager(preset_path=preset_path) - preset = Preset( - **{ - "id": 1, - "name": "test1 new", - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "style_id": 2, - "speedScale": 1, - "pitchScale": 1, - "intonationScale": 0.5, - "volumeScale": 1, - "prePhonemeLength": 0.1, - "postPhonemeLength": 0.1, - "pauseLength": None, - "pauseLengthScale": 1.0, - } - ) - preset_manager.load_presets() - preset_manager._refresh_cache = lambda: None # type:ignore[method-assign] - preset_manager.preset_path = "" # type: ignore[assignment] - true_msg = "プリセットの設定ファイルが見つかりません" - with pytest.raises(PresetInternalError, match=true_msg): - preset_manager.update_preset(preset) - assert len(preset_manager.presets) == 2 - assert preset_manager.presets[0].name == "test" - remove(preset_path) - - -def test_delete_preset(tmp_path: Path) -> None: - preset_path = tmp_path / "presets.yaml" - copyfile(presets_test_1_yaml_path, preset_path) - preset_manager = PresetManager(preset_path=preset_path) - id = preset_manager.delete_preset(1) - assert id == 1 - assert len(preset_manager.presets) == 1 - remove(preset_path) - - -def test_delete_preset_load_failure() -> None: - preset_manager = PresetManager(preset_path=presets_test_2_yaml_path) - true_msg = "プリセットの設定ファイルにミスがあります" - with pytest.raises(PresetInternalError, match=true_msg): - preset_manager.delete_preset(10) - - -def test_delete_preset_not_found(tmp_path: Path) -> None: - preset_path = tmp_path / "presets.yaml" - copyfile(presets_test_1_yaml_path, preset_path) - preset_manager = PresetManager(preset_path=preset_path) - true_msg = "削除対象のプリセットが存在しません" - with pytest.raises(PresetInputError, match=true_msg): - preset_manager.delete_preset(10) - assert len(preset_manager.presets) == 2 - remove(preset_path) - - -def test_delete_preset_write_failure(tmp_path: Path) -> None: - preset_path = tmp_path / "presets.yaml" - copyfile(presets_test_1_yaml_path, preset_path) - preset_manager = PresetManager(preset_path=preset_path) - preset_manager.load_presets() - preset_manager._refresh_cache = lambda: None # type:ignore[method-assign] - preset_manager.preset_path = "" # type: ignore[assignment] - true_msg = "プリセットの設定ファイルが見つかりません" - with pytest.raises(PresetInternalError, match=true_msg): - preset_manager.delete_preset(1) - assert len(preset_manager.presets) == 2 - remove(preset_path) diff --git a/voicevox_engine/test/unit/resource_manager/test_resource_manager.py b/voicevox_engine/test/unit/resource_manager/test_resource_manager.py deleted file mode 100644 index ca2a0dc7109e8c41c4c0d02c231badee51784015..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/resource_manager/test_resource_manager.py +++ /dev/null @@ -1,96 +0,0 @@ -import base64 -from pathlib import Path - -import pytest - -from voicevox_engine.resource_manager import ResourceManager, ResourceManagerError - -with_filemap_dir = Path(__file__).parent / "with_filemap" -without_filemap_dir = Path(__file__).parent / "without_filemap" - - -def b64encode_str(s: bytes) -> str: - return base64.b64encode(s).decode("utf-8") - - -def _assert_resource(manager: ResourceManager, input_path: Path) -> None: - """ - `input_path`で指定したファイルから正しくbase64が取得できるか確認する - また、ハッシュを取得し、対応するファイルから同じバイト列が取得できるか確認する - """ - true_bytes = input_path.read_bytes() - - assert manager.resource_str(input_path, "base64") == b64encode_str(true_bytes) - - result_filehash = manager.resource_str(input_path, "hash") - result_path = manager.resource_path(result_filehash) - assert result_path.read_bytes() == true_bytes - - -def test_with_filemap() -> None: - """ - "filemap.json"があるディレクトリでのテスト - (fimemapの生成コマンド) - `python tools/generate_filemap.py --target_dir test/unit/resource_manager/with_filemap` - """ - manager = ResourceManager(False) - manager.register_dir(with_filemap_dir) - - png_path = with_filemap_dir / "dummy.png" - _assert_resource(manager, png_path) - - wav_path = with_filemap_dir / "dummy.wav" - _assert_resource(manager, wav_path) - - # 同じバイナリがある場合のテスト - same_wav_path = with_filemap_dir / "dummy_same_binary.wav" - assert wav_path.read_bytes() == same_wav_path.read_bytes() - _assert_resource(manager, same_wav_path) - - # filemap.jsonに含まれないものはエラー - # NOTE: 通常、テキストはResourceManagerで管理しない - txt_path = with_filemap_dir / "dummy.txt" - with pytest.raises(ResourceManagerError): - manager.resource_str(txt_path, "base64") - with pytest.raises(ResourceManagerError): - manager.resource_str(txt_path, "hash") - - # 登録されていないハッシュが渡された場合エラー - with pytest.raises(ResourceManagerError): - manager.resource_path("NOT_EXIST_HASH") - - -def test_without_filemap_when_production() -> None: - """ - "create_filemap_if_not_exist"がFalseで"filemap.json"が無い場合エラーにする - """ - manager = ResourceManager(False) - with pytest.raises(ResourceManagerError): - manager.register_dir(without_filemap_dir) - - -def test_without_filemap() -> None: - """ - "create_filemap_if_not_exist"がTrueで"filemap.json"が無い場合は登録時にfilemapを生成する - """ - manager = ResourceManager(True) - manager.register_dir(without_filemap_dir) - - # 全てのファイルが管理される - png_path = without_filemap_dir / "dummy.png" - _assert_resource(manager, png_path) - - wav_path = without_filemap_dir / "dummy.wav" - _assert_resource(manager, wav_path) - - txt_path = without_filemap_dir / "dummy.txt" - _assert_resource(manager, txt_path) - - # 同じバイナリがある場合のテスト - same_wav_path = without_filemap_dir / "dummy_same_binary.wav" - assert wav_path.read_bytes() == same_wav_path.read_bytes() - _assert_resource(manager, same_wav_path) - - # 登録されていないハッシュが渡された場合エラー - with pytest.raises(ResourceManagerError): - manager.resource_path("NOT_EXIST_HASH") diff --git a/voicevox_engine/test/unit/resource_manager/with_filemap/dummy.png b/voicevox_engine/test/unit/resource_manager/with_filemap/dummy.png deleted file mode 100644 index 2d8d70f28807ee0f71c820690d493d1a5d3f5a69..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/test/unit/resource_manager/with_filemap/dummy.png and /dev/null differ diff --git a/voicevox_engine/test/unit/resource_manager/with_filemap/dummy.txt b/voicevox_engine/test/unit/resource_manager/with_filemap/dummy.txt deleted file mode 100644 index 6a4762f8c7dae3f67e46ada0805faccbf2c71926..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/resource_manager/with_filemap/dummy.txt +++ /dev/null @@ -1 +0,0 @@ -DUMMY-TEXT diff --git a/voicevox_engine/test/unit/resource_manager/with_filemap/dummy.wav b/voicevox_engine/test/unit/resource_manager/with_filemap/dummy.wav deleted file mode 100644 index 31cbbee871f1630dc549642a4154df22397a7648..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/test/unit/resource_manager/with_filemap/dummy.wav and /dev/null differ diff --git a/voicevox_engine/test/unit/resource_manager/with_filemap/dummy_same_binary.wav b/voicevox_engine/test/unit/resource_manager/with_filemap/dummy_same_binary.wav deleted file mode 100644 index 31cbbee871f1630dc549642a4154df22397a7648..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/test/unit/resource_manager/with_filemap/dummy_same_binary.wav and /dev/null differ diff --git a/voicevox_engine/test/unit/resource_manager/with_filemap/filemap.json b/voicevox_engine/test/unit/resource_manager/with_filemap/filemap.json deleted file mode 100644 index 3daa8ee554b0648272f6f890ea0c41cc5505a348..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/resource_manager/with_filemap/filemap.json +++ /dev/null @@ -1 +0,0 @@ -{"dummy.png": "475dac9a64f6ad7b2d94ce570219b11320acb90d6e28ffa97bd6617d19b2cdfb", "dummy.wav": "712618020da1c97986d60975b6a279bb8b4f90b4ab392fa5d278df7fb89c5cc0", "dummy_same_binary.wav": "712618020da1c97986d60975b6a279bb8b4f90b4ab392fa5d278df7fb89c5cc0"} \ No newline at end of file diff --git a/voicevox_engine/test/unit/resource_manager/without_filemap/dummy.png b/voicevox_engine/test/unit/resource_manager/without_filemap/dummy.png deleted file mode 100644 index 2d8d70f28807ee0f71c820690d493d1a5d3f5a69..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/test/unit/resource_manager/without_filemap/dummy.png and /dev/null differ diff --git a/voicevox_engine/test/unit/resource_manager/without_filemap/dummy.txt b/voicevox_engine/test/unit/resource_manager/without_filemap/dummy.txt deleted file mode 100644 index 6a4762f8c7dae3f67e46ada0805faccbf2c71926..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/resource_manager/without_filemap/dummy.txt +++ /dev/null @@ -1 +0,0 @@ -DUMMY-TEXT diff --git a/voicevox_engine/test/unit/resource_manager/without_filemap/dummy.wav b/voicevox_engine/test/unit/resource_manager/without_filemap/dummy.wav deleted file mode 100644 index 31cbbee871f1630dc549642a4154df22397a7648..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/test/unit/resource_manager/without_filemap/dummy.wav and /dev/null differ diff --git a/voicevox_engine/test/unit/resource_manager/without_filemap/dummy_same_binary.wav b/voicevox_engine/test/unit/resource_manager/without_filemap/dummy_same_binary.wav deleted file mode 100644 index 31cbbee871f1630dc549642a4154df22397a7648..0000000000000000000000000000000000000000 Binary files a/voicevox_engine/test/unit/resource_manager/without_filemap/dummy_same_binary.wav and /dev/null differ diff --git a/voicevox_engine/test/unit/setting/setting-test-load-1.yaml b/voicevox_engine/test/unit/setting/setting-test-load-1.yaml deleted file mode 100644 index 3421e7a6a32073e3413444495b3bb37d80d4d351..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/setting/setting-test-load-1.yaml +++ /dev/null @@ -1,2 +0,0 @@ -allow_origin: null -cors_policy_mode: localapps diff --git a/voicevox_engine/test/unit/setting/setting-test-load-2.yaml b/voicevox_engine/test/unit/setting/setting-test-load-2.yaml deleted file mode 100644 index 1066e5d8ba36edec19cdbc54ac8c27963bbc3056..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/setting/setting-test-load-2.yaml +++ /dev/null @@ -1,2 +0,0 @@ -allow_origin: null -cors_policy_mode: all diff --git a/voicevox_engine/test/unit/setting/setting-test-load-3.yaml b/voicevox_engine/test/unit/setting/setting-test-load-3.yaml deleted file mode 100644 index 47bc8fb9ac2ac7c4a480660da65b465ef4d72533..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/setting/setting-test-load-3.yaml +++ /dev/null @@ -1,2 +0,0 @@ -allow_origin: "192.168.254.255 192.168.255.255" -cors_policy_mode: localapps diff --git a/voicevox_engine/test/unit/setting/test_setting.py b/voicevox_engine/test/unit/setting/test_setting.py deleted file mode 100644 index d5781fca31dfaeae5b28f6d183a1a82b9398a1dd..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/setting/test_setting.py +++ /dev/null @@ -1,73 +0,0 @@ -from pathlib import Path - -from voicevox_engine.setting.model import CorsPolicyMode -from voicevox_engine.setting.setting_manager import Setting, SettingHandler - - -def test_setting_handler_load_not_exist_file() -> None: - """`SettingHandler` に存在しない設定ファイルのパスを渡すとデフォルト値になる。""" - # Inputs - setting_path = Path("not_exist.yaml") - setting_loader = SettingHandler(setting_path) - # Expects - true_setting = Setting(cors_policy_mode=CorsPolicyMode.localapps, allow_origin=None) - # Outputs - setting = setting_loader.load() - # Test - assert true_setting == setting - - -def test_setting_handler_load_exist_file_1() -> None: - """`SettingHandler` に設定ファイルのパスを渡すとその値を読み込む。""" - # Inputs - setting_path = Path("test/unit/setting/setting-test-load-1.yaml") - setting_loader = SettingHandler(setting_path) - # Expects - true_setting = Setting(cors_policy_mode=CorsPolicyMode.localapps, allow_origin=None) - # Outputs - setting = setting_loader.load() - # Test - assert true_setting == setting - - -def test_setting_handler_load_exist_file_2() -> None: - """`SettingHandler` に設定ファイルのパスを渡すとその値を読み込む。""" - # Inputs - setting_path = Path("test/unit/setting/setting-test-load-2.yaml") - setting_loader = SettingHandler(setting_path) - # Expects - true_setting = Setting(cors_policy_mode=CorsPolicyMode.all, allow_origin=None) - # Outputs - setting = setting_loader.load() - # Test - assert true_setting == setting - - -def test_setting_handler_load_exist_file_3() -> None: - """`SettingHandler` に設定ファイルのパスを渡すとその値を読み込む。""" - # Inputs - setting_path = Path("test/unit/setting/setting-test-load-3.yaml") - setting_loader = SettingHandler(setting_path) - # Expects - true_policy = CorsPolicyMode.localapps - true_origin = "192.168.254.255 192.168.255.255" - true_setting = Setting(cors_policy_mode=true_policy, allow_origin=true_origin) - # Outputs - setting = setting_loader.load() - # Test - assert true_setting == setting - - -def test_setting_handler_save(tmp_path: Path) -> None: - """`SettingHandler.save()` で設定値を保存できる。""" - # Inputs - setting_path = tmp_path / "setting-test-dump.yaml" - setting_loader = SettingHandler(setting_path) - new_setting = Setting(cors_policy_mode=CorsPolicyMode.localapps) - # Expects - true_setting = Setting(cors_policy_mode=CorsPolicyMode.localapps, allow_origin=None) - # Outputs - setting_loader.save(new_setting) - setting = setting_loader.load() # NOTE: `.load()` の正常動作を前提とする - # Test - assert true_setting == setting diff --git a/voicevox_engine/test/unit/test_core_initializer.py b/voicevox_engine/test/unit/test_core_initializer.py deleted file mode 100644 index 8046bf7f77346ecfaaee53ef41a678c6682cbb0c..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/test_core_initializer.py +++ /dev/null @@ -1,145 +0,0 @@ -""" `core_initializer.py` のテスト""" - -from unittest.mock import patch - -import pytest - -from voicevox_engine.core.core_adapter import CoreAdapter -from voicevox_engine.core.core_initializer import ( - CoreManager, - CoreNotFound, - get_half_logical_cores, -) -from voicevox_engine.dev.core.mock import MockCoreWrapper - - -def test_cores_register_core() -> None: - """CoreManager.register_core() でコアを登録できる。""" - # Inputs - core_manager = CoreManager() - - # Test - core_manager.register_core(CoreAdapter(MockCoreWrapper()), "0.0.1") - - -def test_cores_versions() -> None: - """CoreManager.versions() でバージョン一覧を取得できる。""" - # Inputs - core_manager = CoreManager() - core_manager.register_core(CoreAdapter(MockCoreWrapper()), "0.0.1") - core_manager.register_core(CoreAdapter(MockCoreWrapper()), "0.0.2") - # Expects - true_versions = ["0.0.1", "0.0.2"] - # Outputs - versions = core_manager.versions() - - # Test - assert true_versions == versions - - -def test_cores_latest_version() -> None: - """CoreManager.latest_version() で最新バージョンを取得できる。""" - # Inputs - core_manager = CoreManager() - core_manager.register_core(CoreAdapter(MockCoreWrapper()), "0.0.1") - core_manager.register_core(CoreAdapter(MockCoreWrapper()), "0.0.2") - # Expects - true_latest_version = "0.0.2" - # Outputs - latest_version = core_manager.latest_version() - - # Test - assert true_latest_version == latest_version - - -def test_cores_get_core_existing() -> None: - """CoreManager.get_core() で登録済みコアを取得できる。""" - # Inputs - core_manager = CoreManager() - core1 = CoreAdapter(MockCoreWrapper()) - core2 = CoreAdapter(MockCoreWrapper()) - core_manager.register_core(core1, "0.0.1") - core_manager.register_core(core2, "0.0.2") - # Expects - true_acquired_core = core2 - # Outputs - acquired_core = core_manager.get_core("0.0.2") - - # Test - assert true_acquired_core == acquired_core - - -def test_cores_get_core_missing() -> None: - """CoreManager.get_core() で存在しないコアを取得しようとするとエラーになる。""" - # Inputs - core_manager = CoreManager() - core1 = CoreAdapter(MockCoreWrapper()) - core2 = CoreAdapter(MockCoreWrapper()) - core_manager.register_core(core1, "0.0.1") - core_manager.register_core(core2, "0.0.2") - - # Test - with pytest.raises(CoreNotFound): - core_manager.get_core("0.0.3") - - -def test_cores_has_core_true() -> None: - """CoreManager.has_core() でコアが登録されていることを確認できる。""" - # Inputs - core_manager = CoreManager() - core_manager.register_core(CoreAdapter(MockCoreWrapper()), "0.0.1") - core_manager.register_core(CoreAdapter(MockCoreWrapper()), "0.0.2") - # Expects - expected_has = True - # Outputs - has = core_manager.has_core("0.0.1") - - # Test - assert expected_has == has - - -def test_cores_has_core_false() -> None: - """CoreManager.has_core() でコアが登録されていないことを確認できる。""" - # Inputs - core_manager = CoreManager() - core_manager.register_core(CoreAdapter(MockCoreWrapper()), "0.0.1") - core_manager.register_core(CoreAdapter(MockCoreWrapper()), "0.0.2") - # Expects - expected_has = False - # Outputs - has = core_manager.has_core("0.0.3") - - # Test - assert expected_has == has - - -def test_cores_items() -> None: - """CoreManager.items() でコアとバージョンのリストを取得できる。""" - # Inputs - core_manager = CoreManager() - core1 = CoreAdapter(MockCoreWrapper()) - core2 = CoreAdapter(MockCoreWrapper()) - core_manager.register_core(core1, "0.0.1") - core_manager.register_core(core2, "0.0.2") - # Expects - true_items = [("0.0.1", core1), ("0.0.2", core2)] - # Outputs - items = core_manager.items() - - # Test - assert true_items == items - - -@patch("os.cpu_count", return_value=8) -def test_half_logical_cores_even(mock_cpu_count: int) -> None: - assert get_half_logical_cores() == 4 - - -@patch("os.cpu_count", return_value=9) -def test_half_logical_cores_odd(mock_cpu_count: int) -> None: - assert get_half_logical_cores() == 4 - - -@patch("os.cpu_count", return_value=None) -def test_half_logical_cores_none(mock_cpu_count: int) -> None: - assert get_half_logical_cores() == 0 diff --git a/voicevox_engine/test/unit/test_core_version_utility.py b/voicevox_engine/test/unit/test_core_version_utility.py deleted file mode 100644 index fa62fe975be9b1ae834cf882b8e06d8fa01c832d..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/test_core_version_utility.py +++ /dev/null @@ -1,48 +0,0 @@ -""" -コアバージョンに関する utilities のテスト -""" - -from voicevox_engine.utility.core_version_utility import get_latest_version - - -def test_get_latest_version_same_preview_normal() -> None: - """`get_latest_version()` は同一バージョンの preview 版より正規版を優先する。""" - - # Inputs - versions = [ - "0.0.0", - "0.1.0", - "0.10.0", - "0.10.0-preview.1", - "0.14.0", - "0.14.0-preview.1", - "0.14.0-preview.10", - ] - - # Expects - true_latest = "0.14.0" - - # Outputs - latest = get_latest_version(versions) - - # Tests - assert true_latest == latest - - -def test_get_latest_version_newer_preview() -> None: - """`get_latest_version()` は旧バージョンの正規版より新バージョンの preview 版を優先する。""" - - # Inputs - versions = [ - "0.14.0", - "0.15.0-preview.1", - ] - - # Expects - true_latest = "0.15.0-preview.1" - - # Outputs - latest = get_latest_version(versions) - - # Tests - assert true_latest == latest diff --git a/voicevox_engine/test/unit/test_metas_store.py b/voicevox_engine/test/unit/test_metas_store.py deleted file mode 100644 index a9b7dcc43903706878bf6bfbdf37a91a83458967..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/test_metas_store.py +++ /dev/null @@ -1,96 +0,0 @@ -import uuid - -from voicevox_engine.metas.Metas import ( - SpeakerStyle, - SpeakerSupportedFeatures, - StyleId, - StyleType, -) -from voicevox_engine.metas.MetasStore import ( - _SING_STYLE_TYPES, - _TALK_STYLE_TYPES, - Character, - filter_characters_and_styles, -) - - -def _gen_character(style_types: list[StyleType]) -> Character: - talk_styles = list(filter(lambda s: s in _TALK_STYLE_TYPES, style_types)) - sing_styles = list(filter(lambda s: s in _SING_STYLE_TYPES, style_types)) - return Character( - name="", - uuid=str(uuid.uuid4()), - talk_styles=[ - SpeakerStyle(name="", id=StyleId(0 + i), type=style_type) - for i, style_type in enumerate(talk_styles) - ], - sing_styles=[ - SpeakerStyle(name="", id=StyleId(6000 + i), type=style_type) - for i, style_type in enumerate(sing_styles) - ], - version="", - supported_features=SpeakerSupportedFeatures(), - ) - - -def _equal_characters(a: list[Character], b: list[Character]) -> bool: - if len(a) != len(b): - return False - for i in range(len(a)): - if a[i].uuid != b[i].uuid: - return False - return True - - -def test_filter_characters_and_styles_with_talk() -> None: - # Inputs - talk_only = _gen_character(["talk"]) - singing_teacher_only = _gen_character(["singing_teacher"]) - frame_decode_only = _gen_character(["frame_decode"]) - sing_only = _gen_character(["sing"]) - allstyle = _gen_character(["talk", "singing_teacher", "frame_decode", "sing"]) - - # Outputs - result = filter_characters_and_styles( - [talk_only, singing_teacher_only, frame_decode_only, sing_only, allstyle], - "talk", - ) - - # Tests - assert len(result) == 2 - - # 喋れるキャラクターだけになっている - assert _equal_characters(result, [talk_only, allstyle]) - - # スタイルがフィルタリングされている - for characters in result: - for style in characters.talk_styles + characters.sing_styles: - assert style.type == "talk" - - -def test_filter_characters_and_styles_with_sing() -> None: - # Inputs - talk_only = _gen_character(["talk"]) - singing_teacher_only = _gen_character(["singing_teacher"]) - frame_decode_only = _gen_character(["frame_decode"]) - sing_only = _gen_character(["sing"]) - allstyle = _gen_character(["talk", "singing_teacher", "frame_decode", "sing"]) - - # Outputs - result = filter_characters_and_styles( - [talk_only, singing_teacher_only, frame_decode_only, sing_only, allstyle], - "sing", - ) - - # Tests - assert len(result) == 4 - - # 歌えるキャラクターだけになっている - assert _equal_characters( - result, [singing_teacher_only, frame_decode_only, sing_only, allstyle] - ) - - # スタイルがフィルタリングされている - for character in result: - for style in character.talk_styles + character.sing_styles: - assert style.type in ["singing_teacher", "frame_decode", "sing"] diff --git a/voicevox_engine/test/unit/test_mock_tts_engine.py b/voicevox_engine/test/unit/test_mock_tts_engine.py deleted file mode 100644 index 5898f2246e5a5a0386841d19b892b071148c93ee..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/test_mock_tts_engine.py +++ /dev/null @@ -1,77 +0,0 @@ -from voicevox_engine.dev.tts_engine.mock import MockTTSEngine -from voicevox_engine.metas.Metas import StyleId -from voicevox_engine.model import AudioQuery -from voicevox_engine.tts_pipeline.kana_converter import create_kana -from voicevox_engine.tts_pipeline.model import AccentPhrase, Mora - - -def _gen_mora(text: str, consonant: str | None, vowel: str) -> Mora: - """モーラ (length=0, pitch=0) を生成する""" - return Mora( - text=text, - consonant=consonant, - consonant_length=0.0 if consonant else None, - vowel=vowel, - vowel_length=0.0, - pitch=0.0, - ) - - -def _gen_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - _gen_mora("コ", "k", "o"), - _gen_mora("ン", None, "N"), - _gen_mora("ニ", "n", "i"), - _gen_mora("チ", "ch", "i"), - _gen_mora("ワ", "w", "a"), - ], - accent=5, - pause_mora=_gen_mora("、", None, "pau"), - ), - AccentPhrase( - moras=[ - _gen_mora("ヒ", "h", "i"), - _gen_mora("ホ", "h", "o"), - _gen_mora("デ", "d", "e"), - _gen_mora("ス", "s", "U"), - ], - accent=1, - pause_mora=None, - ), - ] - - -def test_update_length() -> None: - """`.update_length()` がエラー無く生成をおこなう""" - engine = MockTTSEngine() - engine.update_length(_gen_accent_phrases(), StyleId(0)) - - -def test_update_pitch() -> None: - """`.update_pitch()` がエラー無く生成をおこなう""" - engine = MockTTSEngine() - engine.update_pitch(_gen_accent_phrases(), StyleId(0)) - - -def test_synthesize_wave() -> None: - """`.synthesize_wave()` がエラー無く生成をおこなう""" - engine = MockTTSEngine() - engine.synthesize_wave( - AudioQuery( - accent_phrases=_gen_accent_phrases(), - speedScale=1, - pitchScale=0, - intonationScale=1, - volumeScale=1, - prePhonemeLength=0.1, - postPhonemeLength=0.1, - pauseLength=None, - pauseLengthScale=1.0, - outputSamplingRate=24000, - outputStereo=False, - kana=create_kana(_gen_accent_phrases()), - ), - StyleId(0), - ) diff --git a/voicevox_engine/test/unit/test_utility/test_utility_hash_big_ndarray.py b/voicevox_engine/test/unit/test_utility/test_utility_hash_big_ndarray.py deleted file mode 100644 index 2b66bedaa7c1d6fedf103ca678b891bdc9452302..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/test_utility/test_utility_hash_big_ndarray.py +++ /dev/null @@ -1,29 +0,0 @@ -"""テストユーティリティ `summarize_big_ndarray()` のテスト""" - -from test.utility import summarize_big_ndarray - -import numpy as np - - -def test_summarize_big_ndarray_raw_small_array() -> None: - """`summarize_big_ndarray()` は小さい NumPy 配列を要約しない。""" - # Inputs - target = np.array([111.111]) - # Tests - assert summarize_big_ndarray(target) == np.array([111.111]) - - -def test_summarize_big_ndarray_raw_big_array() -> None: - """`summarize_big_ndarray()` は大きい NumPy 配列を要約する。""" - # Inputs - target = np.ones([10, 10, 10]) - # Expects - true_hash_header = "MD5:" - true_shape = target.shape - # Outputs - summary = summarize_big_ndarray(target) - hash_header = summary["hash"][:4] - shape = tuple(summary["shape"]) - # Tests - assert true_hash_header == hash_header - assert true_shape == shape diff --git a/voicevox_engine/test/unit/test_utility/test_utility_round_floats.py b/voicevox_engine/test/unit/test_utility/test_utility_round_floats.py deleted file mode 100644 index cbd044e5e7b417cb457a0345f08ae58d9fe1e09c..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/test_utility/test_utility_round_floats.py +++ /dev/null @@ -1,53 +0,0 @@ -"""テストユーティリティ `round_floats()` のテスト""" - -from test.utility import round_floats - -import numpy as np - - -def test_round_floats_raw_float() -> None: - """`round_floats()` は値を丸める。""" - # Inputs - target = 111.111 - # Tests - assert round_floats(target, -2) == 100 - assert round_floats(target, -1) == 110 - assert round_floats(target, 0) == 111 - assert round_floats(target, +1) == 111.1 - assert round_floats(target, +2) == 111.11 - - -def test_round_floats_list() -> None: - """`round_floats()` はリスト内の値を丸める。""" - # Inputs - target = [1.111, 8.888] - # Tests - assert round_floats(target, 2) == [1.11, 8.89] - - -def test_round_floats_dict() -> None: - """`round_floats()` は辞書内の値を丸める。""" - # Inputs - target = {"hello": 1.111} - # Tests - assert round_floats(target, 2) == {"hello": 1.11} - - -def test_round_floats_numpy() -> None: - """`round_floats()` は NumPy 値を丸める。""" - # Inputs - target = np.array([111.111]) - # Tests - assert round_floats(target, 2) == np.array([111.11]) - - -def test_round_floats_nested() -> None: - """`round_floats()` はネストしたオブジェクト内の値を丸める。""" - # Inputs - target = [1.111, {"hello": 1.111, "world": [1.111]}, np.array([1.111])] - # Expects - true_rounded = [1.11, {"hello": 1.11, "world": [1.11]}, np.array([1.11])] - # Outputs - rounded = round_floats(target, 2) - # Tests - assert true_rounded == rounded diff --git a/voicevox_engine/test/unit/tts_pipeline/__init__.py b/voicevox_engine/test/unit/tts_pipeline/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_create_accent_phrases_from_kana_output.json b/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_create_accent_phrases_from_kana_output.json deleted file mode 100644 index 671e117de7d286cb80c6dc63960a4e21f9c69616..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_create_accent_phrases_from_kana_output.json +++ /dev/null @@ -1,95 +0,0 @@ -[ - { - "accent": 5, - "is_interrogative": false, - "moras": [ - { - "consonant": "k", - "consonant_length": 2.44, - "pitch": 4.38, - "text": "コ", - "vowel": "o", - "vowel_length": 2.88 - }, - { - "consonant": null, - "consonant_length": null, - "pitch": 1.25, - "text": "ン", - "vowel": "N", - "vowel_length": 1.25 - }, - { - "consonant": "n", - "consonant_length": 2.75, - "pitch": 4.06, - "text": "ニ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "ch", - "consonant_length": 1.62, - "pitch": 2.94, - "text": "チ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "w", - "consonant_length": 3.62, - "pitch": 4.19, - "text": "ワ", - "vowel": "a", - "vowel_length": 1.44 - } - ], - "pause_mora": { - "consonant": null, - "consonant_length": null, - "pitch": 0.0, - "text": "、", - "vowel": "pau", - "vowel_length": 1.0 - } - }, - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "h", - "consonant_length": 2.19, - "pitch": 3.69, - "text": "ヒ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "h", - "consonant_length": 2.19, - "pitch": 4.06, - "text": "ホ", - "vowel": "o", - "vowel_length": 2.88 - }, - { - "consonant": "d", - "consonant_length": 1.75, - "pitch": 2.62, - "text": "デ", - "vowel": "e", - "vowel_length": 1.88 - }, - { - "consonant": "s", - "consonant_length": 3.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 1.38 - } - ], - "pause_mora": null - } -] diff --git a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_create_accent_phrases_output.json b/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_create_accent_phrases_output.json deleted file mode 100644 index 671e117de7d286cb80c6dc63960a4e21f9c69616..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_create_accent_phrases_output.json +++ /dev/null @@ -1,95 +0,0 @@ -[ - { - "accent": 5, - "is_interrogative": false, - "moras": [ - { - "consonant": "k", - "consonant_length": 2.44, - "pitch": 4.38, - "text": "コ", - "vowel": "o", - "vowel_length": 2.88 - }, - { - "consonant": null, - "consonant_length": null, - "pitch": 1.25, - "text": "ン", - "vowel": "N", - "vowel_length": 1.25 - }, - { - "consonant": "n", - "consonant_length": 2.75, - "pitch": 4.06, - "text": "ニ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "ch", - "consonant_length": 1.62, - "pitch": 2.94, - "text": "チ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "w", - "consonant_length": 3.62, - "pitch": 4.19, - "text": "ワ", - "vowel": "a", - "vowel_length": 1.44 - } - ], - "pause_mora": { - "consonant": null, - "consonant_length": null, - "pitch": 0.0, - "text": "、", - "vowel": "pau", - "vowel_length": 1.0 - } - }, - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "h", - "consonant_length": 2.19, - "pitch": 3.69, - "text": "ヒ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "h", - "consonant_length": 2.19, - "pitch": 4.06, - "text": "ホ", - "vowel": "o", - "vowel_length": 2.88 - }, - { - "consonant": "d", - "consonant_length": 1.75, - "pitch": 2.62, - "text": "デ", - "vowel": "e", - "vowel_length": 1.88 - }, - { - "consonant": "s", - "consonant_length": 3.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 1.38 - } - ], - "pause_mora": null - } -] diff --git a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_create_sing_volume_from_phoneme_and_f0_output.json b/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_create_sing_volume_from_phoneme_and_f0_output.json deleted file mode 100644 index cc38d7b9c764c04eb394d24bcfa5a64b119ba3e3..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_create_sing_volume_from_phoneme_and_f0_output.json +++ /dev/null @@ -1,106 +0,0 @@ -[ - 0.0, - 0.0, - 0.0, - 0.0, - 0.61, - 0.61, - 0.61, - 0.61, - 0.61, - 0.61, - 1.53, - 1.53, - 1.53, - 1.53, - 1.96, - 1.96, - 1.96, - 1.96, - 1.96, - 1.96, - 1.96, - 1.96, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 1.79, - 1.79, - 1.79, - 1.79, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 0.0, - 0.0, - 0.0, - 1.11, - 1.11, - 0.51, - 0.51, - 0.51, - 0.51, - 0.51, - 0.51, - 3.0, - 3.0, - 3.0, - 3.0, - 3.0, - 3.0, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 -] diff --git a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_synthesize_wave_from_score_output[query].json b/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_synthesize_wave_from_score_output[query].json deleted file mode 100644 index ed97c822cb6fb6a9fe6b2c9e0867e2204a1792ba..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_synthesize_wave_from_score_output[query].json +++ /dev/null @@ -1,268 +0,0 @@ -[ - [ - { - "frame_length": 4, - "phoneme": "pau" - }, - { - "frame_length": 6, - "phoneme": "d" - }, - { - "frame_length": 4, - "phoneme": "o" - }, - { - "frame_length": 8, - "phoneme": "r" - }, - { - "frame_length": 13, - "phoneme": "e" - }, - { - "frame_length": 4, - "phoneme": "m" - }, - { - "frame_length": 21, - "phoneme": "i" - }, - { - "frame_length": 3, - "phoneme": "pau" - }, - { - "frame_length": 2, - "phoneme": "f" - }, - { - "frame_length": 6, - "phoneme": "a" - }, - { - "frame_length": 6, - "phoneme": "s" - }, - { - "frame_length": 17, - "phoneme": "o" - }, - { - "frame_length": 10, - "phoneme": "pau" - } - ], - [ - 0.0, - 0.0, - 0.0, - 0.0, - 262.93, - 262.93, - 262.93, - 262.93, - 262.93, - 262.93, - 264.0, - 264.0, - 264.0, - 264.0, - 296.53, - 296.53, - 296.53, - 296.53, - 296.53, - 296.53, - 296.53, - 296.53, - 295.27, - 295.27, - 295.27, - 295.27, - 295.27, - 295.27, - 295.27, - 295.27, - 295.27, - 295.27, - 295.27, - 295.27, - 295.27, - 332.32, - 332.32, - 332.32, - 332.32, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 331.95, - 0.0, - 0.0, - 0.0, - 351.21, - 351.21, - 350.58, - 350.58, - 350.58, - 350.58, - 350.58, - 350.58, - 396.0, - 396.0, - 396.0, - 396.0, - 396.0, - 396.0, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 395.56, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ], - [ - 0.0, - 0.0, - 0.0, - 0.0, - 0.61, - 0.61, - 0.61, - 0.61, - 0.61, - 0.61, - 1.53, - 1.53, - 1.53, - 1.53, - 1.96, - 1.96, - 1.96, - 1.96, - 1.96, - 1.96, - 1.96, - 1.96, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 0.83, - 1.79, - 1.79, - 1.79, - 1.79, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 1.44, - 0.0, - 0.0, - 0.0, - 1.11, - 1.11, - 0.51, - 0.51, - 0.51, - 0.51, - 0.51, - 0.51, - 3.0, - 3.0, - 3.0, - 3.0, - 3.0, - 3.0, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 2.57, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ] -] diff --git a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_synthesize_wave_from_score_output[wave].json b/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_synthesize_wave_from_score_output[wave].json deleted file mode 100644 index 3b711372aa69b016775c0e9d5672a985055cfe8c..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_synthesize_wave_from_score_output[wave].json +++ /dev/null @@ -1,3995 +0,0 @@ -[ - [ - 0.7 - ], - [ - 1.41 - ], - [ - 1.24 - ], - [ - 1.34 - ], - [ - 1.27 - ], - [ - 1.32 - ], - [ - 1.28 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.35 - ], - [ - 1.45 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.45 - ], - [ - 1.44 - ], - [ - 1.45 - ], - [ - 1.44 - ], - [ - 1.45 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.44 - ], - [ - 1.45 - ], - [ - 1.44 - ], - [ - 1.45 - ], - [ - 1.43 - ], - [ - 1.46 - ], - [ - 1.42 - ], - [ - 1.48 - ], - [ - 1.38 - ], - [ - 1.84 - ], - [ - 2.27 - ], - [ - 2.16 - ], - [ - 2.22 - ], - [ - 2.18 - ], - [ - 2.21 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.2 - ], - [ - 2.19 - ], - [ - 2.21 - ], - [ - 2.19 - ], - [ - 2.21 - ], - [ - 2.18 - ], - [ - 2.22 - ], - [ - 2.15 - ], - [ - 2.37 - ], - [ - 2.75 - ], - [ - 2.7 - ], - [ - 2.73 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.72 - ], - [ - 2.71 - ], - [ - 2.73 - ], - [ - 2.71 - ], - [ - 2.73 - ], - [ - 2.7 - ], - [ - 2.73 - ], - [ - 2.7 - ], - [ - 2.73 - ], - [ - 2.7 - ], - [ - 2.73 - ], - [ - 2.7 - ], - [ - 2.73 - ], - [ - 2.68 - ], - [ - 1.7 - ], - [ - 1.5 - ], - [ - 1.58 - ], - [ - 1.53 - ], - [ - 1.57 - ], - [ - 1.53 - ], - [ - 1.57 - ], - [ - 1.54 - ], - [ - 1.57 - ], - [ - 1.54 - ], - [ - 1.56 - ], - [ - 1.54 - ], - [ - 1.56 - ], - [ - 1.55 - ], - [ - 1.56 - ], - [ - 1.55 - ], - [ - 1.56 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.56 - ], - [ - 1.55 - ], - [ - 1.56 - ], - [ - 1.55 - ], - [ - 1.56 - ], - [ - 1.55 - ], - [ - 1.56 - ], - [ - 1.55 - ], - [ - 1.56 - ], - [ - 1.55 - ], - [ - 1.56 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.55 - ], - [ - 1.56 - ], - [ - 1.55 - ], - [ - 1.56 - ], - [ - 1.54 - ], - [ - 1.57 - ], - [ - 1.53 - ], - [ - 1.59 - ], - [ - 1.48 - ], - [ - 2.02 - ], - [ - 2.52 - ], - [ - 2.4 - ], - [ - 2.47 - ], - [ - 2.42 - ], - [ - 2.45 - ], - [ - 2.43 - ], - [ - 2.45 - ], - [ - 2.43 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.44 - ], - [ - 2.43 - ], - [ - 2.45 - ], - [ - 2.43 - ], - [ - 2.45 - ], - [ - 2.42 - ], - [ - 2.47 - ], - [ - 2.31 - ], - [ - 2.02 - ], - [ - 2.05 - ], - [ - 2.03 - ], - [ - 2.05 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.04 - ], - [ - 2.05 - ], - [ - 2.03 - ], - [ - 2.05 - ], - [ - 2.03 - ], - [ - 2.06 - ], - [ - 2.01 - ], - [ - 2.11 - ], - [ - 1.65 - ], - [ - 1.23 - ], - [ - 1.33 - ], - [ - 1.28 - ], - [ - 1.32 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.28 - ], - [ - 1.37 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.74 - ], - [ - 1.72 - ], - [ - 1.74 - ], - [ - 1.72 - ], - [ - 1.74 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.73 - ], - [ - 1.72 - ], - [ - 1.74 - ], - [ - 1.72 - ], - [ - 1.76 - ], - [ - 1.55 - ], - [ - 1.36 - ], - [ - 1.41 - ], - [ - 1.38 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.4 - ], - [ - 1.38 - ], - [ - 1.4 - ], - [ - 1.38 - ], - [ - 1.41 - ], - [ - 1.38 - ], - [ - 1.41 - ], - [ - 1.38 - ], - [ - 1.41 - ], - [ - 1.38 - ], - [ - 1.41 - ], - [ - 1.38 - ], - [ - 1.41 - ], - [ - 1.38 - ], - [ - 1.41 - ], - [ - 1.38 - ], - [ - 1.4 - ], - [ - 1.39 - ], - [ - 1.38 - ], - [ - 1.41 - ], - [ - 1.35 - ], - [ - 1.47 - ], - [ - 1.24 - ], - [ - 3.51 - ], - [ - 4.6 - ], - [ - 4.24 - ], - [ - 4.46 - ], - [ - 4.3 - ], - [ - 4.43 - ], - [ - 4.32 - ], - [ - 4.41 - ], - [ - 4.34 - ], - [ - 4.4 - ], - [ - 4.35 - ], - [ - 4.39 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.36 - ], - [ - 4.37 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.37 - ], - [ - 4.36 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.37 - ], - [ - 4.36 - ], - [ - 4.37 - ], - [ - 4.36 - ], - [ - 4.37 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.36 - ], - [ - 4.38 - ], - [ - 4.34 - ], - [ - 3.65 - ], - [ - 3.52 - ], - [ - 3.57 - ], - [ - 3.53 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.55 - ], - [ - 3.54 - ], - [ - 3.56 - ], - [ - 3.54 - ], - [ - 3.57 - ], - [ - 3.53 - ], - [ - 3.58 - ], - [ - 3.51 - ], - [ - 3.59 - ], - [ - 3.49 - ], - [ - 3.62 - ], - [ - 3.44 - ], - [ - 3.74 - ], - [ - 2.8 - ], - [ - 1.15 - ], - [ - 1.37 - ], - [ - 1.26 - ], - [ - 1.32 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.3 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.31 - ], - [ - 1.29 - ], - [ - 1.32 - ], - [ - 1.28 - ], - [ - 1.33 - ], - [ - 1.27 - ], - [ - 1.34 - ], - [ - 1.24 - ], - [ - 1.41 - ] -] diff --git a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_synthesize_wave_output.json b/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_synthesize_wave_output.json deleted file mode 100644 index ac6687c51748d16470c6e9219905340967a4a5e6..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_synthesize_wave_output.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "hash": "MD5:0972d97e926609c90a9117490fe9813e", - "shape": [ - 1, - 14080, - 2 - ] -} diff --git a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_update_length_and_pitch_output.json b/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_update_length_and_pitch_output.json deleted file mode 100644 index 671e117de7d286cb80c6dc63960a4e21f9c69616..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_update_length_and_pitch_output.json +++ /dev/null @@ -1,95 +0,0 @@ -[ - { - "accent": 5, - "is_interrogative": false, - "moras": [ - { - "consonant": "k", - "consonant_length": 2.44, - "pitch": 4.38, - "text": "コ", - "vowel": "o", - "vowel_length": 2.88 - }, - { - "consonant": null, - "consonant_length": null, - "pitch": 1.25, - "text": "ン", - "vowel": "N", - "vowel_length": 1.25 - }, - { - "consonant": "n", - "consonant_length": 2.75, - "pitch": 4.06, - "text": "ニ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "ch", - "consonant_length": 1.62, - "pitch": 2.94, - "text": "チ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "w", - "consonant_length": 3.62, - "pitch": 4.19, - "text": "ワ", - "vowel": "a", - "vowel_length": 1.44 - } - ], - "pause_mora": { - "consonant": null, - "consonant_length": null, - "pitch": 0.0, - "text": "、", - "vowel": "pau", - "vowel_length": 1.0 - } - }, - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "h", - "consonant_length": 2.19, - "pitch": 3.69, - "text": "ヒ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "h", - "consonant_length": 2.19, - "pitch": 4.06, - "text": "ホ", - "vowel": "o", - "vowel_length": 2.88 - }, - { - "consonant": "d", - "consonant_length": 1.75, - "pitch": 2.62, - "text": "デ", - "vowel": "e", - "vowel_length": 1.88 - }, - { - "consonant": "s", - "consonant_length": 3.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 1.38 - } - ], - "pause_mora": null - } -] diff --git a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_update_length_output.json b/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_update_length_output.json deleted file mode 100644 index b67950be49af6819eccfec74ecee233c58d1a945..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_update_length_output.json +++ /dev/null @@ -1,95 +0,0 @@ -[ - { - "accent": 5, - "is_interrogative": false, - "moras": [ - { - "consonant": "k", - "consonant_length": 2.44, - "pitch": 5.0, - "text": "コ", - "vowel": "o", - "vowel_length": 2.88 - }, - { - "consonant": null, - "consonant_length": null, - "pitch": 5.0, - "text": "ン", - "vowel": "N", - "vowel_length": 1.25 - }, - { - "consonant": "n", - "consonant_length": 2.75, - "pitch": 5.0, - "text": "ニ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "ch", - "consonant_length": 1.62, - "pitch": 5.0, - "text": "チ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "w", - "consonant_length": 3.62, - "pitch": 5.0, - "text": "ワ", - "vowel": "a", - "vowel_length": 1.44 - } - ], - "pause_mora": { - "consonant": null, - "consonant_length": null, - "pitch": 0.0, - "text": "、", - "vowel": "pau", - "vowel_length": 1.0 - } - }, - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "h", - "consonant_length": 2.19, - "pitch": 0.0, - "text": "ヒ", - "vowel": "i", - "vowel_length": 2.31 - }, - { - "consonant": "h", - "consonant_length": 2.19, - "pitch": 5.0, - "text": "ホ", - "vowel": "o", - "vowel_length": 2.88 - }, - { - "consonant": "d", - "consonant_length": 1.75, - "pitch": 5.0, - "text": "デ", - "vowel": "e", - "vowel_length": 1.88 - }, - { - "consonant": "s", - "consonant_length": 3.19, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 1.38 - } - ], - "pause_mora": null - } -] diff --git a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_update_pitch_output.json b/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_update_pitch_output.json deleted file mode 100644 index af37f3a227877e6d229b4963f8235a4d0d730c64..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/__snapshots__/test_tts_engine/test_mocked_update_pitch_output.json +++ /dev/null @@ -1,95 +0,0 @@ -[ - { - "accent": 5, - "is_interrogative": false, - "moras": [ - { - "consonant": "k", - "consonant_length": 0.1, - "pitch": 4.38, - "text": "コ", - "vowel": "o", - "vowel_length": 0.1 - }, - { - "consonant": null, - "consonant_length": null, - "pitch": 1.25, - "text": "ン", - "vowel": "N", - "vowel_length": 0.1 - }, - { - "consonant": "n", - "consonant_length": 0.1, - "pitch": 4.06, - "text": "ニ", - "vowel": "i", - "vowel_length": 0.1 - }, - { - "consonant": "ch", - "consonant_length": 0.1, - "pitch": 2.94, - "text": "チ", - "vowel": "i", - "vowel_length": 0.1 - }, - { - "consonant": "w", - "consonant_length": 0.1, - "pitch": 4.19, - "text": "ワ", - "vowel": "a", - "vowel_length": 0.1 - } - ], - "pause_mora": { - "consonant": null, - "consonant_length": null, - "pitch": 0.0, - "text": "、", - "vowel": "pau", - "vowel_length": 0.1 - } - }, - { - "accent": 1, - "is_interrogative": false, - "moras": [ - { - "consonant": "h", - "consonant_length": 0.1, - "pitch": 3.69, - "text": "ヒ", - "vowel": "i", - "vowel_length": 0.1 - }, - { - "consonant": "h", - "consonant_length": 0.1, - "pitch": 4.06, - "text": "ホ", - "vowel": "o", - "vowel_length": 0.1 - }, - { - "consonant": "d", - "consonant_length": 0.1, - "pitch": 2.62, - "text": "デ", - "vowel": "e", - "vowel_length": 0.1 - }, - { - "consonant": "s", - "consonant_length": 0.1, - "pitch": 0.0, - "text": "ス", - "vowel": "U", - "vowel_length": 0.1 - } - ], - "pause_mora": null - } -] diff --git a/voicevox_engine/test/unit/tts_pipeline/test_connect_base64_waves.py b/voicevox_engine/test/unit/tts_pipeline/test_connect_base64_waves.py deleted file mode 100644 index 0cdcc31433c45e58466c6ff7b52e96cb70fe8e7e..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/test_connect_base64_waves.py +++ /dev/null @@ -1,119 +0,0 @@ -import base64 -import io - -import numpy as np -import numpy.testing -import pytest -import soundfile -from numpy.typing import NDArray -from soxr import resample - -from voicevox_engine.tts_pipeline.connect_base64_waves import ( - ConnectBase64WavesException, - connect_base64_waves, -) - - -def generate_sine_wave_ndarray( - seconds: float, samplerate: int, frequency: float -) -> NDArray[np.float32]: - x = np.linspace(0, seconds, int(seconds * samplerate), endpoint=False) - wave: NDArray[np.float32] = np.sin(2 * np.pi * frequency * x).astype(np.float32) - - return wave - - -def encode_bytes(wave_ndarray: NDArray[np.float32], samplerate: int) -> bytes: - wave_bio = io.BytesIO() - soundfile.write( - file=wave_bio, - data=wave_ndarray, - samplerate=samplerate, - format="WAV", - subtype="FLOAT", - ) - wave_bio.seek(0) - - return wave_bio.getvalue() - - -def generate_sine_wave_bytes( - seconds: float, samplerate: int, frequency: float -) -> bytes: - wave_ndarray = generate_sine_wave_ndarray(seconds, samplerate, frequency) - return encode_bytes(wave_ndarray, samplerate) - - -def encode_base64(wave_bytes: bytes) -> str: - return base64.standard_b64encode(wave_bytes).decode("utf-8") - - -def generate_sine_wave_base64(seconds: float, samplerate: int, frequency: float) -> str: - wave_bytes = generate_sine_wave_bytes(seconds, samplerate, frequency) - wave_base64 = encode_base64(wave_bytes) - return wave_base64 - - -def test_connect() -> None: - samplerate = 1000 - wave = generate_sine_wave_ndarray(seconds=2, samplerate=samplerate, frequency=10) - wave_base64 = encode_base64(encode_bytes(wave, samplerate=samplerate)) - - wave_x2_ref = np.concatenate([wave, wave]) - - wave_x2, _ = connect_base64_waves(waves=[wave_base64, wave_base64]) - - assert wave_x2_ref.shape == wave_x2.shape - - assert (wave_x2_ref == wave_x2).all() - - -def test_no_wave_error() -> None: - with pytest.raises(ConnectBase64WavesException): - connect_base64_waves(waves=[]) - - -def test_invalid_base64_error() -> None: - wave_1000hz = generate_sine_wave_base64(seconds=2, samplerate=1000, frequency=10) - wave_1000hz_broken = wave_1000hz[1:] # remove head 1 char - - with pytest.raises(ConnectBase64WavesException): - connect_base64_waves(waves=[wave_1000hz_broken]) - - -def test_invalid_wave_file_error() -> None: - wave_1000hz = generate_sine_wave_bytes(seconds=2, samplerate=1000, frequency=10) - wave_1000hz_broken_bytes = wave_1000hz[1:] # remove head 1 byte - wave_1000hz_broken = encode_base64(wave_1000hz_broken_bytes) - - with pytest.raises(ConnectBase64WavesException): - connect_base64_waves(waves=[wave_1000hz_broken]) - - -def test_different_frequency() -> None: - wave_24000hz = generate_sine_wave_ndarray(seconds=1, samplerate=24000, frequency=10) - wave_1000hz = generate_sine_wave_ndarray(seconds=2, samplerate=1000, frequency=10) - wave_24000_base64 = encode_base64(encode_bytes(wave_24000hz, samplerate=24000)) - wave_1000_base64 = encode_base64(encode_bytes(wave_1000hz, samplerate=1000)) - - wave_1000hz_to24000hz = resample(wave_1000hz, 1000, 24000) - wave_x2_ref = np.concatenate([wave_24000hz, wave_1000hz_to24000hz]) - - wave_x2, _ = connect_base64_waves(waves=[wave_24000_base64, wave_1000_base64]) - - assert wave_x2_ref.shape == wave_x2.shape - numpy.testing.assert_array_almost_equal(wave_x2_ref, wave_x2) - - -def test_different_channels() -> None: - wave_1000hz = generate_sine_wave_ndarray(seconds=2, samplerate=1000, frequency=10) - wave_2ch_1000hz = np.array([wave_1000hz, wave_1000hz]).T - wave_1ch_base64 = encode_base64(encode_bytes(wave_1000hz, samplerate=1000)) - wave_2ch_base64 = encode_base64(encode_bytes(wave_2ch_1000hz, samplerate=1000)) - - wave_x2_ref = np.concatenate([wave_2ch_1000hz, wave_2ch_1000hz]) - - wave_x2, _ = connect_base64_waves(waves=[wave_1ch_base64, wave_2ch_base64]) - - assert wave_x2_ref.shape == wave_x2.shape - assert (wave_x2_ref == wave_x2).all() diff --git a/voicevox_engine/test/unit/tts_pipeline/test_kana_converter.py b/voicevox_engine/test/unit/tts_pipeline/test_kana_converter.py deleted file mode 100644 index cc3864c8a63e040838f271cf42321ac2d50a7828..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/test_kana_converter.py +++ /dev/null @@ -1,699 +0,0 @@ -from unittest import TestCase - -from voicevox_engine.tts_pipeline import kana_converter -from voicevox_engine.tts_pipeline.kana_converter import ParseKanaError, create_kana -from voicevox_engine.tts_pipeline.model import AccentPhrase, Mora, ParseKanaErrorCode - - -def parse_kana(text: str) -> list[AccentPhrase]: - accent_phrases = kana_converter.parse_kana(text) - return accent_phrases - - -def test_phrase_length() -> None: - assert len(parse_kana("ア'/ア'")) == 2 - assert len(parse_kana("ア'、ア'")) == 2 - assert len(parse_kana("ア'/ア'/ア'/ア'/ア'")) == 5 - assert len(parse_kana("ス'")) == 1 - assert len(parse_kana("_ス'")) == 1 - assert len(parse_kana("ギェ'")) == 1 - assert len(parse_kana("ギェ'、ギェ'/ギェ'")) == 3 - - -def test_accent() -> None: - assert parse_kana("シャ'シシュシェショ")[0].accent == 1 - assert parse_kana("シャ'_シシュシェショ")[0].accent == 1 - assert parse_kana("シャシ'シュシェショ")[0].accent == 2 - assert parse_kana("シャ_シ'シュシェショ")[0].accent == 2 - assert parse_kana("シャシシュ'シェショ")[0].accent == 3 - assert parse_kana("シャ_シシュ'シェショ")[0].accent == 3 - assert parse_kana("シャシシュシェショ'")[0].accent == 5 - assert parse_kana("シャ_シシュシェショ'")[0].accent == 5 - - -def test_mora_length() -> None: - assert len(parse_kana("シャ'シシュシェショ")[0].moras) == 5 - assert len(parse_kana("シャ'_シシュシェショ")[0].moras) == 5 - assert len(parse_kana("シャシ'シュシェショ")[0].moras) == 5 - assert len(parse_kana("シャ_シ'シュシェショ")[0].moras) == 5 - assert len(parse_kana("シャシシュシェショ'")[0].moras) == 5 - assert len(parse_kana("シャ_シシュシェショ'")[0].moras) == 5 - - -def test_pause() -> None: - assert parse_kana("ア'/ア'")[0].pause_mora is None - assert parse_kana("ア'/ア'")[1].pause_mora is None - assert parse_kana("ア'、ア'")[0].pause_mora is not None - assert parse_kana("ア'、ア'")[1].pause_mora is None - - -def test_unvoice() -> None: - assert parse_kana("ス'")[0].moras[0].vowel == "u" - assert parse_kana("_ス'")[0].moras[0].vowel == "U" - - -def test_roundtrip() -> None: - for text in [ - "コンニチワ'", - "ワタシワ'/シャチョオデ'_ス", - "トテモ'、エラ'インデス", - ]: - assert create_kana(parse_kana(text)) == text - - for text in ["ヲ'", "ェ'"]: - assert create_kana(parse_kana(text)) == text - - -def _accent_phrase_marks_base( - text: str, expected_accent_phrases: list[AccentPhrase] -) -> None: - accent_phrases = kana_converter.parse_kana(text) - assert expected_accent_phrases == accent_phrases - - -def test_accent_phrase_marks() -> None: - def a_slash_a_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - ] - - expected_accent_phrases = a_slash_a_accent_phrases() - _accent_phrase_marks_base( - text="ア'/ア'", - expected_accent_phrases=expected_accent_phrases, - ) - - def a_jp_comma_a_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=Mora( - text="、", - consonant=None, - consonant_length=None, - vowel="pau", - vowel_length=0.0, - pitch=0.0, - ), - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - ] - - expected_accent_phrases = a_jp_comma_a_accent_phrases() - _accent_phrase_marks_base( - text="ア'、ア'", - expected_accent_phrases=expected_accent_phrases, - ) - - def a_slash_a_slash_a_slash_a_slash_a_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - ] - - expected_accent_phrases = a_slash_a_slash_a_slash_a_slash_a_accent_phrases() - _accent_phrase_marks_base( - text="ア'/ア'/ア'/ア'/ア'", - expected_accent_phrases=expected_accent_phrases, - ) - - def su_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ス", - consonant="s", - consonant_length=0.0, - vowel="u", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - ] - - expected_accent_phrases = su_accent_phrases() - _accent_phrase_marks_base( - text="ス'", - expected_accent_phrases=expected_accent_phrases, - ) - - def under_score_su_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ス", - consonant="s", - consonant_length=0.0, - vowel="U", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - ] - - expected_accent_phrases = under_score_su_accent_phrases() - _accent_phrase_marks_base( - text="_ス'", - expected_accent_phrases=expected_accent_phrases, - ) - - def gye_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ギェ", - consonant="gy", - consonant_length=0.0, - vowel="e", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - ] - - expected_accent_phrases = gye_accent_phrases() - _accent_phrase_marks_base( - text="ギェ'", - expected_accent_phrases=expected_accent_phrases, - ) - - def gye_gye_gye_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ギェ", - consonant="gy", - consonant_length=0.0, - vowel="e", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=Mora( - text="、", - consonant=None, - consonant_length=None, - vowel="pau", - vowel_length=0.0, - pitch=0.0, - ), - ), - AccentPhrase( - moras=[ - Mora( - text="ギェ", - consonant="gy", - consonant_length=0.0, - vowel="e", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - AccentPhrase( - moras=[ - Mora( - text="ギェ", - consonant="gy", - consonant_length=0.0, - vowel="e", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - ] - - expected_accent_phrases = gye_gye_gye_accent_phrases() - _accent_phrase_marks_base( - text="ギェ'、ギェ'/ギェ'", - expected_accent_phrases=expected_accent_phrases, - ) - - -def test_interrogative_accent_phrase_marks() -> None: - def a_question_mark_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - is_interrogative=True, - ), - ] - - expected_accent_phrases = a_question_mark_accent_phrases() - _accent_phrase_marks_base( - text="ア'?", - expected_accent_phrases=expected_accent_phrases, - ) - - def gye_gye_gye_question_mark_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ギェ", - consonant="gy", - consonant_length=0.0, - vowel="e", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=Mora( - text="、", - consonant=None, - consonant_length=None, - vowel="pau", - vowel_length=0.0, - pitch=0.0, - ), - ), - AccentPhrase( - moras=[ - Mora( - text="ギェ", - consonant="gy", - consonant_length=0.0, - vowel="e", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - ), - AccentPhrase( - moras=[ - Mora( - text="ギェ", - consonant="gy", - consonant_length=0.0, - vowel="e", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - is_interrogative=True, - ), - ] - - expected_accent_phrases = gye_gye_gye_question_mark_accent_phrases() - _accent_phrase_marks_base( - text="ギェ'、ギェ'/ギェ'?", - expected_accent_phrases=expected_accent_phrases, - ) - - def a_pause_a_question_pause_a_question_a_question_mark_accent_phrases() -> ( - list[AccentPhrase] - ): - return [ - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=Mora( - text="、", - consonant=None, - consonant_length=None, - vowel="pau", - vowel_length=0.0, - pitch=0.0, - ), - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=Mora( - text="、", - consonant=None, - consonant_length=None, - vowel="pau", - vowel_length=0.0, - pitch=0.0, - ), - is_interrogative=True, - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - is_interrogative=True, - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.0, - pitch=0.0, - ), - ], - accent=1, - pause_mora=None, - is_interrogative=True, - ), - ] - - expected_accent_phrases = ( - a_pause_a_question_pause_a_question_a_question_mark_accent_phrases() - ) - _accent_phrase_marks_base( - text="ア'、ア'?、ア'?/ア'?", - expected_accent_phrases=expected_accent_phrases, - ) - - -class TestParseKanaException(TestCase): - def _assert_error_code(self, kana: str, code: ParseKanaErrorCode) -> None: - with self.assertRaises(ParseKanaError) as err: - parse_kana(kana) - self.assertEqual(err.exception.errcode, code) - - def test_exceptions(self) -> None: - self._assert_error_code("アクセント", ParseKanaErrorCode.ACCENT_NOTFOUND) - self._assert_error_code("'アクセント", ParseKanaErrorCode.ACCENT_TOP) - self._assert_error_code("ア'ク'セント", ParseKanaErrorCode.ACCENT_TWICE) - self._assert_error_code("ひ'らがな", ParseKanaErrorCode.UNKNOWN_TEXT) - self._assert_error_code("__ス'", ParseKanaErrorCode.UNKNOWN_TEXT) - self._assert_error_code("ア'/", ParseKanaErrorCode.EMPTY_PHRASE) - self._assert_error_code("/ア'", ParseKanaErrorCode.EMPTY_PHRASE) - self._assert_error_code("", ParseKanaErrorCode.EMPTY_PHRASE) - - with self.assertRaises(ParseKanaError) as err: - parse_kana("ヒト'ツメ/フタツメ") - self.assertEqual(err.exception.errcode, ParseKanaErrorCode.ACCENT_NOTFOUND) - self.assertEqual(err.exception.kwargs, {"text": "フタツメ"}) - - with self.assertRaises(ParseKanaError) as err: - parse_kana("ア'/") - self.assertEqual(err.exception.errcode, ParseKanaErrorCode.EMPTY_PHRASE) - self.assertEqual(err.exception.kwargs, {"position": "2"}) - - with self.assertRaises(ParseKanaError) as err: - kana_converter.parse_kana("ア?ア'") - self.assertEqual( - err.exception.errcode, ParseKanaErrorCode.INTERROGATION_MARK_NOT_AT_END - ) - - -def test_create_kana_interrogative() -> None: - def koreha_arimasuka_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="コ", - consonant="k", - consonant_length=2.5, - vowel="o", - vowel_length=2.5, - pitch=2.5, - ), - Mora( - text="レ", - consonant="r", - consonant_length=2.5, - vowel="e", - vowel_length=2.5, - pitch=2.5, - ), - Mora( - text="ワ", - consonant="w", - consonant_length=2.5, - vowel="a", - vowel_length=2.5, - pitch=2.5, - ), - ], - accent=3, - pause_mora=None, - is_interrogative=False, - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=2.5, - pitch=2.5, - ), - Mora( - text="リ", - consonant="r", - consonant_length=2.5, - vowel="i", - vowel_length=2.5, - pitch=2.5, - ), - Mora( - text="マ", - consonant="m", - consonant_length=2.5, - vowel="a", - vowel_length=2.5, - pitch=2.5, - ), - Mora( - text="ス", - consonant="s", - consonant_length=2.5, - vowel="U", - vowel_length=2.5, - pitch=2.5, - ), - Mora( - text="カ", - consonant="k", - consonant_length=2.5, - vowel="a", - vowel_length=2.5, - pitch=2.5, - ), - ], - accent=3, - pause_mora=None, - is_interrogative=False, - ), - ] - - accent_phrases = koreha_arimasuka_accent_phrases() - assert create_kana(accent_phrases) == "コレワ'/アリマ'_スカ" - - accent_phrases = koreha_arimasuka_accent_phrases() - accent_phrases[-1].is_interrogative = True - assert create_kana(accent_phrases) == "コレワ'/アリマ'_スカ?" - - def kya_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="キャ", - consonant="ky", - consonant_length=2.5, - vowel="a", - vowel_length=2.5, - pitch=2.5, - ), - Mora( - text="ッ", - consonant=None, - consonant_length=None, - vowel="cl", - vowel_length=0.1, - pitch=0, - ), - ], - accent=1, - pause_mora=None, - is_interrogative=False, - ), - ] - - accent_phrases = kya_accent_phrases() - assert create_kana(accent_phrases) == "キャ'ッ" - - accent_phrases = kya_accent_phrases() - accent_phrases[-1].is_interrogative = True - assert create_kana(accent_phrases) == "キャ'ッ?" diff --git a/voicevox_engine/test/unit/tts_pipeline/test_mora_mapping.py b/voicevox_engine/test/unit/tts_pipeline/test_mora_mapping.py deleted file mode 100644 index d9baceb829186478f9c07a1c89758cb1b4f81cdb..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/test_mora_mapping.py +++ /dev/null @@ -1,18 +0,0 @@ -from voicevox_engine.tts_pipeline.mora_mapping import mora_phonemes_to_mora_kana - - -def test_mora2text() -> None: - assert "ッ" == mora_phonemes_to_mora_kana["cl"] - assert "ティ" == mora_phonemes_to_mora_kana["ti"] - assert "トゥ" == mora_phonemes_to_mora_kana["tu"] - assert "ディ" == mora_phonemes_to_mora_kana["di"] - # GitHub issue #60 - assert "ギェ" == mora_phonemes_to_mora_kana["gye"] - assert "イェ" == mora_phonemes_to_mora_kana["ye"] - - -def test_mora2text_injective() -> None: - """異なるモーラが同じ読みがなに対応しないか確認する""" - mora_kanas = list(mora_phonemes_to_mora_kana.values()) - # NOTE: 同じ読みがなが複数回登場すると set で非重複化して全長が短くなる - assert len(mora_kanas) == len(set(mora_kanas)) diff --git a/voicevox_engine/test/unit/tts_pipeline/test_phoneme.py b/voicevox_engine/test/unit/tts_pipeline/test_phoneme.py deleted file mode 100644 index 0e04131235e0674806c783ce11e748d66fbeced2..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/test_phoneme.py +++ /dev/null @@ -1,70 +0,0 @@ -import pytest - -from voicevox_engine.tts_pipeline.phoneme import Phoneme - -TRUE_NUM_PHONEME = 45 - - -def test_unknown_phoneme() -> None: - """Unknown音素 `xx` のID取得を拒否する""" - # Inputs - unknown_phoneme = Phoneme("xx") - - # Tests - with pytest.raises(ValueError): - unknown_phoneme.id - - -# list_idx 0 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 -hello_hiho = "sil k o N n i ch i w a pau h i h o d e s U sil".split() -ojt_hello_hiho = [Phoneme(s) for s in hello_hiho] - - -def test_const() -> None: - assert Phoneme._NUM_PHONEME == TRUE_NUM_PHONEME - assert Phoneme._PHONEME_LIST[1] == "A" - assert Phoneme._PHONEME_LIST[14] == "e" - assert Phoneme._PHONEME_LIST[26] == "m" - assert Phoneme._PHONEME_LIST[38] == "ts" - assert Phoneme._PHONEME_LIST[41] == "v" - - -def test_convert() -> None: - sil_phoneme = Phoneme("sil") - assert sil_phoneme._phoneme == "pau" - - -def test_phoneme_id() -> None: - ojt_str_hello_hiho = " ".join([str(p.id) for p in ojt_hello_hiho]) - assert ojt_str_hello_hiho == "0 23 30 4 28 21 10 21 42 7 0 19 21 19 30 12 14 35 6 0" - - -def test_onehot() -> None: - phoneme_id_list = [ - 0, - 23, - 30, - 4, - 28, - 21, - 10, - 21, - 42, - 7, - 0, - 19, - 21, - 19, - 30, - 12, - 14, - 35, - 6, - 0, - ] - for i, phoneme in enumerate(ojt_hello_hiho): - for j in range(TRUE_NUM_PHONEME): - if phoneme_id_list[i] == j: - assert phoneme.onehot[j] == 1.0 - else: - assert phoneme.onehot[j] == 0.0 diff --git a/voicevox_engine/test/unit/tts_pipeline/test_text_analyzer.py b/voicevox_engine/test/unit/tts_pipeline/test_text_analyzer.py deleted file mode 100644 index 4b29fd2b014ba156e0a0f45f6d538618b840d5df..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/test_text_analyzer.py +++ /dev/null @@ -1,387 +0,0 @@ -from voicevox_engine.tts_pipeline.model import AccentPhrase, Mora -from voicevox_engine.tts_pipeline.text_analyzer import ( - AccentPhraseLabel, - BreathGroupLabel, - Label, - MoraLabel, - UtteranceLabel, - mora_to_text, - text_to_accent_phrases, -) - - -def contexts_to_feature(contexts: dict[str, str]) -> str: - """ラベルの contexts を feature へ変換する""" - return ( - "{p1}^{p2}-{p3}+{p4}={p5}" - "/A:{a1}+{a2}+{a3}" - "/B:{b1}-{b2}_{b3}" - "/C:{c1}_{c2}+{c3}" - "/D:{d1}+{d2}_{d3}" - "/E:{e1}_{e2}!{e3}_{e4}-{e5}" - "/F:{f1}_{f2}#{f3}_{f4}@{f5}_{f6}|{f7}_{f8}" - "/G:{g1}_{g2}%{g3}_{g4}_{g5}" - "/H:{h1}_{h2}" - "/I:{i1}-{i2}@{i3}+{i4}&{i5}-{i6}|{i7}+{i8}" - "/J:{j1}_{j2}" - "/K:{k1}+{k2}-{k3}" - ).format(**contexts) - - -# OpenJTalk コンテナクラス -OjtContainer = MoraLabel | AccentPhraseLabel | BreathGroupLabel | UtteranceLabel - - -def features(ojt_container: OjtContainer) -> list[str]: - """コンテナインスタンスに直接的・間接的に含まれる全ての feature を返す""" - return [contexts_to_feature(p.contexts) for p in ojt_container.labels] - - -# pyopenjtalk.extract_fullcontext("こんにちは、ヒホです。")の結果 -# 出来る限りテスト内で他のライブラリに依存しないため、 -# またテスト内容を透明化するために、テストケースを生成している -test_case_hello_hiho = [ - # sil (無音) - "xx^xx-sil+k=o/A:xx+xx+xx/B:xx-xx_xx/C:xx_xx+xx/D:09+xx_xx/E:xx_xx!xx_xx-xx" - + "/F:xx_xx#xx_xx@xx_xx|xx_xx/G:5_5%0_xx_xx/H:xx_xx/I:xx-xx" - + "@xx+xx&xx-xx|xx+xx/J:1_5/K:2+2-9", - # k - "xx^sil-k+o=N/A:-4+1+5/B:xx-xx_xx/C:09_xx+xx/D:09+xx_xx/E:xx_xx!xx_xx-xx" - + "/F:5_5#0_xx@1_1|1_5/G:4_1%0_xx_0/H:xx_xx/I:1-5" - + "@1+2&1-2|1+9/J:1_4/K:2+2-9", - # o - "sil^k-o+N=n/A:-4+1+5/B:xx-xx_xx/C:09_xx+xx/D:09+xx_xx/E:xx_xx!xx_xx-xx" - + "/F:5_5#0_xx@1_1|1_5/G:4_1%0_xx_0/H:xx_xx/I:1-5" - + "@1+2&1-2|1+9/J:1_4/K:2+2-9", - # N (ん) - "k^o-N+n=i/A:-3+2+4/B:xx-xx_xx/C:09_xx+xx/D:09+xx_xx/E:xx_xx!xx_xx-xx" - + "/F:5_5#0_xx@1_1|1_5/G:4_1%0_xx_0/H:xx_xx/I:1-5" - + "@1+2&1-2|1+9/J:1_4/K:2+2-9", - # n - "o^N-n+i=ch/A:-2+3+3/B:xx-xx_xx/C:09_xx+xx/D:09+xx_xx/E:xx_xx!xx_xx-xx" - + "/F:5_5#0_xx@1_1|1_5/G:4_1%0_xx_0/H:xx_xx/I:1-5" - + "@1+2&1-2|1+9/J:1_4/K:2+2-9", - # i - "N^n-i+ch=i/A:-2+3+3/B:xx-xx_xx/C:09_xx+xx/D:09+xx_xx/E:xx_xx!xx_xx-xx" - + "/F:5_5#0_xx@1_1|1_5/G:4_1%0_xx_0/H:xx_xx/I:1-5" - + "@1+2&1-2|1+9/J:1_4/K:2+2-9", - # ch - "n^i-ch+i=w/A:-1+4+2/B:xx-xx_xx/C:09_xx+xx/D:09+xx_xx/E:xx_xx!xx_xx-xx" - + "/F:5_5#0_xx@1_1|1_5/G:4_1%0_xx_0/H:xx_xx/I:1-5" - + "@1+2&1-2|1+9/J:1_4/K:2+2-9", - # i - "i^ch-i+w=a/A:-1+4+2/B:xx-xx_xx/C:09_xx+xx/D:09+xx_xx/E:xx_xx!xx_xx-xx" - + "/F:5_5#0_xx@1_1|1_5/G:4_1%0_xx_0/H:xx_xx/I:1-5" - + "@1+2&1-2|1+9/J:1_4/K:2+2-9", - # w - "ch^i-w+a=pau/A:0+5+1/B:xx-xx_xx/C:09_xx+xx/D:09+xx_xx/E:xx_xx!xx_xx-xx" - + "/F:5_5#0_xx@1_1|1_5/G:4_1%0_xx_0/H:xx_xx/I:1-5" - + "@1+2&1-2|1+9/J:1_4/K:2+2-9", - # a - "i^w-a+pau=h/A:0+5+1/B:xx-xx_xx/C:09_xx+xx/D:09+xx_xx/E:xx_xx!xx_xx-xx" - + "/F:5_5#0_xx@1_1|1_5/G:4_1%0_xx_0/H:xx_xx/I:1-5" - + "@1+2&1-2|1+9/J:1_4/K:2+2-9", - # pau (読点) - "w^a-pau+h=i/A:xx+xx+xx/B:09-xx_xx/C:xx_xx+xx/D:09+xx_xx/E:5_5!0_xx-xx" - + "/F:xx_xx#xx_xx@xx_xx|xx_xx/G:4_1%0_xx_xx/H:1_5/I:xx-xx" - + "@xx+xx&xx-xx|xx+xx/J:1_4/K:2+2-9", - # h - "a^pau-h+i=h/A:0+1+4/B:09-xx_xx/C:09_xx+xx/D:22+xx_xx/E:5_5!0_xx-0" - + "/F:4_1#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:1_5/I:1-4" - + "@2+1&2-1|6+4/J:xx_xx/K:2+2-9", - # i - "pau^h-i+h=o/A:0+1+4/B:09-xx_xx/C:09_xx+xx/D:22+xx_xx/E:5_5!0_xx-0" - + "/F:4_1#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:1_5/I:1-4" - + "@2+1&2-1|6+4/J:xx_xx/K:2+2-9", - # h - "h^i-h+o=d/A:1+2+3/B:09-xx_xx/C:22_xx+xx/D:10+7_2/E:5_5!0_xx-0" - + "/F:4_1#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:1_5/I:1-4" - + "@2+1&2-1|6+4/J:xx_xx/K:2+2-9", - # o - "i^h-o+d=e/A:1+2+3/B:09-xx_xx/C:22_xx+xx/D:10+7_2/E:5_5!0_xx-0" - + "/F:4_1#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:1_5/I:1-4" - + "@2+1&2-1|6+4/J:xx_xx/K:2+2-9", - # d - "h^o-d+e=s/A:2+3+2/B:22-xx_xx/C:10_7+2/D:xx+xx_xx/E:5_5!0_xx-0" - + "/F:4_1#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:1_5/I:1-4" - + "@2+1&2-1|6+4/J:xx_xx/K:2+2-9", - # e - "o^d-e+s=U/A:2+3+2/B:22-xx_xx/C:10_7+2/D:xx+xx_xx/E:5_5!0_xx-0" - + "/F:4_1#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:1_5/I:1-4" - + "@2+1&2-1|6+4/J:xx_xx/K:2+2-9", - # s - "d^e-s+U=sil/A:3+4+1/B:22-xx_xx/C:10_7+2/D:xx+xx_xx/E:5_5!0_xx-0" - + "/F:4_1#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:1_5/I:1-4" - + "@2+1&2-1|6+4/J:xx_xx/K:2+2-9", - # U (無声母音) - "e^s-U+sil=xx/A:3+4+1/B:22-xx_xx/C:10_7+2/D:xx+xx_xx/E:5_5!0_xx-0" - + "/F:4_1#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:1_5/I:1-4" - + "@2+1&2-1|6+4/J:xx_xx/K:2+2-9", - # sil (無音) - "s^U-sil+xx=xx/A:xx+xx+xx/B:10-7_2/C:xx_xx+xx/D:xx+xx_xx/E:4_1!0_xx-xx" - + "/F:xx_xx#xx_xx@xx_xx|xx_xx/G:xx_xx%xx_xx_xx/H:1_4/I:xx-xx" - + "@xx+xx&xx-xx|xx+xx/J:xx_xx/K:2+2-9", -] -labels_hello_hiho = [Label.from_feature(feature) for feature in test_case_hello_hiho] - - -def jointed_phonemes(ojt_container: OjtContainer) -> str: - """コンテナインスタンスに直接的・間接的に含まれる全ラベルの音素文字を結合してを返す""" - return "".join([label.phoneme for label in ojt_container.labels]) - - -def space_jointed_phonemes(ojt_container: OjtContainer) -> str: - """コンテナインスタンスに直接的・間接的に含まれる全ラベルの音素文字を ` ` 挟みながら結合してを返す""" - return " ".join([label.phoneme for label in ojt_container.labels]) - - -def test_label_phoneme() -> None: - """Label に含まれる音素をテスト""" - assert ( - " ".join([label.phoneme for label in labels_hello_hiho]) - == "sil k o N n i ch i w a pau h i h o d e s U sil" - ) - - -def test_label_is_pause() -> None: - """Label のポーズ判定をテスト""" - assert [label.is_pause() for label in labels_hello_hiho] == [ - True, # sil - False, # k - False, # o - False, # N - False, # n - False, # i - False, # ch - False, # i - False, # w - False, # a - True, # pau - False, # h - False, # i - False, # h - False, # o - False, # d - False, # e - False, # s - False, # u - True, # sil - ] - - -def test_label_feature() -> None: - """Label に含まれる features をテスト""" - assert [ - contexts_to_feature(label.contexts) for label in labels_hello_hiho - ] == test_case_hello_hiho - - -# contexts["a2"] == "1" ko -mora_hello_1 = MoraLabel(consonant=labels_hello_hiho[1], vowel=labels_hello_hiho[2]) -# contexts["a2"] == "2" N -mora_hello_2 = MoraLabel(consonant=None, vowel=labels_hello_hiho[3]) -# contexts["a2"] == "3" ni -mora_hello_3 = MoraLabel(consonant=labels_hello_hiho[4], vowel=labels_hello_hiho[5]) -# contexts["a2"] == "4" chi -mora_hello_4 = MoraLabel(consonant=labels_hello_hiho[6], vowel=labels_hello_hiho[7]) -# contexts["a2"] == "5" wa -mora_hello_5 = MoraLabel(consonant=labels_hello_hiho[8], vowel=labels_hello_hiho[9]) -# contexts["a2"] == "1" hi -mora_hiho_1 = MoraLabel(consonant=labels_hello_hiho[11], vowel=labels_hello_hiho[12]) -# contexts["a2"] == "2" ho -mora_hiho_2 = MoraLabel(consonant=labels_hello_hiho[13], vowel=labels_hello_hiho[14]) -# contexts["a2"] == "3" de -mora_hiho_3 = MoraLabel(consonant=labels_hello_hiho[15], vowel=labels_hello_hiho[16]) -# contexts["a2"] == "1" sU -mora_hiho_4 = MoraLabel(consonant=labels_hello_hiho[17], vowel=labels_hello_hiho[18]) - - -def test_mora_label_phonemes() -> None: - """MoraLabel に含まれる音素系列をテスト""" - assert jointed_phonemes(mora_hello_1) == "ko" - assert jointed_phonemes(mora_hello_2) == "N" - assert jointed_phonemes(mora_hello_3) == "ni" - assert jointed_phonemes(mora_hello_4) == "chi" - assert jointed_phonemes(mora_hello_5) == "wa" - assert jointed_phonemes(mora_hiho_1) == "hi" - assert jointed_phonemes(mora_hiho_2) == "ho" - assert jointed_phonemes(mora_hiho_3) == "de" - assert jointed_phonemes(mora_hiho_4) == "sU" - - -def test_mora_label_features() -> None: - """MoraLabel に含まれる features をテスト""" - expects = test_case_hello_hiho - assert features(mora_hello_1) == expects[1:3] - assert features(mora_hello_2) == expects[3:4] - assert features(mora_hello_3) == expects[4:6] - assert features(mora_hello_4) == expects[6:8] - assert features(mora_hello_5) == expects[8:10] - assert features(mora_hiho_1) == expects[11:13] - assert features(mora_hiho_2) == expects[13:15] - assert features(mora_hiho_3) == expects[15:17] - assert features(mora_hiho_4) == expects[17:19] - - -# TODO: ValueErrorを吐く作為的ではない自然な例の模索 -# 存在しないなら放置でよい -accent_phrase_hello = AccentPhraseLabel.from_labels(labels_hello_hiho[1:10]) -accent_phrase_hiho = AccentPhraseLabel.from_labels(labels_hello_hiho[11:19]) - - -def test_accent_phrase_accent() -> None: - """AccentPhraseLabel に含まれるアクセント位置をテスト""" - assert accent_phrase_hello.accent == 5 - assert accent_phrase_hiho.accent == 1 - - -def test_accent_phrase_phonemes() -> None: - """AccentPhraseLabel に含まれる音素系列をテスト""" - outputs_hello = space_jointed_phonemes(accent_phrase_hello) - outputs_hiho = space_jointed_phonemes(accent_phrase_hiho) - assert outputs_hello == "k o N n i ch i w a" - assert outputs_hiho == "h i h o d e s U" - - -def test_accent_phrase_features() -> None: - """AccentPhraseLabel に含まれる features をテスト""" - expects = test_case_hello_hiho - assert features(accent_phrase_hello) == expects[1:10] - assert features(accent_phrase_hiho) == expects[11:19] - - -breath_group_hello = BreathGroupLabel.from_labels(labels_hello_hiho[1:10]) -breath_group_hiho = BreathGroupLabel.from_labels(labels_hello_hiho[11:19]) - - -def test_breath_group_phonemes() -> None: - """BreathGroupLabel に含まれる音素系列をテスト""" - outputs_hello = space_jointed_phonemes(breath_group_hello) - outputs_hiho = space_jointed_phonemes(breath_group_hiho) - assert outputs_hello == "k o N n i ch i w a" - assert outputs_hiho == "h i h o d e s U" - - -def test_breath_group_features() -> None: - """BreathGroupLabel に含まれる features をテスト""" - expects = test_case_hello_hiho - assert features(breath_group_hello) == expects[1:10] - assert features(breath_group_hiho) == expects[11:19] - - -utterance_hello_hiho = UtteranceLabel.from_labels(labels_hello_hiho) - - -def test_utterance_phonemes() -> None: - """UtteranceLabel に含まれる音素系列をテスト""" - outputs_hello_hiho = space_jointed_phonemes(utterance_hello_hiho) - expects_hello_hiho = "sil k o N n i ch i w a pau h i h o d e s U sil" - assert outputs_hello_hiho == expects_hello_hiho - - -def test_utterance_features() -> None: - """UtteranceLabel に含まれる features をテスト""" - assert features(utterance_hello_hiho) == test_case_hello_hiho - - -def test_voice() -> None: - assert mora_to_text("a") == "ア" - assert mora_to_text("i") == "イ" - assert mora_to_text("ka") == "カ" - assert mora_to_text("N") == "ン" - assert mora_to_text("cl") == "ッ" - assert mora_to_text("gye") == "ギェ" - assert mora_to_text("ye") == "イェ" - assert mora_to_text("wo") == "ウォ" - - -def test_unvoice() -> None: - assert mora_to_text("A") == "ア" - assert mora_to_text("I") == "イ" - assert mora_to_text("kA") == "カ" - assert mora_to_text("gyE") == "ギェ" - assert mora_to_text("yE") == "イェ" - assert mora_to_text("wO") == "ウォ" - - -def test_invalid_mora() -> None: - """変なモーラが来ても例外を投げない""" - assert mora_to_text("x") == "x" - assert mora_to_text("") == "" - - -def _gen_mora(text: str, consonant: str | None, vowel: str) -> Mora: - return Mora( - text=text, - consonant=consonant, - consonant_length=0 if consonant else None, - vowel=vowel, - vowel_length=0, - pitch=0, - ) - - -def test_text_to_accent_phrases_normal() -> None: - """`text_to_accent_phrases` は正常な日本語文をパースする""" - # Inputs - text = "こんにちは、ヒホです。" - # Expects - true_accent_phrases = [ - AccentPhrase( - moras=[ - _gen_mora("コ", "k", "o"), - _gen_mora("ン", None, "N"), - _gen_mora("ニ", "n", "i"), - _gen_mora("チ", "ch", "i"), - _gen_mora("ワ", "w", "a"), - ], - accent=5, - pause_mora=_gen_mora("、", None, "pau"), - ), - AccentPhrase( - moras=[ - _gen_mora("ヒ", "h", "i"), - _gen_mora("ホ", "h", "o"), - _gen_mora("デ", "d", "e"), - _gen_mora("ス", "s", "U"), - ], - accent=1, - pause_mora=None, - ), - ] - # Outputs - accent_phrases = text_to_accent_phrases(text) - # Tests - assert accent_phrases == true_accent_phrases - - -def stub_unknown_features_koxx(_: str) -> list[str]: - """`sil-k-o-xx-sil` に相当する features を常に返す `text_to_features()` のStub""" - return [ - ".^.-sil+.=./A:.+xx+./B:.-._./C:._.+./D:.+._./E:._.!._.-./F:xx_xx#xx_.@xx_.|._./G:._.%._._./H:._./I:.-.@xx+.&.-.|.+./J:._./K:.+.-.", - ".^.-k+.=./A:.+1+./B:.-._./C:._.+./D:.+._./E:._.!._.-./F:2_1#0_.@1_.|._./G:._.%._._./H:._./I:.-.@1+.&.-.|.+./J:._./K:.+.-.", - ".^.-o+.=./A:.+1+./B:.-._./C:._.+./D:.+._./E:._.!._.-./F:2_1#0_.@1_.|._./G:._.%._._./H:._./I:.-.@1+.&.-.|.+./J:._./K:.+.-.", - ".^.-xx+.=./A:.+2+./B:.-._./C:._.+./D:.+._./E:._.!._.-./F:2_1#0_.@1_.|._./G:._.%._._./H:._./I:.-.@1+.&.-.|.+./J:._./K:.+.-.", - ".^.-sil+.=./A:.+xx+./B:.-._./C:._.+./D:.+._./E:._.!._.-./F:xx_xx#xx_.@xx_.|._./G:._.%._._./H:._./I:.-.@xx+.&.-.|.+./J:._./K:.+.-.", - ] - - -def test_text_to_accent_phrases_unknown() -> None: - """`text_to_accent_phrases` は unknown 音素を含む features をパースする""" - # Expects - true_accent_phrases = [ - AccentPhrase( - moras=[ - _gen_mora("コ", "k", "o"), - _gen_mora("xx", None, "xx"), - ], - accent=1, - pause_mora=None, - ), - ] - # Outputs - accent_phrases = text_to_accent_phrases( - "dummy", text_to_features=stub_unknown_features_koxx - ) - # Tests - assert accent_phrases == true_accent_phrases diff --git a/voicevox_engine/test/unit/tts_pipeline/test_tts_engine.py b/voicevox_engine/test/unit/tts_pipeline/test_tts_engine.py deleted file mode 100644 index 19fdea272777fa7736e5659411777fe679d3e419..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/test_tts_engine.py +++ /dev/null @@ -1,663 +0,0 @@ -"""TTSEngine のテスト""" - -from test.utility import pydantic_to_native_type, round_floats, summarize_big_ndarray -from unittest.mock import MagicMock - -import numpy as np -import pytest -from syrupy.assertion import SnapshotAssertion - -from voicevox_engine.dev.core.mock import MockCoreWrapper -from voicevox_engine.metas.Metas import StyleId -from voicevox_engine.model import AudioQuery -from voicevox_engine.tts_pipeline.model import ( - AccentPhrase, - FrameAudioQuery, - Mora, - Note, - Score, -) -from voicevox_engine.tts_pipeline.text_analyzer import text_to_accent_phrases -from voicevox_engine.tts_pipeline.tts_engine import ( - TTSEngine, - _apply_interrogative_upspeak, - _to_flatten_phonemes, - to_flatten_moras, -) - -from .test_text_analyzer import stub_unknown_features_koxx -from .tts_utils import gen_mora, sec - - -def test_to_flatten_phonemes() -> None: - """Test `_to_flatten_phonemes()`.""" - # Inputs - moras = [ - gen_mora(" ", None, None, "sil", sec(2), 0.0), - gen_mora("ヒ", "h", sec(2), "i", sec(4), 5.0), - gen_mora(" ", None, None, "sil", sec(6), 0.0), - ] - # Expects - true_phoneme_strs = ["pau", "h", "i", "pau"] - # Outputs - phonemes = _to_flatten_phonemes(moras) - phoneme_strs = list(map(lambda p: p._phoneme, phonemes)) - - # Test - assert true_phoneme_strs == phoneme_strs - - -def _gen_hello_hiho_accent_phrases() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - gen_mora("コ", "k", 0.1, "o", 0.1, 5.0), - gen_mora("ン", None, None, "N", 0.1, 5.0), - gen_mora("ニ", "n", 0.1, "i", 0.1, 5.0), - gen_mora("チ", "ch", 0.1, "i", 0.1, 5.0), - gen_mora("ワ", "w", 0.1, "a", 0.1, 5.0), - ], - accent=5, - pause_mora=gen_mora("、", None, None, "pau", 0.1, 0.0), - ), - AccentPhrase( - moras=[ - gen_mora("ヒ", "h", 0.1, "i", 0.1, 0.0), - gen_mora("ホ", "h", 0.1, "o", 0.1, 5.0), - gen_mora("デ", "d", 0.1, "e", 0.1, 5.0), - gen_mora("ス", "s", 0.1, "U", 0.1, 0.0), - ], - accent=1, - pause_mora=None, - ), - ] - - -def _gen_hello_hiho_query() -> AudioQuery: - return AudioQuery( - accent_phrases=_gen_hello_hiho_accent_phrases(), - speedScale=2.0, - pitchScale=1.1, - intonationScale=0.9, - volumeScale=1.3, - prePhonemeLength=0.1, - postPhonemeLength=0.2, - pauseLength=0.3, - pauseLengthScale=0.8, - outputSamplingRate=12000, - outputStereo=True, - kana="コンニチワ'、ヒ'ホデ_ス", - ) - - -def _gen_doremi_score() -> Score: - return Score( - notes=[ - Note(key=None, frame_length=10, lyric=""), - Note(key=60, frame_length=12, lyric="ど"), - Note(key=62, frame_length=17, lyric="れ"), - Note(key=64, frame_length=21, lyric="み"), - Note(key=None, frame_length=5, lyric=""), - Note(key=65, frame_length=12, lyric="ふぁ"), - Note(key=67, frame_length=17, lyric="そ"), - Note(key=None, frame_length=10, lyric=""), - ] - ) - - -def test_to_flatten_moras() -> None: - flatten_moras = to_flatten_moras(_gen_hello_hiho_accent_phrases()) - true_accent_phrases_hello_hiho = _gen_hello_hiho_accent_phrases() - assert ( - flatten_moras - == true_accent_phrases_hello_hiho[0].moras - + [true_accent_phrases_hello_hiho[0].pause_mora] - + true_accent_phrases_hello_hiho[1].moras - ) - - -def test_update_length() -> None: - core = MockCoreWrapper() - core.yukarin_s_forward = MagicMock(wraps=core.yukarin_s_forward) # type: ignore[method-assign] - _yukarin_s_mock = core.yukarin_s_forward - tts_engine = TTSEngine(core=core) - # Inputs - hello_hiho = _gen_hello_hiho_accent_phrases() - # Indirect Outputs(yukarin_sに渡される値) - tts_engine.update_length(hello_hiho, StyleId(1)) - yukarin_s_args = _yukarin_s_mock.call_args[1] - list_length = yukarin_s_args["length"] - phoneme_list = yukarin_s_args["phoneme_list"] - style_id = yukarin_s_args["style_id"] - # Expects - true_list_length = 20 - true_style_id = 1 - true_phoneme_list_1 = [0, 23, 30, 4, 28, 21, 10, 21, 42, 7] - true_phoneme_list_2 = [0, 19, 21, 19, 30, 12, 14, 35, 6, 0] - true_phoneme_list = true_phoneme_list_1 + true_phoneme_list_2 - - assert list_length == true_list_length - assert list_length == len(phoneme_list) - assert style_id == true_style_id - np.testing.assert_array_equal( - phoneme_list, - np.array(true_phoneme_list, dtype=np.int64), - ) - - -def test_update_pitch() -> None: - core = MockCoreWrapper() - core.yukarin_sa_forward = MagicMock(wraps=core.yukarin_sa_forward) # type: ignore[method-assign] - _yukarin_sa_mock = core.yukarin_sa_forward - tts_engine = TTSEngine(core=core) - - # 空のリストでエラーを吐かないか - # Inputs - phrases: list = [] - # Outputs - result = tts_engine.update_pitch(phrases, StyleId(1)) - # Expects - true_result: list = [] - # Tests - assert result == true_result - - # Inputs - hello_hiho = _gen_hello_hiho_accent_phrases() - # Indirect Outputs(yukarin_saに渡される値) - tts_engine.update_pitch(hello_hiho, StyleId(1)) - yukarin_sa_args = _yukarin_sa_mock.call_args[1] - list_length = yukarin_sa_args["length"] - vowel_phoneme_list = yukarin_sa_args["vowel_phoneme_list"][0] - consonant_phoneme_list = yukarin_sa_args["consonant_phoneme_list"][0] - start_accent_list = yukarin_sa_args["start_accent_list"][0] - end_accent_list = yukarin_sa_args["end_accent_list"][0] - start_accent_phrase_list = yukarin_sa_args["start_accent_phrase_list"][0] - end_accent_phrase_list = yukarin_sa_args["end_accent_phrase_list"][0] - style_id = yukarin_sa_args["style_id"] - # Expects - true_vowels = np.array([0, 30, 4, 21, 21, 7, 0, 21, 30, 14, 6, 0]) - true_consonants = np.array([-1, 23, -1, 28, 10, 42, -1, 19, 19, 12, 35, -1]) - true_accent_starts = np.array([0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0]) - true_accent_ends = np.array([0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0]) - true_phrase_starts = np.array([0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]) - true_phrase_ends = np.array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]) - - # Tests - assert list_length == 12 - assert list_length == len(vowel_phoneme_list) - assert list_length == len(consonant_phoneme_list) - assert list_length == len(start_accent_list) - assert list_length == len(end_accent_list) - assert list_length == len(start_accent_phrase_list) - assert list_length == len(end_accent_phrase_list) - assert style_id == 1 - np.testing.assert_array_equal(vowel_phoneme_list, true_vowels) - np.testing.assert_array_equal(consonant_phoneme_list, true_consonants) - np.testing.assert_array_equal(start_accent_list, true_accent_starts) - np.testing.assert_array_equal(end_accent_list, true_accent_ends) - np.testing.assert_array_equal(start_accent_phrase_list, true_phrase_starts) - np.testing.assert_array_equal(end_accent_phrase_list, true_phrase_ends) - - -def test_create_accent_phrases_toward_unknown() -> None: - """`TTSEngine.create_accent_phrases()` は unknown 音素の Phoneme 化に失敗する""" - engine = TTSEngine(MockCoreWrapper()) - - # NOTE: TTSEngine.create_accent_phrases() のコールで unknown feature を得ることが難しいため、疑似再現 - accent_phrases = text_to_accent_phrases( - "dummy", text_to_features=stub_unknown_features_koxx - ) - with pytest.raises(ValueError) as e: - accent_phrases = engine.update_length_and_pitch(accent_phrases, StyleId(0)) - assert str(e.value) == "tuple.index(x): x not in tuple" - - -def test_mocked_update_length_output(snapshot_json: SnapshotAssertion) -> None: - """モックされた `TTSEngine.update_length()` の出力スナップショットが一定である""" - # Inputs - tts_engine = TTSEngine(MockCoreWrapper()) - hello_hiho = _gen_hello_hiho_accent_phrases() - # Outputs - result = tts_engine.update_length(hello_hiho, StyleId(1)) - # Tests - assert snapshot_json == round_floats(pydantic_to_native_type(result), round_value=2) - - -def test_mocked_update_pitch_output(snapshot_json: SnapshotAssertion) -> None: - """モックされた `TTSEngine.update_pitch()` の出力スナップショットが一定である""" - # Inputs - tts_engine = TTSEngine(MockCoreWrapper()) - hello_hiho = _gen_hello_hiho_accent_phrases() - # Outputs - result = tts_engine.update_pitch(hello_hiho, StyleId(1)) - # Tests - assert snapshot_json == round_floats(pydantic_to_native_type(result), round_value=2) - - -def test_mocked_update_length_and_pitch_output( - snapshot_json: SnapshotAssertion, -) -> None: - """モックされた `TTSEngine.update_length_and_pitch()` の出力スナップショットが一定である""" - # Inputs - tts_engine = TTSEngine(MockCoreWrapper()) - hello_hiho = _gen_hello_hiho_accent_phrases() - # Outputs - result = tts_engine.update_length_and_pitch(hello_hiho, StyleId(1)) - # Tests - assert snapshot_json == round_floats(pydantic_to_native_type(result), round_value=2) - - -def test_mocked_create_accent_phrases_output( - snapshot_json: SnapshotAssertion, -) -> None: - """モックされた `TTSEngine.create_accent_phrases()` の出力スナップショットが一定である""" - # Inputs - tts_engine = TTSEngine(MockCoreWrapper()) - hello_hiho = "こんにちは、ヒホです" - # Outputs - result = tts_engine.create_accent_phrases(hello_hiho, StyleId(1)) - # Tests - assert snapshot_json == round_floats(pydantic_to_native_type(result), round_value=2) - - -def test_mocked_create_accent_phrases_from_kana_output( - snapshot_json: SnapshotAssertion, -) -> None: - """モックされた `TTSEngine.create_accent_phrases_from_kana()` の出力スナップショットが一定である""" - # Inputs - tts_engine = TTSEngine(MockCoreWrapper()) - hello_hiho = "コンニチワ'、ヒ'ホデ_ス" - # Outputs - result = tts_engine.create_accent_phrases_from_kana(hello_hiho, StyleId(1)) - # Tests - assert snapshot_json == round_floats(pydantic_to_native_type(result), round_value=2) - - -def test_mocked_synthesize_wave_output(snapshot_json: SnapshotAssertion) -> None: - """モックされた `TTSEngine.synthesize_wave()` の出力スナップショットが一定である""" - # Inputs - tts_engine = TTSEngine(MockCoreWrapper()) - hello_hiho = _gen_hello_hiho_query() - # Outputs - result = tts_engine.synthesize_wave(hello_hiho, StyleId(1)) - # Tests - assert snapshot_json == summarize_big_ndarray(round_floats(result, round_value=2)) - - -def test_mocked_create_sing_volume_from_phoneme_and_f0_output( - snapshot_json: SnapshotAssertion, -) -> None: - """ - モックされた `TTSEngine.create_sing_phoneme_and_f0_and_volume()` の出力スナップショットが一定である - NOTE: 入力生成の簡略化に別関数を呼び出すため、別関数が正しく動作しない場合テストが落ちる - """ - # Inputs - tts_engine = TTSEngine(MockCoreWrapper()) - doremi_srore = _gen_doremi_score() - phonemes, f0s, _ = tts_engine.create_sing_phoneme_and_f0_and_volume( - doremi_srore, StyleId(1) - ) - # Outputs - result = tts_engine.create_sing_volume_from_phoneme_and_f0( - doremi_srore, phonemes, f0s, StyleId(1) - ) - # Tests - assert snapshot_json == round_floats(result, round_value=2) - - -def test_mocked_synthesize_wave_from_score_output( - snapshot_json: SnapshotAssertion, -) -> None: - """ - モックされた `TTSEngine.create_sing_phoneme_and_f0_and_volume()` と - `TTSEngine.frame_synthsize_wave()` の出力スナップショットが一定である - """ - # Inputs - tts_engine = TTSEngine(MockCoreWrapper()) - doremi_srore = _gen_doremi_score() - # Outputs - result = tts_engine.create_sing_phoneme_and_f0_and_volume(doremi_srore, StyleId(1)) - # Tests - assert snapshot_json(name="query") == round_floats( - pydantic_to_native_type(result), round_value=2 - ) - - # Inputs - phonemes, f0, volume = result - doremi_query = FrameAudioQuery( - f0=f0, - volume=volume, - phonemes=phonemes, - volumeScale=1.3, - outputSamplingRate=1200, - outputStereo=False, - ) - # Outputs - result_wave = tts_engine.frame_synthsize_wave(doremi_query, StyleId(1)) - # Tests - assert snapshot_json(name="wave") == round_floats( - result_wave.tolist(), round_value=2 - ) - - -def koreha_arimasuka_base_expected() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="コ", - consonant="k", - consonant_length=np.float32(2.44), - vowel="o", - vowel_length=np.float32(2.88), - pitch=np.float32(4.38), - ), - Mora( - text="レ", - consonant="r", - consonant_length=np.float32(3.06), - vowel="e", - vowel_length=np.float32(1.88), - pitch=np.float32(4.0), - ), - Mora( - text="ワ", - consonant="w", - consonant_length=np.float32(3.62), - vowel="a", - vowel_length=np.float32(1.44), - pitch=np.float32(4.19), - ), - ], - accent=3, - pause_mora=None, - is_interrogative=False, - ), - AccentPhrase( - moras=[ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=np.float32(1.44), - pitch=np.float32(1.44), - ), - Mora( - text="リ", - consonant="r", - consonant_length=np.float32(3.06), - vowel="i", - vowel_length=np.float32(2.31), - pitch=np.float32(4.44), - ), - Mora( - text="マ", - consonant="m", - consonant_length=np.float32(2.62), - vowel="a", - vowel_length=np.float32(1.44), - pitch=np.float32(3.12), - ), - Mora( - text="ス", - consonant="s", - consonant_length=np.float32(3.19), - vowel="U", - vowel_length=np.float32(1.38), - pitch=np.float32(0.0), - ), - Mora( - text="カ", - consonant="k", - consonant_length=np.float32(2.44), - vowel="a", - vowel_length=np.float32(1.44), - pitch=np.float32(2.94), - ), - ], - accent=3, - pause_mora=None, - is_interrogative=False, - ), - ] - - -def create_synthesis_test_base(text: str) -> list[AccentPhrase]: - tts_engine = TTSEngine(core=MockCoreWrapper()) - return tts_engine.create_accent_phrases(text, StyleId(1)) - - -def test_create_accent_phrases() -> None: - """accent_phrasesの作成時では疑問文モーラ処理を行わない - (https://github.com/VOICEVOX/voicevox_engine/issues/272#issuecomment-1022610866) - """ - tts_engine = TTSEngine(core=MockCoreWrapper()) - text = "これはありますか?" - expected = koreha_arimasuka_base_expected() - expected[-1].is_interrogative = True - actual = tts_engine.create_accent_phrases(text, StyleId(1)) - assert expected == actual, f"case(text:{text})" - - -def test_upspeak_voiced_last_mora() -> None: - # voiced + "?" + flagON -> upspeak - # Inputs - inputs = create_synthesis_test_base(text="これはありますか?") - # Expects - expected = koreha_arimasuka_base_expected() - expected[-1].is_interrogative = True - expected[-1].moras += [ - Mora( - text="ア", - consonant=None, - consonant_length=None, - vowel="a", - vowel_length=0.15, - pitch=np.float32(expected[-1].moras[-1].pitch) + 0.3, - ) - ] - # Outputs - outputs = _apply_interrogative_upspeak(inputs, True) - # Test - assert expected == outputs - - # voiced + "?" + flagOFF -> non-upspeak - # Inputs - inputs = create_synthesis_test_base(text="これはありますか?") - # Expects - expected = koreha_arimasuka_base_expected() - expected[-1].is_interrogative = True - # Outputs - outputs = _apply_interrogative_upspeak(inputs, False) - # Test - assert expected == outputs - - # voiced + "" + flagON -> non-upspeak - # Inputs - inputs = create_synthesis_test_base(text="これはありますか") - # Expects - expected = koreha_arimasuka_base_expected() - # Outputs - outputs = _apply_interrogative_upspeak(inputs, True) - # Test - assert expected == outputs - - -def test_upspeak_voiced_N_last_mora() -> None: - def nn_base_expected() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ン", - consonant=None, - consonant_length=None, - vowel="N", - vowel_length=np.float32(1.25), - pitch=np.float32(1.44), - ) - ], - accent=1, - pause_mora=None, - is_interrogative=False, - ) - ] - - # voiced + "" + flagON -> upspeak - # Inputs - inputs = create_synthesis_test_base(text="ん") - # Expects - expected = nn_base_expected() - # Outputs - outputs = _apply_interrogative_upspeak(inputs, True) - # Test - assert expected == outputs - - # voiced + "?" + flagON -> upspeak - # Inputs - inputs = create_synthesis_test_base(text="ん?") - # Expects - expected = nn_base_expected() - expected[-1].is_interrogative = True - expected[-1].moras += [ - Mora( - text="ン", - consonant=None, - consonant_length=None, - vowel="N", - vowel_length=0.15, - pitch=np.float32(expected[-1].moras[-1].pitch) + 0.3, - ) - ] - # Outputs - outputs = _apply_interrogative_upspeak(inputs, True) - # Test - assert expected == outputs - - # voiced + "?" + flagOFF -> non-upspeak - # Inputs - inputs = create_synthesis_test_base(text="ん?") - # Expects - expected = nn_base_expected() - expected[-1].is_interrogative = True - # Outputs - outputs = _apply_interrogative_upspeak(inputs, False) - # Test - assert expected == outputs - - -def test_upspeak_unvoiced_last_mora() -> None: - def ltu_base_expected() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ッ", - consonant=None, - consonant_length=None, - vowel="cl", - vowel_length=np.float32(1.69), - pitch=np.float32(0.0), - ) - ], - accent=1, - pause_mora=None, - is_interrogative=False, - ) - ] - - # unvoiced + "" + flagON -> non-upspeak - # Inputs - inputs = create_synthesis_test_base(text="っ") - # Expects - expected = ltu_base_expected() - # Outputs - outputs = _apply_interrogative_upspeak(inputs, True) - # Test - assert expected == outputs - - # unvoiced + "?" + flagON -> non-upspeak - # Inputs - inputs = create_synthesis_test_base(text="っ?") - # Expects - expected = ltu_base_expected() - expected[-1].is_interrogative = True - # Outputs - outputs = _apply_interrogative_upspeak(inputs, True) - # Test - assert expected == outputs - - # unvoiced + "?" + flagOFF -> non-upspeak - # Inputs - inputs = create_synthesis_test_base(text="っ?") - # Expects - expected = ltu_base_expected() - expected[-1].is_interrogative = True - # Outputs - outputs = _apply_interrogative_upspeak(inputs, False) - # Test - assert expected == outputs - - -def test_upspeak_voiced_u_last_mora() -> None: - def su_base_expected() -> list[AccentPhrase]: - return [ - AccentPhrase( - moras=[ - Mora( - text="ス", - consonant="s", - consonant_length=np.float32(3.19), - vowel="u", - vowel_length=np.float32(3.5), - pitch=np.float32(5.94), - ) - ], - accent=1, - pause_mora=None, - is_interrogative=False, - ) - ] - - # voiced + "" + flagON -> non-upspeak - # Inputs - inputs = create_synthesis_test_base(text="す") - # Expects - expected = su_base_expected() - # Outputs - outputs = _apply_interrogative_upspeak(inputs, True) - # Test - assert expected == outputs - - # voiced + "?" + flagON -> upspeak - # Inputs - inputs = create_synthesis_test_base(text="す?") - # Expects - expected = su_base_expected() - expected[-1].is_interrogative = True - expected[-1].moras += [ - Mora( - text="ウ", - consonant=None, - consonant_length=None, - vowel="u", - vowel_length=0.15, - pitch=expected[-1].moras[-1].pitch + 0.3, - ) - ] - # Outputs - outputs = _apply_interrogative_upspeak(inputs, True) - # Test - assert expected == outputs - - # voiced + "?" + flagOFF -> non-upspeak - # Inputs - inputs = create_synthesis_test_base(text="す?") - # Expects - expected = su_base_expected() - expected[-1].is_interrogative = True - # Outputs - outputs = _apply_interrogative_upspeak(inputs, False) - # Test - assert expected == outputs diff --git a/voicevox_engine/test/unit/tts_pipeline/test_tts_engines.py b/voicevox_engine/test/unit/tts_pipeline/test_tts_engines.py deleted file mode 100644 index 3c82a0fe9ab6c5f1ac94d1ec1be48856af364434..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/test_tts_engines.py +++ /dev/null @@ -1,81 +0,0 @@ -""" `TTSEngineManager` クラスのテスト""" - -import pytest -from fastapi import HTTPException - -from voicevox_engine.dev.tts_engine.mock import MockTTSEngine -from voicevox_engine.tts_pipeline.tts_engine import LATEST_VERSION, TTSEngineManager - - -def test_tts_engines_register_engine() -> None: - """TTSEngineManager.register_engine() で TTS エンジンを登録できる。""" - # Inputs - tts_engines = TTSEngineManager() - - # Test - tts_engines.register_engine(MockTTSEngine(), "0.0.1") - - -def test_tts_engines_versions() -> None: - """TTSEngineManager.versions() でバージョン一覧を取得できる。""" - # Inputs - tts_engines = TTSEngineManager() - tts_engines.register_engine(MockTTSEngine(), "0.0.1") - tts_engines.register_engine(MockTTSEngine(), "0.0.2") - # Expects - true_versions = ["0.0.1", "0.0.2"] - # Outputs - versions = tts_engines.versions() - - # Test - assert true_versions == versions - - -def test_tts_engines_get_engine_existing() -> None: - """TTSEngineManager.get_engine() で登録済み TTS エンジンを取得できる。""" - # Inputs - tts_engines = TTSEngineManager() - tts_engine1 = MockTTSEngine() - tts_engine2 = MockTTSEngine() - tts_engines.register_engine(tts_engine1, "0.0.1") - tts_engines.register_engine(tts_engine2, "0.0.2") - # Expects - true_acquired_tts_engine = tts_engine2 - # Outputs - acquired_tts_engine = tts_engines.get_engine("0.0.2") - - # Test - assert true_acquired_tts_engine == acquired_tts_engine - - -def test_tts_engines_get_engine_latest() -> None: - """TTSEngineManager.get_engine(LATEST_VERSION) で最新版の TTS エンジンを取得できる。""" - # Inputs - tts_engines = TTSEngineManager() - tts_engine1 = MockTTSEngine() - tts_engine2 = MockTTSEngine() - tts_engine3 = MockTTSEngine() - tts_engines.register_engine(tts_engine1, "0.0.1") - tts_engines.register_engine(tts_engine2, "0.0.2") - tts_engines.register_engine(tts_engine3, "0.1.0") - # Expects - true_acquired_tts_engine = tts_engine3 - # Outputs - acquired_tts_engine = tts_engines.get_engine(LATEST_VERSION) - - # Test - assert true_acquired_tts_engine == acquired_tts_engine - - -def test_tts_engines_get_engine_missing() -> None: - """TTSEngineManager.get_engine() で存在しない TTS エンジンを取得しようとするとエラーになる。""" - # Inputs - tts_engines = TTSEngineManager() - tts_engine1 = MockTTSEngine() - tts_engine2 = MockTTSEngine() - tts_engines.register_engine(tts_engine1, "0.0.1") - tts_engines.register_engine(tts_engine2, "0.0.2") - - # Test - with pytest.raises(HTTPException) as _: - tts_engines.get_engine("0.0.3") diff --git a/voicevox_engine/test/unit/tts_pipeline/test_wave_synthesizer.py b/voicevox_engine/test/unit/tts_pipeline/test_wave_synthesizer.py deleted file mode 100644 index aca333936dfd5783b528ac70af263724a4cc4a64..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/test_wave_synthesizer.py +++ /dev/null @@ -1,317 +0,0 @@ -"""波形合成のテスト""" - -import numpy as np - -from voicevox_engine.model import AudioQuery -from voicevox_engine.tts_pipeline.model import AccentPhrase -from voicevox_engine.tts_pipeline.tts_engine import ( - _apply_intonation_scale, - _apply_output_sampling_rate, - _apply_output_stereo, - _apply_pitch_scale, - _apply_prepost_silence, - _apply_speed_scale, - _apply_volume_scale, - _count_frame_per_unit, - _query_to_decoder_feature, - raw_wave_to_output_wave, -) - -from .tts_utils import gen_mora, sec - -TRUE_NUM_PHONEME = 45 - - -def _gen_query( - accent_phrases: list[AccentPhrase] | None = None, - speedScale: float = 1.0, - pitchScale: float = 1.0, - intonationScale: float = 1.0, - prePhonemeLength: float = 0.0, - postPhonemeLength: float = 0.0, - pauseLength: float | None = None, - pauseLengthScale: float = 1.0, - volumeScale: float = 1.0, - outputSamplingRate: int = 24000, - outputStereo: bool = False, -) -> AudioQuery: - """Generate AudioQuery with default meaningless arguments for test simplicity.""" - accent_phrases = [] if accent_phrases is None else accent_phrases - return AudioQuery( - accent_phrases=accent_phrases, - speedScale=speedScale, - pitchScale=pitchScale, - intonationScale=intonationScale, - prePhonemeLength=prePhonemeLength, - postPhonemeLength=postPhonemeLength, - pauseLength=pauseLength, - pauseLengthScale=pauseLengthScale, - volumeScale=volumeScale, - outputSamplingRate=outputSamplingRate, - outputStereo=outputStereo, - ) - - -def test_apply_prepost_silence() -> None: - """Test `_apply_prepost_silence()`.""" - # Inputs - query = _gen_query(prePhonemeLength=sec(2), postPhonemeLength=sec(6)) - moras = [ - gen_mora("ヒ", "h", sec(2), "i", sec(4), 5.0), - ] - # Expects - true_moras_with_silence = [ - gen_mora(" ", None, None, "sil", sec(2), 0.0), - gen_mora("ヒ", "h", sec(2), "i", sec(4), 5.0), - gen_mora(" ", None, None, "sil", sec(6), 0.0), - ] - # Outputs - moras_with_silence = _apply_prepost_silence(moras, query) - - # Test - assert moras_with_silence == true_moras_with_silence - - -def test_apply_speed_scale() -> None: - """Test `_apply_speed_scale()`.""" - # Inputs - query = _gen_query(speedScale=2.0) - input_moras = [ - gen_mora("コ", "k", sec(2), "o", sec(4), 5.0), - gen_mora("ン", None, None, "N", sec(4), 5.0), - gen_mora("、", None, None, "pau", sec(2), 0.0), - gen_mora("ヒ", "h", sec(2), "i", sec(4), 6.0), - gen_mora("ホ", "h", sec(4), "O", sec(2), 0.0), - ] - # Expects - x2 fast - true_moras = [ - gen_mora("コ", "k", sec(1), "o", sec(2), 5.0), - gen_mora("ン", None, None, "N", sec(2), 5.0), - gen_mora("、", None, None, "pau", sec(1), 0.0), - gen_mora("ヒ", "h", sec(1), "i", sec(2), 6.0), - gen_mora("ホ", "h", sec(2), "O", sec(1), 0.0), - ] - # Outputs - moras = _apply_speed_scale(input_moras, query) - - # Test - assert moras == true_moras - - -def test_apply_pitch_scale() -> None: - """Test `_apply_pitch_scale()`.""" - # Inputs - query = _gen_query(pitchScale=2.0) - input_moras = [ - gen_mora("コ", "k", 0.0, "o", 0.0, 5.0), - gen_mora("ン", None, None, "N", 0.0, 5.0), - gen_mora("、", None, None, "pau", 0.0, 0.0), - gen_mora("ヒ", "h", 0.0, "i", 0.0, 6.0), - gen_mora("ホ", "h", 0.0, "O", 0.0, 0.0), - ] - # Expects - x4 value scaled - true_moras = [ - gen_mora("コ", "k", 0.0, "o", 0.0, 20.0), - gen_mora("ン", None, None, "N", 0.0, 20.0), - gen_mora("、", None, None, "pau", 0.0, 0.0), - gen_mora("ヒ", "h", 0.0, "i", 0.0, 24.0), - gen_mora("ホ", "h", 0.0, "O", 0.0, 0.0), - ] - # Outputs - moras = _apply_pitch_scale(input_moras, query) - - # Test - assert moras == true_moras - - -def test_apply_intonation_scale() -> None: - """Test `_apply_intonation_scale()`.""" - # Inputs - query = _gen_query(intonationScale=0.5) - input_moras = [ - gen_mora("コ", "k", 0.0, "o", 0.0, 5.0), - gen_mora("ン", None, None, "N", 0.0, 5.0), - gen_mora("、", None, None, "pau", 0.0, 0.0), - gen_mora("ヒ", "h", 0.0, "i", 0.0, 8.0), - gen_mora("ホ", "h", 0.0, "O", 0.0, 0.0), - ] - # Expects - mean=6 var x0.5 intonation scaling - true_moras = [ - gen_mora("コ", "k", 0.0, "o", 0.0, 5.5), - gen_mora("ン", None, None, "N", 0.0, 5.5), - gen_mora("、", None, None, "pau", 0.0, 0.0), - gen_mora("ヒ", "h", 0.0, "i", 0.0, 7.0), - gen_mora("ホ", "h", 0.0, "O", 0.0, 0.0), - ] - # Outputs - moras = _apply_intonation_scale(input_moras, query) - - # Test - assert moras == true_moras - - -def test_apply_volume_scale() -> None: - """Test `_apply_volume_scale()`.""" - # Inputs - query = _gen_query(volumeScale=3.0) - input_wave = np.array([0.0, 1.0, 2.0]) - # Expects - x3 scale - true_wave = np.array([0.0, 3.0, 6.0]) - # Outputs - wave = _apply_volume_scale(input_wave, query) - - # Test - assert np.allclose(wave, true_wave) - - -def test_apply_output_sampling_rate() -> None: - """Test `_apply_output_sampling_rate()`.""" - # Inputs - query = _gen_query(outputSamplingRate=12000) - input_wave = np.array([1.0 for _ in range(120)]) - input_sr_wave = 24000 - # Expects - half sampling rate - true_wave = np.array([1.0 for _ in range(60)]) - assert true_wave.shape == (60,), "Prerequisites" - # Outputs - wave = _apply_output_sampling_rate(input_wave, input_sr_wave, query) - - # Test - assert wave.shape[0] == true_wave.shape[0] - - -def test_apply_output_stereo() -> None: - """Test `_apply_output_stereo()`.""" - # Inputs - query = _gen_query(outputStereo=True) - input_wave = np.array([1.0, 0.0, 2.0]) - # Expects - Stereo :: (Time, Channel) - true_wave = np.array([[1.0, 1.0], [0.0, 0.0], [2.0, 2.0]]) - # Outputs - wave = _apply_output_stereo(input_wave, query) - - # Test - assert np.array_equal(wave, true_wave) - - -def test_count_frame_per_unit() -> None: - """Test `_count_frame_per_unit()`.""" - # Inputs - moras = [ - gen_mora(" ", None, None, " ", sec(2), 0.0), - gen_mora("コ", "k", sec(2), "o", sec(4), 0.0), - gen_mora("ン", None, None, "N", sec(4), 0.0), - gen_mora("、", None, None, "pau", sec(2), 0.0), - gen_mora("ヒ", "h", sec(2), "i", sec(4), 0.0), - gen_mora("ホ", "h", sec(4), "O", sec(2), 0.0), - gen_mora(" ", None, None, " ", sec(6), 0.0), - ] - - # Expects - # Pre k o N pau h i h O Pst - true_frame_per_phoneme_list = [2, 2, 4, 4, 2, 2, 4, 4, 2, 6] - true_frame_per_phoneme = np.array(true_frame_per_phoneme_list, dtype=np.int32) - # Pre ko N pau hi hO Pst - true_frame_per_mora_list = [2, 6, 4, 2, 6, 6, 6] - true_frame_per_mora = np.array(true_frame_per_mora_list, dtype=np.int32) - - # Outputs - frame_per_phoneme, frame_per_mora = _count_frame_per_unit(moras) - - # Test - assert np.array_equal(frame_per_phoneme, true_frame_per_phoneme) - assert np.array_equal(frame_per_mora, true_frame_per_mora) - - -def test_query_to_decoder_feature() -> None: - """Test `_query_to_decoder_feature()`.""" - # Inputs - accent_phrases = [ - AccentPhrase( - moras=[ - gen_mora("コ", "k", sec(2), "o", sec(4), 5.0), - gen_mora("ン", None, None, "N", sec(4), 5.0), - ], - accent=1, - pause_mora=gen_mora("、", None, None, "pau", sec(2), 0.0), - ), - AccentPhrase( - moras=[ - gen_mora("ヒ", "h", sec(2), "i", sec(4), 8.0), - gen_mora("ホ", "h", sec(4), "O", sec(2), 0.0), - ], - accent=1, - pause_mora=None, - ), - ] - query = _gen_query( - accent_phrases=accent_phrases, - speedScale=2.0, - pitchScale=2.0, - intonationScale=0.5, - prePhonemeLength=sec(2), - postPhonemeLength=sec(6), - pauseLength=sec(16), - pauseLengthScale=0.25, - ) - - # Expects - # frame_per_phoneme - # Pre k o N pau h i h O Pst - true_frame_per_phoneme = [1, 1, 2, 2, 2, 1, 2, 2, 1, 3] - n_frame = sum(true_frame_per_phoneme) - # phoneme - # Pr k o o N N pau pau h i i h h O Pt Pt Pt - frame_phoneme_idxs = [0, 23, 30, 30, 4, 4, 0, 0, 19, 21, 21, 19, 19, 5, 0, 0, 0] - true_phoneme = np.zeros([n_frame, TRUE_NUM_PHONEME], dtype=np.float32) - for frame_idx, phoneme_idx in enumerate(frame_phoneme_idxs): - true_phoneme[frame_idx, phoneme_idx] = 1.0 - # Pitch - # paw ko N pau hi hO paw - # frame_per_vowel = [1, 3, 2, 1, 3, 3, 3] - # pau ko ko ko N N - true1_f0 = [0.0, 22.0, 22.0, 22.0, 22.0, 22.0] - # pau pau hi hi hi - true2_f0 = [0.0, 0.0, 28.0, 28.0, 28.0] - # hO hO hO paw paw paw - true3_f0 = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - true_f0 = np.array(true1_f0 + true2_f0 + true3_f0, dtype=np.float32) - - # Outputs - phoneme, f0 = _query_to_decoder_feature(query) - - # Test - assert np.array_equal(phoneme, true_phoneme) - assert np.array_equal(f0, true_f0) - - -def test_raw_wave_to_output_wave_with_resample() -> None: - """Test `raw_wave_to_output_wave` with resampling option.""" - # Inputs - query = _gen_query(volumeScale=2, outputSamplingRate=48000, outputStereo=True) - raw_wave = np.random.rand(240).astype(np.float32) - sr_raw_wave = 24000 - - # Expects - true_wave_shape = (480, 2) - - # Outputs - wave = raw_wave_to_output_wave(query, raw_wave, sr_raw_wave) - - assert wave.shape == true_wave_shape - - -def test_raw_wave_to_output_wave_without_resample() -> None: - """Test `raw_wave_to_output_wave` without resampling option.""" - # Inputs - query = _gen_query(volumeScale=2, outputStereo=True) - raw_wave = np.random.rand(240).astype(np.float32) - sr_raw_wave = 24000 - - # Expects - true_wave = np.array([2 * raw_wave, 2 * raw_wave]).T - - # Outputs - wave = raw_wave_to_output_wave(query, raw_wave, sr_raw_wave) - - assert np.allclose(wave, true_wave) diff --git a/voicevox_engine/test/unit/tts_pipeline/tts_utils.py b/voicevox_engine/test/unit/tts_pipeline/tts_utils.py deleted file mode 100644 index dc58ae00411eda08c1fcf634f5b0d4604c324a31..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/tts_pipeline/tts_utils.py +++ /dev/null @@ -1,27 +0,0 @@ -"""合成系テスト向けの utility""" - -from voicevox_engine.tts_pipeline.model import Mora - - -def sec(frame: int) -> float: - """フレーム数に相当する秒数を返す。""" - return 0.01067 * frame # 1 フレームが約 10.67 ミリ秒 - - -def gen_mora( - text: str, - consonant: str | None, - consonant_length: float | None, - vowel: str, - vowel_length: float, - pitch: float, -) -> Mora: - """Generate Mora with positional arguments for test simplicity.""" - return Mora( - text=text, - consonant=consonant, - consonant_length=consonant_length, - vowel=vowel, - vowel_length=vowel_length, - pitch=pitch, - ) diff --git a/voicevox_engine/test/unit/user_dict/test_user_dict.py b/voicevox_engine/test/unit/user_dict/test_user_dict.py deleted file mode 100644 index 8515eb66f7f4c066f2231c656a2291fb73be5f50..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/user_dict/test_user_dict.py +++ /dev/null @@ -1,327 +0,0 @@ -import json -from copy import deepcopy -from pathlib import Path - -import pytest -from pyopenjtalk import g2p, unset_user_dict - -from voicevox_engine.user_dict.model import UserDictWord, WordTypes -from voicevox_engine.user_dict.user_dict_manager import UserDictionary -from voicevox_engine.user_dict.user_dict_word import ( - USER_DICT_MAX_PRIORITY, - UserDictInputError, - WordProperty, - create_word, - part_of_speech_data, -) - -# jsonとして保存される正しい形式の辞書データ -valid_dict_dict_json = { - "aab7dda2-0d97-43c8-8cb7-3f440dab9b4e": { - "surface": "test", - "cost": part_of_speech_data[WordTypes.PROPER_NOUN].cost_candidates[5], - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "inflectional_type": "*", - "inflectional_form": "*", - "stem": "*", - "yomi": "テスト", - "pronunciation": "テスト", - "accent_type": 1, - "accent_associative_rule": "*", - }, -} - -# APIでやり取りされる正しい形式の辞書データ -valid_dict_dict_api = deepcopy(valid_dict_dict_json) -del valid_dict_dict_api["aab7dda2-0d97-43c8-8cb7-3f440dab9b4e"]["cost"] -valid_dict_dict_api["aab7dda2-0d97-43c8-8cb7-3f440dab9b4e"]["priority"] = 5 - -import_word = UserDictWord( - surface="test2", - priority=5, - part_of_speech="名詞", - part_of_speech_detail_1="固有名詞", - part_of_speech_detail_2="一般", - part_of_speech_detail_3="*", - inflectional_type="*", - inflectional_form="*", - stem="*", - yomi="テストツー", - pronunciation="テストツー", - accent_type=1, - mora_count=None, - accent_associative_rule="*", -) - - -def get_new_word(user_dict: dict[str, UserDictWord]) -> UserDictWord: - assert len(user_dict) == 2 or ( - len(user_dict) == 1 and "aab7dda2-0d97-43c8-8cb7-3f440dab9b4e" not in user_dict - ) - for word_uuid in user_dict.keys(): - if word_uuid == "aab7dda2-0d97-43c8-8cb7-3f440dab9b4e": - continue - return user_dict[word_uuid] - raise AssertionError - - -def test_read_not_exist_json(tmp_path: Path) -> None: - user_dict = UserDictionary(user_dict_path=tmp_path / "not_exist.json") - assert user_dict.read_dict() == {} - - -def test_create_word() -> None: - # 将来的に品詞などが追加された時にテストを増やす - assert create_word( - WordProperty(surface="test", pronunciation="テスト", accent_type=1) - ) == UserDictWord( - surface="test", - priority=5, - part_of_speech="名詞", - part_of_speech_detail_1="固有名詞", - part_of_speech_detail_2="一般", - part_of_speech_detail_3="*", - inflectional_type="*", - inflectional_form="*", - stem="*", - yomi="テスト", - pronunciation="テスト", - accent_type=1, - mora_count=None, - accent_associative_rule="*", - ) - - -def test_apply_word_without_json(tmp_path: Path) -> None: - - user_dict = UserDictionary( - user_dict_path=tmp_path / "test_apply_word_without_json.json", - compiled_dict_path=tmp_path / "test_apply_word_without_json.dic", - ) - user_dict.apply_word( - WordProperty(surface="test", pronunciation="テスト", accent_type=1) - ) - res = user_dict.read_dict() - assert len(res) == 1 - new_word = get_new_word(res) - assert ( - new_word.surface, - new_word.pronunciation, - new_word.accent_type, - ) == ("test", "テスト", 1) - - -def test_apply_word_with_json(tmp_path: Path) -> None: - user_dict_path = tmp_path / "test_apply_word_with_json.json" - user_dict_path.write_text( - json.dumps(valid_dict_dict_json, ensure_ascii=False), encoding="utf-8" - ) - user_dict = UserDictionary( - user_dict_path=user_dict_path, - compiled_dict_path=tmp_path / "test_apply_word_with_json.dic", - ) - user_dict.apply_word( - WordProperty(surface="test2", pronunciation="テストツー", accent_type=3) - ) - res = user_dict.read_dict() - assert len(res) == 2 - new_word = get_new_word(res) - assert ( - new_word.surface, - new_word.pronunciation, - new_word.accent_type, - ) == ("test2", "テストツー", 3) - - -def test_rewrite_word_invalid_id(tmp_path: Path) -> None: - user_dict_path = tmp_path / "test_rewrite_word_invalid_id.json" - user_dict_path.write_text( - json.dumps(valid_dict_dict_json, ensure_ascii=False), encoding="utf-8" - ) - user_dict = UserDictionary( - user_dict_path=user_dict_path, - compiled_dict_path=(tmp_path / "test_rewrite_word_invalid_id.dic"), - ) - with pytest.raises(UserDictInputError): - user_dict.rewrite_word( - "c2be4dc5-d07d-4767-8be1-04a1bb3f05a9", - WordProperty(surface="test2", pronunciation="テストツー", accent_type=2), - ) - - -def test_rewrite_word_valid_id(tmp_path: Path) -> None: - user_dict_path = tmp_path / "test_rewrite_word_valid_id.json" - user_dict_path.write_text( - json.dumps(valid_dict_dict_json, ensure_ascii=False), encoding="utf-8" - ) - user_dict = UserDictionary( - user_dict_path=user_dict_path, - compiled_dict_path=tmp_path / "test_rewrite_word_valid_id.dic", - ) - user_dict.rewrite_word( - "aab7dda2-0d97-43c8-8cb7-3f440dab9b4e", - WordProperty(surface="test2", pronunciation="テストツー", accent_type=2), - ) - new_word = user_dict.read_dict()["aab7dda2-0d97-43c8-8cb7-3f440dab9b4e"] - assert (new_word.surface, new_word.pronunciation, new_word.accent_type) == ( - "test2", - "テストツー", - 2, - ) - - -def test_delete_word_invalid_id(tmp_path: Path) -> None: - user_dict_path = tmp_path / "test_delete_word_invalid_id.json" - user_dict_path.write_text( - json.dumps(valid_dict_dict_json, ensure_ascii=False), encoding="utf-8" - ) - user_dict = UserDictionary( - user_dict_path=user_dict_path, - compiled_dict_path=tmp_path / "test_delete_word_invalid_id.dic", - ) - with pytest.raises(UserDictInputError): - user_dict.delete_word(word_uuid="c2be4dc5-d07d-4767-8be1-04a1bb3f05a9") - - -def test_delete_word_valid_id(tmp_path: Path) -> None: - user_dict_path = tmp_path / "test_delete_word_valid_id.json" - user_dict_path.write_text( - json.dumps(valid_dict_dict_json, ensure_ascii=False), encoding="utf-8" - ) - user_dict = UserDictionary( - user_dict_path=user_dict_path, - compiled_dict_path=tmp_path / "test_delete_word_valid_id.dic", - ) - user_dict.delete_word(word_uuid="aab7dda2-0d97-43c8-8cb7-3f440dab9b4e") - assert len(user_dict.read_dict()) == 0 - - -def test_priority() -> None: - for pos in part_of_speech_data: - for i in range(USER_DICT_MAX_PRIORITY + 1): - assert ( - create_word( - WordProperty( - surface="test", - pronunciation="テスト", - accent_type=1, - word_type=pos, - priority=i, - ) - ).priority - == i - ) - - -def test_import_dict(tmp_path: Path) -> None: - user_dict_path = tmp_path / "test_import_dict.json" - compiled_dict_path = tmp_path / "test_import_dict.dic" - user_dict_path.write_text( - json.dumps(valid_dict_dict_json, ensure_ascii=False), encoding="utf-8" - ) - user_dict = UserDictionary( - user_dict_path=user_dict_path, compiled_dict_path=compiled_dict_path - ) - user_dict.import_user_dict( - {"b1affe2a-d5f0-4050-926c-f28e0c1d9a98": import_word}, override=False - ) - assert user_dict.read_dict()["b1affe2a-d5f0-4050-926c-f28e0c1d9a98"] == import_word - assert user_dict.read_dict()[ - "aab7dda2-0d97-43c8-8cb7-3f440dab9b4e" - ] == UserDictWord(**valid_dict_dict_api["aab7dda2-0d97-43c8-8cb7-3f440dab9b4e"]) - - -def test_import_dict_no_override(tmp_path: Path) -> None: - user_dict_path = tmp_path / "test_import_dict_no_override.json" - compiled_dict_path = tmp_path / "test_import_dict_no_override.dic" - user_dict_path.write_text( - json.dumps(valid_dict_dict_json, ensure_ascii=False), encoding="utf-8" - ) - user_dict = UserDictionary( - user_dict_path=user_dict_path, compiled_dict_path=compiled_dict_path - ) - user_dict.import_user_dict( - {"aab7dda2-0d97-43c8-8cb7-3f440dab9b4e": import_word}, override=False - ) - assert user_dict.read_dict()[ - "aab7dda2-0d97-43c8-8cb7-3f440dab9b4e" - ] == UserDictWord(**valid_dict_dict_api["aab7dda2-0d97-43c8-8cb7-3f440dab9b4e"]) - - -def test_import_dict_override(tmp_path: Path) -> None: - user_dict_path = tmp_path / "test_import_dict_override.json" - compiled_dict_path = tmp_path / "test_import_dict_override.dic" - user_dict_path.write_text( - json.dumps(valid_dict_dict_json, ensure_ascii=False), encoding="utf-8" - ) - user_dict = UserDictionary( - user_dict_path=user_dict_path, compiled_dict_path=compiled_dict_path - ) - user_dict.import_user_dict( - {"aab7dda2-0d97-43c8-8cb7-3f440dab9b4e": import_word}, override=True - ) - assert user_dict.read_dict()["aab7dda2-0d97-43c8-8cb7-3f440dab9b4e"] == import_word - - -def test_import_invalid_word(tmp_path: Path) -> None: - user_dict_path = tmp_path / "test_import_invalid_dict.json" - compiled_dict_path = tmp_path / "test_import_invalid_dict.dic" - invalid_accent_associative_rule_word = deepcopy(import_word) - invalid_accent_associative_rule_word.accent_associative_rule = "invalid" - user_dict_path.write_text( - json.dumps(valid_dict_dict_json, ensure_ascii=False), encoding="utf-8" - ) - user_dict = UserDictionary( - user_dict_path=user_dict_path, compiled_dict_path=compiled_dict_path - ) - with pytest.raises(AssertionError): - user_dict.import_user_dict( - { - "aab7dda2-0d97-43c8-8cb7-3f440dab9b4e": invalid_accent_associative_rule_word - }, - override=True, - ) - invalid_pos_word = deepcopy(import_word) - invalid_pos_word.context_id = 2 - invalid_pos_word.part_of_speech = "フィラー" - invalid_pos_word.part_of_speech_detail_1 = "*" - invalid_pos_word.part_of_speech_detail_2 = "*" - invalid_pos_word.part_of_speech_detail_3 = "*" - with pytest.raises(ValueError): - user_dict.import_user_dict( - {"aab7dda2-0d97-43c8-8cb7-3f440dab9b4e": invalid_pos_word}, - override=True, - ) - - -def test_update_dict(tmp_path: Path) -> None: - user_dict_path = tmp_path / "test_update_dict.json" - compiled_dict_path = tmp_path / "test_update_dict.dic" - user_dict = UserDictionary( - user_dict_path=user_dict_path, compiled_dict_path=compiled_dict_path - ) - user_dict.update_dict() - test_text = "テスト用の文字列" - success_pronunciation = "デフォルトノジショデハゼッタイニセイセイサレナイヨミ" - - # 既に辞書に登録されていないか確認する - assert g2p(text=test_text, kana=True) != success_pronunciation - - user_dict.apply_word( - WordProperty( - surface=test_text, - pronunciation=success_pronunciation, - accent_type=1, - priority=10, - ) - ) - assert g2p(text=test_text, kana=True) == success_pronunciation - - # 疑似的にエンジンを再起動する - unset_user_dict() - user_dict.update_dict() - - assert g2p(text=test_text, kana=True) == success_pronunciation diff --git a/voicevox_engine/test/unit/user_dict/test_user_dict_model.py b/voicevox_engine/test/unit/user_dict/test_user_dict_model.py deleted file mode 100644 index 5c9b4753a8128e64dc4466685d53d42fd8120c2b..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/user_dict/test_user_dict_model.py +++ /dev/null @@ -1,184 +0,0 @@ -"""UserDictWord のテスト""" - -from typing import TypedDict - -import pytest -from pydantic import ValidationError - -from voicevox_engine.tts_pipeline.kana_converter import parse_kana -from voicevox_engine.user_dict.model import UserDictWord - - -class UserDictWordInputs(TypedDict): - surface: str - priority: int - part_of_speech: str - part_of_speech_detail_1: str - part_of_speech_detail_2: str - part_of_speech_detail_3: str - inflectional_type: str - inflectional_form: str - stem: str - yomi: str - pronunciation: str - accent_type: int - mora_count: int | None - accent_associative_rule: str - - -def generate_model() -> UserDictWordInputs: - """テスト用に UserDictWord の要素を生成する。""" - return { - "surface": "テスト", - "priority": 0, - "part_of_speech": "名詞", - "part_of_speech_detail_1": "固有名詞", - "part_of_speech_detail_2": "一般", - "part_of_speech_detail_3": "*", - "inflectional_type": "*", - "inflectional_form": "*", - "stem": "*", - "yomi": "テスト", - "pronunciation": "テスト", - "accent_type": 0, - "mora_count": None, - "accent_associative_rule": "*", - } - - -def test_valid_word() -> None: - """generate_model 関数は UserDictWord の要素を生成する。""" - # Outputs - args = generate_model() - - # Test - UserDictWord(**args) - - -def test_convert_to_zenkaku() -> None: - """UserDictWord は surface を全角にする。""" - # Inputs - test_value = generate_model() - test_value["surface"] = "test" - # Expects - true_surface = "test" - # Outputs - surface = UserDictWord(**test_value).surface - - # Test - assert surface == true_surface - - -def test_count_mora() -> None: - """UserDictWord は mora_count=None を上書きする。""" - # Inputs - test_value = generate_model() - # Expects - true_mora_count = 3 - # Outputs - mora_count = UserDictWord(**test_value).mora_count - - # Test - assert mora_count == true_mora_count - - -def test_count_mora_x() -> None: - test_value = generate_model() - for s in [chr(i) for i in range(12449, 12533)]: - if s in ["ァ", "ィ", "ゥ", "ェ", "ォ", "ッ", "ャ", "ュ", "ョ", "ヮ"]: - continue - for x in "ァィゥェォャュョ": - expected_count = 0 - test_value["pronunciation"] = s + x - for accent_phrase in parse_kana( - test_value["pronunciation"] + "'", - ): - expected_count += len(accent_phrase.moras) - assert UserDictWord(**test_value).mora_count == expected_count - - -def test_count_mora_xwa() -> None: - """「ヮ」を含む発音のモーラ数が適切にカウントされる。""" - # Inputs - test_value = generate_model() - test_value["pronunciation"] = "クヮンセイ" - # Expects - true_mora_count = 0 - for accent_phrase in parse_kana( - test_value["pronunciation"] + "'", - ): - true_mora_count += len(accent_phrase.moras) - # Outputs - mora_rount = UserDictWord(**test_value).mora_count - - # Test - assert mora_rount == true_mora_count - - -def test_invalid_pronunciation_not_katakana() -> None: - """UserDictWord はカタカナでない pronunciation をエラーとする。""" - # Inputs - test_value = generate_model() - test_value["pronunciation"] = "ぼいぼ" - - # Test - with pytest.raises(ValidationError): - UserDictWord(**test_value) - - -def test_invalid_pronunciation_invalid_sutegana() -> None: - """UserDictWord は無効な pronunciation をエラーとする。""" - # Inputs - test_value = generate_model() - test_value["pronunciation"] = "アィウェォ" - - # Test - with pytest.raises(ValidationError): - UserDictWord(**test_value) - - -def test_invalid_pronunciation_invalid_xwa() -> None: - """UserDictWord は無効な pronunciation をエラーとする。""" - # Inputs - test_value = generate_model() - test_value["pronunciation"] = "アヮ" - - # Test - with pytest.raises(ValidationError): - UserDictWord(**test_value) - - -def test_count_mora_voiced_sound() -> None: - """UserDictWord はモーラ数を正しくカウントして上書きする。""" - # Inputs - test_value = generate_model() - test_value["pronunciation"] = "ボイボ" - # Expects - true_mora_count = 3 - # Outputs - mora_count = UserDictWord(**test_value).mora_count - - # Test - assert mora_count == true_mora_count - - -def test_word_accent_type_too_big() -> None: - """UserDictWord はモーラ数を超えた accent_type をエラーとする。""" - # Inputs - test_value = generate_model() - test_value["accent_type"] = 4 - - # Test - with pytest.raises(ValidationError): - UserDictWord(**test_value) - - -def test_word_accent_type_negative() -> None: - """UserDictWord は負の accent_type をエラーとする。""" - # Inputs - test_value = generate_model() - test_value["accent_type"] = -1 - - # Test - with pytest.raises(ValidationError): - UserDictWord(**test_value) diff --git a/voicevox_engine/test/unit/user_dict/test_word_types.py b/voicevox_engine/test/unit/user_dict/test_word_types.py deleted file mode 100644 index 8e9b5a1cb51c30f26e98c01323decaf1959beaa3..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/unit/user_dict/test_word_types.py +++ /dev/null @@ -1,8 +0,0 @@ -from voicevox_engine.user_dict.model import WordTypes -from voicevox_engine.user_dict.user_dict_word import part_of_speech_data - - -def test_word_types() -> None: - word_types = list(WordTypes) - part_of_speeches = list(part_of_speech_data.keys()) - assert sorted(word_types) == sorted(part_of_speeches) diff --git a/voicevox_engine/test/utility.py b/voicevox_engine/test/utility.py deleted file mode 100644 index 5737f77887d91ed0073906d429834c27647d40a6..0000000000000000000000000000000000000000 --- a/voicevox_engine/test/utility.py +++ /dev/null @@ -1,69 +0,0 @@ -import hashlib -import io -from typing import Any - -import numpy as np -import soundfile as sf -from fastapi.encoders import jsonable_encoder - - -def round_floats(value: Any, round_value: int) -> Any: - """floatの小数点以下を再帰的に丸める""" - if isinstance(value, float): - return round(value, round_value) - elif isinstance(value, np.ndarray) and np.issubdtype(value.dtype, np.floating): - return np.round(value, round_value) - elif isinstance(value, list): - return [round_floats(v, round_value) for v in value] - elif isinstance(value, dict): - return {k: round_floats(v, round_value) for k, v in value.items()} - else: - return value - - -def pydantic_to_native_type(value: Any) -> Any: - """pydanticの型をnativeな型に変換する""" - return jsonable_encoder(value) - - -def hash_long_string(value: Any) -> Any: - """文字数が1000文字を超えるものはハッシュ化する""" - - def to_hash(value: str) -> str: - return "MD5:" + hashlib.md5(value.encode()).hexdigest() - - if isinstance(value, str): - return value if len(value) <= 1000 else to_hash(value) - elif isinstance(value, list): - return [hash_long_string(v) for v in value] - elif isinstance(value, dict): - return {k: hash_long_string(v) for k, v in value.items()} - else: - return value - - -def summarize_big_ndarray(value: Any) -> Any: - """要素数が100を超える NDArray を、ハッシュ値と shape からなる文字列へ要約する""" - - def to_hash(value: np.ndarray) -> str: - return "MD5:" + hashlib.md5(value.tobytes()).hexdigest() - - if isinstance(value, np.ndarray): - if value.size <= 100: - return value - else: - return {"hash": to_hash(value), "shape": value.shape} - elif isinstance(value, list): - return [summarize_big_ndarray(v) for v in value] - elif isinstance(value, dict): - return {k: summarize_big_ndarray(v) for k, v in value.items()} - else: - return value - - -def hash_wave_floats_from_wav_bytes(wav_bytes: bytes) -> str: - """.wavファイルバイト列から音声波形を抽出しハッシュ化する""" - wave = sf.read(io.BytesIO(wav_bytes))[0].tolist() - # NOTE: Linux-Windows 数値精度問題に対するワークアラウンド - wave = round_floats(wave, 2) - return "MD5:" + hashlib.md5(np.array(wave).tobytes()).hexdigest() diff --git a/voicevox_engine/tools/check_release_build.py b/voicevox_engine/tools/check_release_build.py deleted file mode 100644 index 47a0c06d874d3ffa096ee6a1a8bd173c35a68db6..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/check_release_build.py +++ /dev/null @@ -1,81 +0,0 @@ -""" -ビルド結果をテストする -""" - -import argparse -import json -import time -from io import BytesIO -from pathlib import Path -from subprocess import Popen -from urllib.parse import urlencode -from urllib.request import Request, urlopen - -import soundfile - -base_url = "http://127.0.0.1:50021/" - - -def test_release_build(dist_dir: Path, skip_run_process: bool) -> None: - run_file = dist_dir / "run" - if not run_file.exists(): - run_file = dist_dir / "run.exe" - - # 起動 - process = None - if not skip_run_process: - process = Popen([run_file.absolute()], cwd=dist_dir) - - # 起動待機 - for i in range(10): - print(f"Waiting for the engine to start... {i}") - time.sleep(15) - try: - req = Request(base_url + "version") - with urlopen(req) as res: - if len(res.read()) > 0: - break - except Exception: - continue - else: - print("Failed to start the engine.") - exit(1) - - # テキスト -> クエリ - text = "こんにちは、音声合成の世界へようこそ" - req = Request( - base_url + "audio_query?" + urlencode({"speaker": "1", "text": text}), - method="POST", - ) - with urlopen(req) as res: - query = json.loads(res.read().decode("utf-8")) - - # クエリ -> 音声 - req = Request(base_url + "synthesis?speaker=1", method="POST") - req.add_header("Content-Type", "application/json") - req.data = json.dumps(query).encode("utf-8") - with urlopen(req) as res: - wave = res.read() - soundfile.read(BytesIO(wave)) - - # エンジンマニフェスト - req = Request(base_url + "engine_manifest", method="GET") - with urlopen(req) as res: - manifest = json.loads(res.read().decode("utf-8")) - assert "uuid" in manifest - - if not skip_run_process: - # プロセスが稼働中であることを確認 - assert process is not None - assert process.poll() is None - - # 停止 - process.terminate() - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--dist_dir", type=Path, default=Path("dist/")) - parser.add_argument("--skip_run_process", action="store_true") - args = parser.parse_args() - test_release_build(dist_dir=args.dist_dir, skip_run_process=args.skip_run_process) diff --git a/voicevox_engine/tools/codesign.bash b/voicevox_engine/tools/codesign.bash deleted file mode 100644 index 5c80cf55f586b9178b9b1e2bf3769e5b117f93d0..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/codesign.bash +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env bash -# !!! コードサイニング証明書を取り扱うので取り扱い注意 !!! - -# eSignerCKAを使ってコード署名する - -set -eu - -if [ ! -v ESIGNERCKA_USERNAME ]; then # eSignerCKAのユーザー名 - echo "ESIGNERCKA_USERNAMEが未定義です" - exit 1 -fi -if [ ! -v ESIGNERCKA_PASSWORD ]; then # eSignerCKAのパスワード - echo "ESIGNERCKA_PASSWORDが未定義です" - exit 1 -fi -if [ ! -v ESIGNERCKA_TOTP_SECRET ]; then # eSignerCKAのTOTP Secret - echo "ESIGNERCKA_TOTP_SECRETが未定義です" - exit 1 -fi - -if [ $# -ne 1 ]; then - echo "引数の数が一致しません" - exit 1 -fi -target_file_glob="$1" - -# eSignerCKAのセットアップ -INSTALL_DIR='..\eSignerCKA' -if [ ! -d "$INSTALL_DIR" ]; then - curl -LO "https://github.com/SSLcom/eSignerCKA/releases/download/v1.0.6/SSL.COM-eSigner-CKA_1.0.6.zip" - unzip -o SSL.COM-eSigner-CKA_1.0.6.zip - mv ./*eSigner*CKA_*.exe eSigner_CKA_Installer.exe - powershell " - & ./eSigner_CKA_Installer.exe /CURRENTUSER /VERYSILENT /SUPPRESSMSGBOXES /DIR='$INSTALL_DIR' | Out-Null - & '$INSTALL_DIR\eSignerCKATool.exe' config -mode product -user '$ESIGNERCKA_USERNAME' -pass '$ESIGNERCKA_PASSWORD' -totp '$ESIGNERCKA_TOTP_SECRET' -key '$INSTALL_DIR\master.key' -r - & '$INSTALL_DIR\eSignerCKATool.exe' unload - " - rm SSL.COM-eSigner-CKA_1.0.6.zip eSigner_CKA_Installer.exe -fi - -# 証明書を読み込む -powershell "& '$INSTALL_DIR\eSignerCKATool.exe' load" - -# shellcheck disable=SC2016 -THUMBPRINT=$( - powershell ' - $CodeSigningCert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1 - echo "$($CodeSigningCert.Thumbprint)" - ' -) - -# 指定ファイルに署名する -function codesign() { - TARGET="$1" - # shellcheck disable=SC2012 - SIGNTOOL=$(ls "C:/Program Files (x86)/Windows Kits/"10/bin/*/x86/signtool.exe | sort -V | tail -n 1) # なぜかこれじゃないと動かない - powershell "& '$SIGNTOOL' sign /fd SHA256 /td SHA256 /tr http://timestamp.digicert.com /sha1 '$THUMBPRINT' '$TARGET'" -} - -# 指定ファイルが署名されているか -function is_signed() { - TARGET="$1" - SIGNTOOL=$(find "C:/Program Files (x86)/Windows Kits/10/App Certification Kit" -name "signtool.exe" | sort -V | tail -n 1) - powershell "& '$SIGNTOOL' verify /pa '$TARGET'" >/dev/null 2>&1 || return 1 -} - -# 署名されていなければ署名 -# shellcheck disable=SC2012,SC2086 -ls $target_file_glob | while read -r target_file; do - if is_signed "$target_file"; then - echo "署名済み: $target_file" - else - echo "署名開始: $target_file" - codesign "$target_file" - fi -done - -# 証明書を破棄 -powershell "& '$INSTALL_DIR\eSignerCKATool.exe' unload" diff --git a/voicevox_engine/tools/create_venv_and_generate_licenses.bash b/voicevox_engine/tools/create_venv_and_generate_licenses.bash deleted file mode 100644 index 09d9154d89cea172dbf4f81548f5dfa4bcbeafbe..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/create_venv_and_generate_licenses.bash +++ /dev/null @@ -1,28 +0,0 @@ -# 仮想環境を作ってrequirements.txtをインストールし、ライセンス一覧を生成する - -set -eux - -if [ ! -v OUTPUT_LICENSE_JSON_PATH ]; then - echo "OUTPUT_LICENSE_JSON_PATHが未定義です" - exit 1 -fi - -VENV_PATH="licenses_venv" - -python -m venv $VENV_PATH -if [ -d "$VENV_PATH/Scripts" ]; then - # shellcheck disable=SC1091,SC1090 - source $VENV_PATH/Scripts/activate -else - # shellcheck disable=SC1091,SC1090 - source $VENV_PATH/bin/activate -fi - -pip install -r requirements.txt -# requirements-dev.txt でバージョン指定されている pip-licenses をインストールする -pip install "$(grep pip-licenses requirements-dev.txt | cut -f 1 -d ';')" -python tools/generate_licenses.py > "${OUTPUT_LICENSE_JSON_PATH}" - -deactivate - -rm -rf $VENV_PATH diff --git a/voicevox_engine/tools/generate_filemap.py b/voicevox_engine/tools/generate_filemap.py deleted file mode 100644 index 47f002d7077cbec3d032713c8c28ca02b8c06897..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/generate_filemap.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -'ResourceManager'が参照するfilemapを予め生成する。 -""" - -import json -import os -from argparse import ArgumentParser -from collections.abc import Generator -from hashlib import sha256 -from pathlib import Path, PurePosixPath - -FILEMAP_FILENAME = "filemap.json" -DEFAULT_TARGET_SUFFIX = ["png", "wav"] - - -# WindowsとPOSIXで同じファイルが生成されるようにPurePosixPathに変換してから文字列にする。 -def to_posix_str_path(path: Path) -> str: - return str(PurePosixPath(path)) - - -def make_hash(file: Path) -> str: - digest = sha256(file.read_bytes()).digest() - return digest.hex() - - -def walk_target_dir(target_dir: Path) -> Generator[Path, None, None]: - for root, _, files in os.walk(target_dir): - for file in files: - yield Path(root, file) - - -def generate_path_to_hash_dict( - target_dir: Path, target_suffix: list[str] -) -> dict[str, str]: - suffix = tuple(target_suffix) - return { - to_posix_str_path(filepath.relative_to(target_dir)): make_hash(filepath) - for filepath in walk_target_dir(target_dir) - if filepath.suffix.endswith(suffix) - } - - -if __name__ == "__main__": - parser = ArgumentParser() - parser.add_argument( - "--target_dir", type=Path, required=True, help="filemapを作成するディレクトリ" - ) - parser.add_argument( - "--target_suffix", - nargs="+", - default=DEFAULT_TARGET_SUFFIX, - help=f"filemapに登録するファイルの拡張子\nデフォルトは{', '.join(DEFAULT_TARGET_SUFFIX)}", - ) - args = parser.parse_args() - - target_dir: Path = args.target_dir - if not target_dir.is_dir(): - raise Exception(f"{target_dir}はディレクトリではありません") - - save_path = target_dir / FILEMAP_FILENAME - path_to_hash = generate_path_to_hash_dict(target_dir, args.target_suffix) - save_path.write_text(json.dumps(path_to_hash, ensure_ascii=False), encoding="utf-8") diff --git a/voicevox_engine/tools/generate_licenses.py b/voicevox_engine/tools/generate_licenses.py deleted file mode 100644 index d7d0e9d53b94d25115fea2dd8ebd40058d83ea84..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/generate_licenses.py +++ /dev/null @@ -1,324 +0,0 @@ -import json -import os -import subprocess -import urllib.request -from pathlib import Path -from typing import Literal - - -class LicenseError(Exception): - # License違反があった場合、このエラーを出します。 - pass - - -class License: - def __init__( - self, - package_name: str, - package_version: str | None, - license_name: str | None, - license_text: str, - license_text_type: Literal["raw", "local_address", "remote_address"], - ): - self.package_name = package_name - self.package_version = package_version - self.license_name = license_name - - if license_text_type == "raw": - self.license_text = license_text - elif license_text_type == "local_address": - # ライセンステキストをローカルのライセンスファイルから抽出する - self.license_text = Path(license_text).read_text(encoding="utf8") - elif license_text_type == "remote_address": - self.license_text = get_license_text(license_text) - else: - raise Exception("型で保護され実行されないはずのパスが実行されました") - - -def get_license_text(text_url: str) -> str: - """URL が指すテキストを取得する。""" - with urllib.request.urlopen(text_url) as res: - # NOTE: `urlopen` 返り値の型が貧弱なため型チェックを無視する - return res.read().decode() # type: ignore - - -def generate_licenses() -> list[License]: - licenses: list[License] = [] - - # pip - try: - pip_licenses_output = subprocess.run( - "pip-licenses " - "--from=mixed " - "--format=json " - "--with-urls " - "--with-license-file " - "--no-license-path ", - shell=True, - capture_output=True, - check=True, - env=os.environ, - ).stdout.decode() - except subprocess.CalledProcessError as err: - raise Exception( - f"command output:\n{err.stderr and err.stderr.decode()}" - ) from err - - licenses_json = json.loads(pip_licenses_output) - for license_json in licenses_json: - # ライセンス文を pip 外で取得されたもので上書きする - package_name: str = license_json["Name"].lower() - if license_json["LicenseText"] == "UNKNOWN": - if package_name == "core" and license_json["Version"] == "0.0.0": - continue - elif package_name == "future": - text_url = "https://raw.githubusercontent.com/PythonCharmers/python-future/master/LICENSE.txt" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - elif package_name == "pefile": - text_url = "https://raw.githubusercontent.com/erocarrera/pefile/master/LICENSE" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - elif package_name == "pyopenjtalk": - text_url = "https://raw.githubusercontent.com/r9y9/pyopenjtalk/master/LICENSE.md" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - elif package_name == "python-multipart": - text_url = "https://raw.githubusercontent.com/andrew-d/python-multipart/master/LICENSE.txt" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - elif package_name == "romkan": - text_url = "https://raw.githubusercontent.com/soimort/python-romkan/master/LICENSE" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - elif package_name == "distlib": - text_url = "https://bitbucket.org/pypa/distlib/raw/7d93712134b28401407da27382f2b6236c87623a/LICENSE.txt" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - elif package_name == "jsonschema": - text_url = "https://raw.githubusercontent.com/python-jsonschema/jsonschema/dbc398245a583cb2366795dc529ae042d10c1577/COPYING" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - elif package_name == "lockfile": - text_url = "https://opendev.org/openstack/pylockfile/raw/tag/0.12.2/LICENSE" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - elif package_name == "platformdirs": - text_url = "https://raw.githubusercontent.com/platformdirs/platformdirs/aa671aaa97913c7b948567f4d9c77d4f98bfa134/LICENSE" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - elif package_name == "webencodings": - text_url = "https://raw.githubusercontent.com/gsnedders/python-webencodings/fa2cb5d75ab41e63ace691bc0825d3432ba7d694/LICENSE" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - else: - # ライセンスがpypiに無い - raise Exception(f"No License info provided for {package_name}") - # soxr - if package_name == "soxr": - text_url = "https://raw.githubusercontent.com/dofuuz/python-soxr/v0.3.6/LICENSE.txt" # noqa: B950 - license_json["LicenseText"] = get_license_text(text_url) - - license = License( - package_name=license_json["Name"], - package_version=license_json["Version"], - license_name=license_json["License"], - license_text=license_json["LicenseText"], - license_text_type="raw", - ) - - # ライセンスを確認する - license_names_str = license.license_name or "" - license_names = license_names_str.split("; ") - for license_name in license_names: - if license_name in [ - "GNU General Public License v2 (GPLv2)", - "GNU General Public License (GPL)", - "GNU General Public License v3 (GPLv3)", - "GNU Affero General Public License v3 (AGPL-3)", - ]: - raise LicenseError( - f"ライセンス違反: {license.package_name} is {license.license_name}" - ) - - licenses.append(license) - - python_version = "3.11.3" - - licenses += [ - # https://sourceforge.net/projects/open-jtalk/files/Open%20JTalk/open_jtalk-1.11/ - License( - package_name="Open JTalk", - package_version="1.11", - license_name="Modified BSD license", - license_text="tools/licenses/open_jtalk/COPYING", - license_text_type="local_address", - ), - License( - package_name="MeCab", - package_version=None, - license_name="Modified BSD license", - license_text="tools/licenses/open_jtalk/mecab/COPYING", - license_text_type="local_address", - ), - License( - package_name="NAIST Japanese Dictionary", - package_version=None, - license_name="Modified BSD license", - license_text="tools/licenses//open_jtalk/mecab-naist-jdic/COPYING", - license_text_type="local_address", - ), - License( - package_name='HTS Voice "Mei"', - package_version=None, - license_name="Creative Commons Attribution 3.0 license", - license_text="https://raw.githubusercontent.com/r9y9/pyopenjtalk/master/pyopenjtalk/htsvoice/LICENSE_mei_normal.htsvoice", # noqa: B950 - license_text_type="remote_address", - ), - License( - package_name="VOICEVOX CORE", - package_version=None, - license_name="MIT license", - license_text="https://raw.githubusercontent.com/VOICEVOX/voicevox_core/main/LICENSE", - license_text_type="remote_address", - ), - License( - package_name="VOICEVOX ENGINE", - package_version=None, - license_name="LGPL license", - license_text="https://raw.githubusercontent.com/VOICEVOX/voicevox_engine/master/LGPL_LICENSE", - license_text_type="remote_address", - ), - License( - package_name="world", - package_version=None, - license_name="Modified BSD license", - license_text="https://raw.githubusercontent.com/mmorise/World/master/LICENSE.txt", - license_text_type="remote_address", - ), - License( - package_name="PyTorch", - package_version="1.9.0", - license_name="BSD-style license", - license_text="https://raw.githubusercontent.com/pytorch/pytorch/master/LICENSE", - license_text_type="remote_address", - ), - License( - package_name="ONNX Runtime", - package_version="1.13.1", - license_name="MIT license", - license_text="https://raw.githubusercontent.com/microsoft/onnxruntime/master/LICENSE", - license_text_type="remote_address", - ), - License( - package_name="Python", - package_version=python_version, - license_name="Python Software Foundation License", - license_text=f"https://raw.githubusercontent.com/python/cpython/v{python_version}/LICENSE", - license_text_type="remote_address", - ), - # OpenBLAS - License( - package_name="OpenBLAS", - package_version=None, - license_name="BSD 3-clause license", - license_text="https://raw.githubusercontent.com/xianyi/OpenBLAS/develop/LICENSE", - license_text_type="remote_address", - ), - License( - package_name="libsndfile-binaries", - package_version="1.2.0", - license_name="LGPL-2.1 license", - license_text="https://raw.githubusercontent.com/bastibe/libsndfile-binaries/d9887ef926bb11cf1a2526be4ab6f9dc690234c0/COPYING", # noqa: B950 - license_text_type="remote_address", - ), - License( - package_name="libogg", - package_version="1.3.5", - license_name="BSD 3-clause license", - license_text="https://raw.githubusercontent.com/xiph/ogg/v1.3.5/COPYING", - license_text_type="remote_address", - ), - License( - package_name="libvorbis", - package_version="1.3.7", - license_name="BSD 3-clause license", - license_text="https://raw.githubusercontent.com/xiph/vorbis/v1.3.7/COPYING", - license_text_type="remote_address", - ), - # libflac - License( - package_name="FLAC", - package_version="1.4.2", - license_name="Xiph.org's BSD-like license", - license_text="https://raw.githubusercontent.com/xiph/flac/1.4.2/COPYING.Xiph", - license_text_type="remote_address", - ), - # libopus - License( - package_name="Opus", - package_version="1.3.1", - license_name="BSD 3-clause license", - license_text="https://raw.githubusercontent.com/xiph/opus/v1.3.1/COPYING", - license_text_type="remote_address", - ), - # https://sourceforge.net/projects/mpg123/files/mpg123/1.30.2/ - License( - package_name="mpg123", - package_version="1.30.2", - license_name="LGPL-2.1 license", - license_text="tools/licenses/mpg123/COPYING", - license_text_type="local_address", - ), - # liblame - # https://sourceforge.net/projects/lame/files/lame/3.100/ - License( - package_name="lame", - package_version="3.100", - license_name="LGPL-2.0 license", - license_text="https://svn.code.sf.net/p/lame/svn/tags/RELEASE__3_100/lame/COPYING", - license_text_type="remote_address", - ), - # license text from CUDA 11.8.0 - # https://developer.nvidia.com/cuda-11-8-0-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exe_local # noqa: B950 - # https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_522.06_windows.exe # noqa: B950 - # cuda_11.8.0_522.06_windows.exe (cuda_documentation/Doc/EULA.txt) - License( - package_name="CUDA Toolkit", - package_version="11.8.0", - license_name=None, - license_text="tools/licenses/cuda/EULA.txt", - license_text_type="local_address", - ), - # license text from cuDNN v8.9.2 (June 1st, 2023), for CUDA 11.x, cuDNN Library for Windows # noqa: B950 - # https://developer.nvidia.com/rdp/cudnn-archive # noqa: B950 - # https://developer.download.nvidia.com/compute/cudnn/redist/cudnn/windows-x86_64/cudnn-windows-x86_64-8.9.2.26_cuda11-archive.zip # noqa: B950 - # cudnn-windows-x86_64-8.9.2.26_cuda11-archive.zip (cudnn-windows-x86_64-8.9.2.26_cuda11-archive/LICENSE) # noqa: B950 - License( - package_name="cuDNN", - package_version="8.9.2", - license_name=None, - license_text="tools/licenses/cudnn/LICENSE", - license_text_type="local_address", - ), - ] - - return licenses - - -if __name__ == "__main__": - import argparse - import sys - - parser = argparse.ArgumentParser() - parser.add_argument("-o", "--output_path", type=str) - args = parser.parse_args() - - output_path = args.output_path - - licenses = generate_licenses() - - # dump - out = Path(output_path).open("w") if output_path else sys.stdout - json.dump( - [ - { - "name": license.package_name, - "version": license.package_version, - "license": license.license_name, - "text": license.license_text, - } - for license in licenses - ], - out, - ) diff --git a/voicevox_engine/tools/get_cost_candidates.py b/voicevox_engine/tools/get_cost_candidates.py deleted file mode 100644 index 168854d96da9cf666f112a3026e8be7ce92c7fc0..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/get_cost_candidates.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -voicevox_engine/user_dict/part_of_speech_data.pyのcost_candidatesを計算するプログラムです。 -引数のnaist_jdic_pathには、open_jtalkのsrc/mecab-naist-jdic/naist-jdic.csvを指定してください。 - -実行例: -python tools/get_cost_candidates.py --naist_jdic_path=/path/to/naist-jdic.csv \ - --pos=名詞 \ - --pos_detail_1=固有名詞 \ - --pos_detail_2=一般 \ - --pos_detail_3=* - -cost_candidatesの値の詳細は以下の通りです。 -- 1番目の値はnaist_jdic内の同一品詞の最小コストから1を引いたもの、11番目の値は最大コストに1を足したものです。 -- 2番目の値はnaist_jdic内の同一品詞のコストの下位1%、10番目の値は99%の値です。 -- 6番目の値はnaist_jdic内の同一品詞のコストの最頻値です。 -- 2番目から6番目、6番目から10番目までの値は一定割合で増加するようになっています。 -""" - -import argparse -import statistics -from pathlib import Path - -import numpy as np - - -def get_candidates( - naist_jdic_path: Path, - pos: str, - pos_detail_1: str, - pos_detail_2: str, - pos_detail_3: str, -) -> list[int]: - costs = [] - with naist_jdic_path.open(encoding="utf-8") as f: - for line in f: - ( - _, - _, - _, - _cost, - _pos, - _pos_detail_1, - _pos_detail_2, - _pos_detail_3, - _, - _, - _, - _, - _, - _, - _, - ) = line.split(",") - if (_pos, _pos_detail_1, _pos_detail_2, _pos_detail_3) == ( - pos, - pos_detail_1, - pos_detail_2, - pos_detail_3, - ): - costs.append(int(_cost)) - assert len(costs) > 0 - cost_min = min(costs) - 1 - cost_1per = np.quantile(costs, 0.01).astype(np.int64) - cost_mode = statistics.mode(costs) - cost_99per = np.quantile(costs, 0.99).astype(np.int64) - cost_max = max(costs) + 1 - return ( - [cost_min] - + [int(cost_1per + (cost_mode - cost_1per) * i / 4) for i in range(5)] - + [int(cost_mode + (cost_99per - cost_mode) * i / 4) for i in range(1, 5)] - + [cost_max] - ) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--naist_jdic_path", type=Path) - parser.add_argument("--pos", type=str) - parser.add_argument("--pos_detail_1", type=str) - parser.add_argument("--pos_detail_2", type=str) - parser.add_argument("--pos_detail_3", type=str) - args = parser.parse_args() - print( - get_candidates( - naist_jdic_path=args.naist_jdic_path, - pos=args.pos, - pos_detail_1=args.pos_detail_1, - pos_detail_2=args.pos_detail_2, - pos_detail_3=args.pos_detail_3, - ) - ) diff --git a/voicevox_engine/tools/licenses/cuda/EULA.txt b/voicevox_engine/tools/licenses/cuda/EULA.txt deleted file mode 100644 index b1c1f891b53aebccfb4bae04dbcd53c048a7ce85..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/licenses/cuda/EULA.txt +++ /dev/null @@ -1,1598 +0,0 @@ -End User License Agreement --------------------------- - -NVIDIA Software License Agreement and CUDA Supplement to -Software License Agreement. Last updated: October 8, 2021 - -The CUDA Toolkit End User License Agreement applies to the -NVIDIA CUDA Toolkit, the NVIDIA CUDA Samples, the NVIDIA -Display Driver, NVIDIA Nsight tools (Visual Studio Edition), -and the associated documentation on CUDA APIs, programming -model and development tools. If you do not agree with the -terms and conditions of the license agreement, then do not -download or use the software. - -Last updated: October 8, 2021. - - -Preface -------- - -The Software License Agreement in Chapter 1 and the Supplement -in Chapter 2 contain license terms and conditions that govern -the use of NVIDIA software. By accepting this agreement, you -agree to comply with all the terms and conditions applicable -to the product(s) included herein. - - -NVIDIA Driver - - -Description - -This package contains the operating system driver and -fundamental system software components for NVIDIA GPUs. - - -NVIDIA CUDA Toolkit - - -Description - -The NVIDIA CUDA Toolkit provides command-line and graphical -tools for building, debugging and optimizing the performance -of applications accelerated by NVIDIA GPUs, runtime and math -libraries, and documentation including programming guides, -user manuals, and API references. - - -Default Install Location of CUDA Toolkit - -Windows platform: - -%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v#.# - -Linux platform: - -/usr/local/cuda-#.# - -Mac platform: - -/Developer/NVIDIA/CUDA-#.# - - -NVIDIA CUDA Samples - - -Description - -CUDA Samples are now located in -https://github.com/nvidia/cuda-samples, which includes -instructions for obtaining, building, and running the samples. -They are no longer included in the CUDA toolkit. - - -NVIDIA Nsight Visual Studio Edition (Windows only) - - -Description - -NVIDIA Nsight Development Platform, Visual Studio Edition is a -development environment integrated into Microsoft Visual -Studio that provides tools for debugging, profiling, analyzing -and optimizing your GPU computing and graphics applications. - - -Default Install Location of Nsight Visual Studio Edition - -Windows platform: - -%ProgramFiles(x86)%\NVIDIA Corporation\Nsight Visual Studio Edition #.# - - -1. License Agreement for NVIDIA Software Development Kits ---------------------------------------------------------- - - -Important Notice—Read before downloading, installing, -copying or using the licensed software: -------------------------------------------------------- - -This license agreement, including exhibits attached -("Agreement”) is a legal agreement between you and NVIDIA -Corporation ("NVIDIA") and governs your use of a NVIDIA -software development kit (“SDK”). - -Each SDK has its own set of software and materials, but here -is a description of the types of items that may be included in -a SDK: source code, header files, APIs, data sets and assets -(examples include images, textures, models, scenes, videos, -native API input/output files), binary software, sample code, -libraries, utility programs, programming code and -documentation. - -This Agreement can be accepted only by an adult of legal age -of majority in the country in which the SDK is used. - -If you are entering into this Agreement on behalf of a company -or other legal entity, you represent that you have the legal -authority to bind the entity to this Agreement, in which case -“you” will mean the entity you represent. - -If you don’t have the required age or authority to accept -this Agreement, or if you don’t accept all the terms and -conditions of this Agreement, do not download, install or use -the SDK. - -You agree to use the SDK only for purposes that are permitted -by (a) this Agreement, and (b) any applicable law, regulation -or generally accepted practices or guidelines in the relevant -jurisdictions. - - -1.1. License - - -1.1.1. License Grant - -Subject to the terms of this Agreement, NVIDIA hereby grants -you a non-exclusive, non-transferable license, without the -right to sublicense (except as expressly provided in this -Agreement) to: - - 1. Install and use the SDK, - - 2. Modify and create derivative works of sample source code - delivered in the SDK, and - - 3. Distribute those portions of the SDK that are identified - in this Agreement as distributable, as incorporated in - object code format into a software application that meets - the distribution requirements indicated in this Agreement. - - -1.1.2. Distribution Requirements - -These are the distribution requirements for you to exercise -the distribution grant: - - 1. Your application must have material additional - functionality, beyond the included portions of the SDK. - - 2. The distributable portions of the SDK shall only be - accessed by your application. - - 3. The following notice shall be included in modifications - and derivative works of sample source code distributed: - “This software contains source code provided by NVIDIA - Corporation.” - - 4. Unless a developer tool is identified in this Agreement - as distributable, it is delivered for your internal use - only. - - 5. The terms under which you distribute your application - must be consistent with the terms of this Agreement, - including (without limitation) terms relating to the - license grant and license restrictions and protection of - NVIDIA’s intellectual property rights. Additionally, you - agree that you will protect the privacy, security and - legal rights of your application users. - - 6. You agree to notify NVIDIA in writing of any known or - suspected distribution or use of the SDK not in compliance - with the requirements of this Agreement, and to enforce - the terms of your agreements with respect to distributed - SDK. - - -1.1.3. Authorized Users - -You may allow employees and contractors of your entity or of -your subsidiary(ies) to access and use the SDK from your -secure network to perform work on your behalf. - -If you are an academic institution you may allow users -enrolled or employed by the academic institution to access and -use the SDK from your secure network. - -You are responsible for the compliance with the terms of this -Agreement by your authorized users. If you become aware that -your authorized users didn’t follow the terms of this -Agreement, you agree to take reasonable steps to resolve the -non-compliance and prevent new occurrences. - - -1.1.4. Pre-Release SDK - -The SDK versions identified as alpha, beta, preview or -otherwise as pre-release, may not be fully functional, may -contain errors or design flaws, and may have reduced or -different security, privacy, accessibility, availability, and -reliability standards relative to commercial versions of -NVIDIA software and materials. Use of a pre-release SDK may -result in unexpected results, loss of data, project delays or -other unpredictable damage or loss. - -You may use a pre-release SDK at your own risk, understanding -that pre-release SDKs are not intended for use in production -or business-critical systems. - -NVIDIA may choose not to make available a commercial version -of any pre-release SDK. NVIDIA may also choose to abandon -development and terminate the availability of a pre-release -SDK at any time without liability. - - -1.1.5. Updates - -NVIDIA may, at its option, make available patches, workarounds -or other updates to this SDK. Unless the updates are provided -with their separate governing terms, they are deemed part of -the SDK licensed to you as provided in this Agreement. You -agree that the form and content of the SDK that NVIDIA -provides may change without prior notice to you. While NVIDIA -generally maintains compatibility between versions, NVIDIA may -in some cases make changes that introduce incompatibilities in -future versions of the SDK. - - -1.1.6. Components Under Other Licenses - -The SDK may come bundled with, or otherwise include or be -distributed with, NVIDIA or third-party components with -separate legal notices or terms as may be described in -proprietary notices accompanying the SDK. If and to the extent -there is a conflict between the terms in this Agreement and -the license terms associated with the component, the license -terms associated with the components control only to the -extent necessary to resolve the conflict. - -Subject to the other terms of this Agreement, you may use the -SDK to develop and test applications released under Open -Source Initiative (OSI) approved open source software -licenses. - - -1.1.7. Reservation of Rights - -NVIDIA reserves all rights, title, and interest in and to the -SDK, not expressly granted to you under this Agreement. - - -1.2. Limitations - -The following license limitations apply to your use of the -SDK: - - 1. You may not reverse engineer, decompile or disassemble, - or remove copyright or other proprietary notices from any - portion of the SDK or copies of the SDK. - - 2. Except as expressly provided in this Agreement, you may - not copy, sell, rent, sublicense, transfer, distribute, - modify, or create derivative works of any portion of the - SDK. For clarity, you may not distribute or sublicense the - SDK as a stand-alone product. - - 3. Unless you have an agreement with NVIDIA for this - purpose, you may not indicate that an application created - with the SDK is sponsored or endorsed by NVIDIA. - - 4. You may not bypass, disable, or circumvent any - encryption, security, digital rights management or - authentication mechanism in the SDK. - - 5. You may not use the SDK in any manner that would cause it - to become subject to an open source software license. As - examples, licenses that require as a condition of use, - modification, and/or distribution that the SDK be: - - a. Disclosed or distributed in source code form; - - b. Licensed for the purpose of making derivative works; - or - - c. Redistributable at no charge. - - 6. You acknowledge that the SDK as delivered is not tested - or certified by NVIDIA for use in connection with the - design, construction, maintenance, and/or operation of any - system where the use or failure of such system could - result in a situation that threatens the safety of human - life or results in catastrophic damages (each, a "Critical - Application"). Examples of Critical Applications include - use in avionics, navigation, autonomous vehicle - applications, ai solutions for automotive products, - military, medical, life support or other life critical - applications. NVIDIA shall not be liable to you or any - third party, in whole or in part, for any claims or - damages arising from such uses. You are solely responsible - for ensuring that any product or service developed with - the SDK as a whole includes sufficient features to comply - with all applicable legal and regulatory standards and - requirements. - - 7. You agree to defend, indemnify and hold harmless NVIDIA - and its affiliates, and their respective employees, - contractors, agents, officers and directors, from and - against any and all claims, damages, obligations, losses, - liabilities, costs or debt, fines, restitutions and - expenses (including but not limited to attorney’s fees - and costs incident to establishing the right of - indemnification) arising out of or related to products or - services that use the SDK in or for Critical Applications, - and for use of the SDK outside of the scope of this - Agreement or not in compliance with its terms. - - 8. You may not reverse engineer, decompile or disassemble - any portion of the output generated using SDK elements for - the purpose of translating such output artifacts to target - a non-NVIDIA platform. - - -1.3. Ownership - - 1. NVIDIA or its licensors hold all rights, title and - interest in and to the SDK and its modifications and - derivative works, including their respective intellectual - property rights, subject to your rights under Section - 1.3.2. This SDK may include software and materials from - NVIDIA’s licensors, and these licensors are intended - third party beneficiaries that may enforce this Agreement - with respect to their intellectual property rights. - - 2. You hold all rights, title and interest in and to your - applications and your derivative works of the sample - source code delivered in the SDK, including their - respective intellectual property rights, subject to - NVIDIA’s rights under Section 1.3.1. - - 3. You may, but don’t have to, provide to NVIDIA - suggestions, feature requests or other feedback regarding - the SDK, including possible enhancements or modifications - to the SDK. For any feedback that you voluntarily provide, - you hereby grant NVIDIA and its affiliates a perpetual, - non-exclusive, worldwide, irrevocable license to use, - reproduce, modify, license, sublicense (through multiple - tiers of sublicensees), and distribute (through multiple - tiers of distributors) it without the payment of any - royalties or fees to you. NVIDIA will use feedback at its - choice. NVIDIA is constantly looking for ways to improve - its products, so you may send feedback to NVIDIA through - the developer portal at https://developer.nvidia.com. - - -1.4. No Warranties - -THE SDK IS PROVIDED BY NVIDIA “AS IS” AND “WITH ALL -FAULTS.” TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND -ITS AFFILIATES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND -OR NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, -BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, OR THE -ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. NO -WARRANTY IS MADE ON THE BASIS OF TRADE USAGE, COURSE OF -DEALING OR COURSE OF TRADE. - - -1.5. Limitation of Liability - -TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS -AFFILIATES SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, -PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, LOSS -OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS OF -PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION -WITH THIS AGREEMENT OR THE USE OR PERFORMANCE OF THE SDK, -WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED UPON BREACH -OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE), -PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF -LIABILITY. IN NO EVENT WILL NVIDIA’S AND ITS AFFILIATES -TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THIS -AGREEMENT EXCEED US$10.00. THE NATURE OF THE LIABILITY OR THE -NUMBER OF CLAIMS OR SUITS SHALL NOT ENLARGE OR EXTEND THIS -LIMIT. - -These exclusions and limitations of liability shall apply -regardless if NVIDIA or its affiliates have been advised of -the possibility of such damages, and regardless of whether a -remedy fails its essential purpose. These exclusions and -limitations of liability form an essential basis of the -bargain between the parties, and, absent any of these -exclusions or limitations of liability, the provisions of this -Agreement, including, without limitation, the economic terms, -would be substantially different. - - -1.6. Termination - - 1. This Agreement will continue to apply until terminated by - either you or NVIDIA as described below. - - 2. If you want to terminate this Agreement, you may do so by - stopping to use the SDK. - - 3. NVIDIA may, at any time, terminate this Agreement if: - - a. (i) you fail to comply with any term of this - Agreement and the non-compliance is not fixed within - thirty (30) days following notice from NVIDIA (or - immediately if you violate NVIDIA’s intellectual - property rights); - - b. (ii) you commence or participate in any legal - proceeding against NVIDIA with respect to the SDK; or - - c. (iii) NVIDIA decides to no longer provide the SDK in - a country or, in NVIDIA’s sole discretion, the - continued use of it is no longer commercially viable. - - 4. Upon any termination of this Agreement, you agree to - promptly discontinue use of the SDK and destroy all copies - in your possession or control. Your prior distributions in - accordance with this Agreement are not affected by the - termination of this Agreement. Upon written request, you - will certify in writing that you have complied with your - commitments under this section. Upon any termination of - this Agreement all provisions survive except for the - license grant provisions. - - -1.7. General - -If you wish to assign this Agreement or your rights and -obligations, including by merger, consolidation, dissolution -or operation of law, contact NVIDIA to ask for permission. Any -attempted assignment not approved by NVIDIA in writing shall -be void and of no effect. NVIDIA may assign, delegate or -transfer this Agreement and its rights and obligations, and if -to a non-affiliate you will be notified. - -You agree to cooperate with NVIDIA and provide reasonably -requested information to verify your compliance with this -Agreement. - -This Agreement will be governed in all respects by the laws of -the United States and of the State of Delaware as those laws -are applied to contracts entered into and performed entirely -within Delaware by Delaware residents, without regard to the -conflicts of laws principles. The United Nations Convention on -Contracts for the International Sale of Goods is specifically -disclaimed. You agree to all terms of this Agreement in the -English language. - -The state or federal courts residing in Santa Clara County, -California shall have exclusive jurisdiction over any dispute -or claim arising out of this Agreement. Notwithstanding this, -you agree that NVIDIA shall still be allowed to apply for -injunctive remedies or an equivalent type of urgent legal -relief in any jurisdiction. - -If any court of competent jurisdiction determines that any -provision of this Agreement is illegal, invalid or -unenforceable, such provision will be construed as limited to -the extent necessary to be consistent with and fully -enforceable under the law and the remaining provisions will -remain in full force and effect. Unless otherwise specified, -remedies are cumulative. - -Each party acknowledges and agrees that the other is an -independent contractor in the performance of this Agreement. - -The SDK has been developed entirely at private expense and is -“commercial items” consisting of “commercial computer -software” and “commercial computer software -documentation” provided with RESTRICTED RIGHTS. Use, -duplication or disclosure by the U.S. Government or a U.S. -Government subcontractor is subject to the restrictions in -this Agreement pursuant to DFARS 227.7202-3(a) or as set forth -in subparagraphs (c)(1) and (2) of the Commercial Computer -Software - Restricted Rights clause at FAR 52.227-19, as -applicable. Contractor/manufacturer is NVIDIA, 2788 San Tomas -Expressway, Santa Clara, CA 95051. - -The SDK is subject to United States export laws and -regulations. You agree that you will not ship, transfer or -export the SDK into any country, or use the SDK in any manner, -prohibited by the United States Bureau of Industry and -Security or economic sanctions regulations administered by the -U.S. Department of Treasury’s Office of Foreign Assets -Control (OFAC), or any applicable export laws, restrictions or -regulations. These laws include restrictions on destinations, -end users and end use. By accepting this Agreement, you -confirm that you are not a resident or citizen of any country -currently embargoed by the U.S. and that you are not otherwise -prohibited from receiving the SDK. - -Any notice delivered by NVIDIA to you under this Agreement -will be delivered via mail, email or fax. You agree that any -notices that NVIDIA sends you electronically will satisfy any -legal communication requirements. Please direct your legal -notices or other correspondence to NVIDIA Corporation, 2788 -San Tomas Expressway, Santa Clara, California 95051, United -States of America, Attention: Legal Department. - -This Agreement and any exhibits incorporated into this -Agreement constitute the entire agreement of the parties with -respect to the subject matter of this Agreement and supersede -all prior negotiations or documentation exchanged between the -parties relating to this SDK license. Any additional and/or -conflicting terms on documents issued by you are null, void, -and invalid. Any amendment or waiver under this Agreement -shall be in writing and signed by representatives of both -parties. - - -2. CUDA Toolkit Supplement to Software License Agreement for -NVIDIA Software Development Kits ------------------------------------------------------------- - -The terms in this supplement govern your use of the NVIDIA -CUDA Toolkit SDK under the terms of your license agreement -(“Agreement”) as modified by this supplement. Capitalized -terms used but not defined below have the meaning assigned to -them in the Agreement. - -This supplement is an exhibit to the Agreement and is -incorporated as an integral part of the Agreement. In the -event of conflict between the terms in this supplement and the -terms in the Agreement, the terms in this supplement govern. - - -2.1. License Scope - -The SDK is licensed for you to develop applications only for -use in systems with NVIDIA GPUs. - - -2.2. Distribution - -The portions of the SDK that are distributable under the -Agreement are listed in Attachment A. - - -2.3. Operating Systems - -Those portions of the SDK designed exclusively for use on the -Linux or FreeBSD operating systems, or other operating systems -derived from the source code to these operating systems, may -be copied and redistributed for use in accordance with this -Agreement, provided that the object code files are not -modified in any way (except for unzipping of compressed -files). - - -2.4. Audio and Video Encoders and Decoders - -You acknowledge and agree that it is your sole responsibility -to obtain any additional third-party licenses required to -make, have made, use, have used, sell, import, and offer for -sale your products or services that include or incorporate any -third-party software and content relating to audio and/or -video encoders and decoders from, including but not limited -to, Microsoft, Thomson, Fraunhofer IIS, Sisvel S.p.A., -MPEG-LA, and Coding Technologies. NVIDIA does not grant to you -under this Agreement any necessary patent or other rights with -respect to any audio and/or video encoders and decoders. - - -2.5. Licensing - -If the distribution terms in this Agreement are not suitable -for your organization, or for any questions regarding this -Agreement, please contact NVIDIA at -nvidia-compute-license-questions@nvidia.com. - - -2.6. Attachment A - -The following CUDA Toolkit files may be distributed with -Licensee Applications developed by you, including certain -variations of these files that have version number or -architecture specific information embedded in the file name - -as an example only, for release version 9.0 of the 64-bit -Windows software, the file cudart64_90.dll is redistributable. - -Component - -CUDA Runtime - -Windows - -cudart.dll, cudart_static.lib, cudadevrt.lib - -Mac OSX - -libcudart.dylib, libcudart_static.a, libcudadevrt.a - -Linux - -libcudart.so, libcudart_static.a, libcudadevrt.a - -Android - -libcudart.so, libcudart_static.a, libcudadevrt.a - -Component - -CUDA FFT Library - -Windows - -cufft.dll, cufftw.dll, cufft.lib, cufftw.lib - -Mac OSX - -libcufft.dylib, libcufft_static.a, libcufftw.dylib, -libcufftw_static.a - -Linux - -libcufft.so, libcufft_static.a, libcufftw.so, -libcufftw_static.a - -Android - -libcufft.so, libcufft_static.a, libcufftw.so, -libcufftw_static.a - -Component - -CUDA BLAS Library - -Windows - -cublas.dll, cublasLt.dll - -Mac OSX - -libcublas.dylib, libcublasLt.dylib, libcublas_static.a, -libcublasLt_static.a - -Linux - -libcublas.so, libcublasLt.so, libcublas_static.a, -libcublasLt_static.a - -Android - -libcublas.so, libcublasLt.so, libcublas_static.a, -libcublasLt_static.a - -Component - -NVIDIA "Drop-in" BLAS Library - -Windows - -nvblas.dll - -Mac OSX - -libnvblas.dylib - -Linux - -libnvblas.so - -Component - -CUDA Sparse Matrix Library - -Windows - -cusparse.dll, cusparse.lib - -Mac OSX - -libcusparse.dylib, libcusparse_static.a - -Linux - -libcusparse.so, libcusparse_static.a - -Android - -libcusparse.so, libcusparse_static.a - -Component - -CUDA Linear Solver Library - -Windows - -cusolver.dll, cusolver.lib - -Mac OSX - -libcusolver.dylib, libcusolver_static.a - -Linux - -libcusolver.so, libcusolver_static.a - -Android - -libcusolver.so, libcusolver_static.a - -Component - -CUDA Random Number Generation Library - -Windows - -curand.dll, curand.lib - -Mac OSX - -libcurand.dylib, libcurand_static.a - -Linux - -libcurand.so, libcurand_static.a - -Android - -libcurand.so, libcurand_static.a - -Component - -NVIDIA Performance Primitives Library - -Windows - -nppc.dll, nppc.lib, nppial.dll, nppial.lib, nppicc.dll, -nppicc.lib, nppicom.dll, nppicom.lib, nppidei.dll, -nppidei.lib, nppif.dll, nppif.lib, nppig.dll, nppig.lib, -nppim.dll, nppim.lib, nppist.dll, nppist.lib, nppisu.dll, -nppisu.lib, nppitc.dll, nppitc.lib, npps.dll, npps.lib - -Mac OSX - -libnppc.dylib, libnppc_static.a, libnppial.dylib, -libnppial_static.a, libnppicc.dylib, libnppicc_static.a, -libnppicom.dylib, libnppicom_static.a, libnppidei.dylib, -libnppidei_static.a, libnppif.dylib, libnppif_static.a, -libnppig.dylib, libnppig_static.a, libnppim.dylib, -libnppisu_static.a, libnppitc.dylib, libnppitc_static.a, -libnpps.dylib, libnpps_static.a - -Linux - -libnppc.so, libnppc_static.a, libnppial.so, -libnppial_static.a, libnppicc.so, libnppicc_static.a, -libnppicom.so, libnppicom_static.a, libnppidei.so, -libnppidei_static.a, libnppif.so, libnppif_static.a -libnppig.so, libnppig_static.a, libnppim.so, -libnppim_static.a, libnppist.so, libnppist_static.a, -libnppisu.so, libnppisu_static.a, libnppitc.so -libnppitc_static.a, libnpps.so, libnpps_static.a - -Android - -libnppc.so, libnppc_static.a, libnppial.so, -libnppial_static.a, libnppicc.so, libnppicc_static.a, -libnppicom.so, libnppicom_static.a, libnppidei.so, -libnppidei_static.a, libnppif.so, libnppif_static.a -libnppig.so, libnppig_static.a, libnppim.so, -libnppim_static.a, libnppist.so, libnppist_static.a, -libnppisu.so, libnppisu_static.a, libnppitc.so -libnppitc_static.a, libnpps.so, libnpps_static.a - -Component - -NVIDIA JPEG Library - -Windows - -nvjpeg.lib, nvjpeg.dll - -Linux - -libnvjpeg.so, libnvjpeg_static.a - -Component - -Internal common library required for statically linking to -cuBLAS, cuSPARSE, cuFFT, cuRAND, nvJPEG and NPP - -Mac OSX - -libculibos.a - -Linux - -libculibos.a - -Component - -NVIDIA Runtime Compilation Library and Header - -All - -nvrtc.h - -Windows - -nvrtc.dll, nvrtc-builtins.dll - -Mac OSX - -libnvrtc.dylib, libnvrtc-builtins.dylib - -Linux - -libnvrtc.so, libnvrtc-builtins.so - -Component - -NVIDIA Optimizing Compiler Library - -Windows - -nvvm.dll - -Mac OSX - -libnvvm.dylib - -Linux - -libnvvm.so - -Component - -NVIDIA Common Device Math Functions Library - -Windows - -libdevice.10.bc - -Mac OSX - -libdevice.10.bc - -Linux - -libdevice.10.bc - -Component - -CUDA Occupancy Calculation Header Library - -All - -cuda_occupancy.h - -Component - -CUDA Half Precision Headers - -All - -cuda_fp16.h, cuda_fp16.hpp - -Component - -CUDA Profiling Tools Interface (CUPTI) Library - -Windows - -cupti.dll - -Mac OSX - -libcupti.dylib - -Linux - -libcupti.so - -Component - -NVIDIA Tools Extension Library - -Windows - -nvToolsExt.dll, nvToolsExt.lib - -Mac OSX - -libnvToolsExt.dylib - -Linux - -libnvToolsExt.so - -Component - -NVIDIA CUDA Driver Libraries - -Linux - -libcuda.so, libnvidia-ptxjitcompiler.so - -Component - -NVIDIA CUDA File IO Libraries and Header - -All - -cufile.h - -Linux - -libcufile.so, libcufile_rdma.so, libcufile_static.a, -libcufile_rdma_static.a - -The NVIDIA CUDA Driver Libraries are only distributable in -applications that meet this criteria: - - 1. The application was developed starting from a NVIDIA CUDA - container obtained from Docker Hub or the NVIDIA GPU - Cloud, and - - 2. The resulting application is packaged as a Docker - container and distributed to users on Docker Hub or the - NVIDIA GPU Cloud only. - -In addition to the rights above, for parties that are -developing software intended solely for use on Jetson -development kits or Jetson modules, and running Linux for -Tegra software, the following shall apply: - - * The SDK may be distributed in its entirety, as provided by - NVIDIA, and without separation of its components, for you - and/or your licensees to create software development kits - for use only on the Jetson platform and running Linux for - Tegra software. - - -2.7. Attachment B - - -Additional Licensing Obligations - -The following third party components included in the SOFTWARE -are licensed to Licensee pursuant to the following terms and -conditions: - - 1. Licensee's use of the GDB third party component is - subject to the terms and conditions of GNU GPL v3: - - This product includes copyrighted third-party software licensed - under the terms of the GNU General Public License v3 ("GPL v3"). - All third-party software packages are copyright by their respective - authors. GPL v3 terms and conditions are hereby incorporated into - the Agreement by this reference: http://www.gnu.org/licenses/gpl.txt - - Consistent with these licensing requirements, the software - listed below is provided under the terms of the specified - open source software licenses. To obtain source code for - software provided under licenses that require - redistribution of source code, including the GNU General - Public License (GPL) and GNU Lesser General Public License - (LGPL), contact oss-requests@nvidia.com. This offer is - valid for a period of three (3) years from the date of the - distribution of this product by NVIDIA CORPORATION. - - Component License - CUDA-GDB GPL v3 - - 2. Licensee represents and warrants that any and all third - party licensing and/or royalty payment obligations in - connection with Licensee's use of the H.264 video codecs - are solely the responsibility of Licensee. - - 3. Licensee's use of the Thrust library is subject to the - terms and conditions of the Apache License Version 2.0. - All third-party software packages are copyright by their - respective authors. Apache License Version 2.0 terms and - conditions are hereby incorporated into the Agreement by - this reference. - http://www.apache.org/licenses/LICENSE-2.0.html - - In addition, Licensee acknowledges the following notice: - Thrust includes source code from the Boost Iterator, - Tuple, System, and Random Number libraries. - - Boost Software License - Version 1.0 - August 17th, 2003 - . . . . - - Permission is hereby granted, free of charge, to any person or - organization obtaining a copy of the software and accompanying - documentation covered by this license (the "Software") to use, - reproduce, display, distribute, execute, and transmit the Software, - and to prepare derivative works of the Software, and to permit - third-parties to whom the Software is furnished to do so, all - subject to the following: - - The copyright notices in the Software and this entire statement, - including the above license grant, this restriction and the following - disclaimer, must be included in all copies of the Software, in whole - or in part, and all derivative works of the Software, unless such - copies or derivative works are solely in the form of machine-executable - object code generated by a source language processor. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND - NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR - ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR - OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - 4. Licensee's use of the LLVM third party component is - subject to the following terms and conditions: - - ====================================================== - LLVM Release License - ====================================================== - University of Illinois/NCSA - Open Source License - - Copyright (c) 2003-2010 University of Illinois at Urbana-Champaign. - All rights reserved. - - Developed by: - - LLVM Team - - University of Illinois at Urbana-Champaign - - http://llvm.org - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal with the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimers. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimers in the - documentation and/or other materials provided with the distribution. - - * Neither the names of the LLVM Team, University of Illinois at Urbana- - Champaign, nor the names of its contributors may be used to endorse or - promote products derived from this Software without specific prior - written permission. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS WITH THE SOFTWARE. - - 5. Licensee's use of the PCRE third party component is - subject to the following terms and conditions: - - ------------ - PCRE LICENCE - ------------ - PCRE is a library of functions to support regular expressions whose syntax - and semantics are as close as possible to those of the Perl 5 language. - Release 8 of PCRE is distributed under the terms of the "BSD" licence, as - specified below. The documentation for PCRE, supplied in the "doc" - directory, is distributed under the same terms as the software itself. The - basic library functions are written in C and are freestanding. Also - included in the distribution is a set of C++ wrapper functions, and a just- - in-time compiler that can be used to optimize pattern matching. These are - both optional features that can be omitted when the library is built. - - THE BASIC LIBRARY FUNCTIONS - --------------------------- - Written by: Philip Hazel - Email local part: ph10 - Email domain: cam.ac.uk - University of Cambridge Computing Service, - Cambridge, England. - Copyright (c) 1997-2012 University of Cambridge - All rights reserved. - - PCRE JUST-IN-TIME COMPILATION SUPPORT - ------------------------------------- - Written by: Zoltan Herczeg - Email local part: hzmester - Emain domain: freemail.hu - Copyright(c) 2010-2012 Zoltan Herczeg - All rights reserved. - - STACK-LESS JUST-IN-TIME COMPILER - -------------------------------- - Written by: Zoltan Herczeg - Email local part: hzmester - Emain domain: freemail.hu - Copyright(c) 2009-2012 Zoltan Herczeg - All rights reserved. - - THE C++ WRAPPER FUNCTIONS - ------------------------- - Contributed by: Google Inc. - Copyright (c) 2007-2012, Google Inc. - All rights reserved. - - THE "BSD" LICENCE - ----------------- - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the name of Google - Inc. nor the names of their contributors may be used to endorse or - promote products derived from this software without specific prior - written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - 6. Some of the cuBLAS library routines were written by or - derived from code written by Vasily Volkov and are subject - to the Modified Berkeley Software Distribution License as - follows: - - Copyright (c) 2007-2009, Regents of the University of California - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of the University of California, Berkeley nor - the names of its contributors may be used to endorse or promote - products derived from this software without specific prior - written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - 7. Some of the cuBLAS library routines were written by or - derived from code written by Davide Barbieri and are - subject to the Modified Berkeley Software Distribution - License as follows: - - Copyright (c) 2008-2009 Davide Barbieri @ University of Rome Tor Vergata. - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * The name of the author may not be used to endorse or promote - products derived from this software without specific prior - written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - 8. Some of the cuBLAS library routines were derived from - code developed by the University of Tennessee and are - subject to the Modified Berkeley Software Distribution - License as follows: - - Copyright (c) 2010 The University of Tennessee. - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer listed in this license in the documentation and/or - other materials provided with the distribution. - * Neither the name of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - 9. Some of the cuBLAS library routines were written by or - derived from code written by Jonathan Hogg and are subject - to the Modified Berkeley Software Distribution License as - follows: - - Copyright (c) 2012, The Science and Technology Facilities Council (STFC). - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of the STFC nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE STFC BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - 10. Some of the cuBLAS library routines were written by or - derived from code written by Ahmad M. Abdelfattah, David - Keyes, and Hatem Ltaief, and are subject to the Apache - License, Version 2.0, as follows: - - -- (C) Copyright 2013 King Abdullah University of Science and Technology - Authors: - Ahmad Abdelfattah (ahmad.ahmad@kaust.edu.sa) - David Keyes (david.keyes@kaust.edu.sa) - Hatem Ltaief (hatem.ltaief@kaust.edu.sa) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the King Abdullah University of Science and - Technology nor the names of its contributors may be used to endorse - or promote products derived from this software without specific prior - written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE - - 11. Some of the cuSPARSE library routines were written by or - derived from code written by Li-Wen Chang and are subject - to the NCSA Open Source License as follows: - - Copyright (c) 2012, University of Illinois. - - All rights reserved. - - Developed by: IMPACT Group, University of Illinois, http://impact.crhc.illinois.edu - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal with the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimers in the documentation and/or other materials provided - with the distribution. - * Neither the names of IMPACT Group, University of Illinois, nor - the names of its contributors may be used to endorse or promote - products derived from this Software without specific prior - written permission. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR - IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE - SOFTWARE. - - 12. Some of the cuRAND library routines were written by or - derived from code written by Mutsuo Saito and Makoto - Matsumoto and are subject to the following license: - - Copyright (c) 2009, 2010 Mutsuo Saito, Makoto Matsumoto and Hiroshima - University. All rights reserved. - - Copyright (c) 2011 Mutsuo Saito, Makoto Matsumoto, Hiroshima - University and University of Tokyo. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of the Hiroshima University nor the names of - its contributors may be used to endorse or promote products - derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - 13. Some of the cuRAND library routines were derived from - code developed by D. E. Shaw Research and are subject to - the following license: - - Copyright 2010-2011, D. E. Shaw Research. - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions, and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions, and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of D. E. Shaw Research nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - 14. Some of the Math library routines were written by or - derived from code developed by Norbert Juffa and are - subject to the following license: - - Copyright (c) 2015-2017, Norbert Juffa - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - 15. Licensee's use of the lz4 third party component is - subject to the following terms and conditions: - - Copyright (C) 2011-2013, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - 16. The NPP library uses code from the Boost Math Toolkit, - and is subject to the following license: - - Boost Software License - Version 1.0 - August 17th, 2003 - . . . . - - Permission is hereby granted, free of charge, to any person or - organization obtaining a copy of the software and accompanying - documentation covered by this license (the "Software") to use, - reproduce, display, distribute, execute, and transmit the Software, - and to prepare derivative works of the Software, and to permit - third-parties to whom the Software is furnished to do so, all - subject to the following: - - The copyright notices in the Software and this entire statement, - including the above license grant, this restriction and the following - disclaimer, must be included in all copies of the Software, in whole - or in part, and all derivative works of the Software, unless such - copies or derivative works are solely in the form of machine-executable - object code generated by a source language processor. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND - NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR - ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR - OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - 17. Portions of the Nsight Eclipse Edition is subject to the - following license: - - The Eclipse Foundation makes available all content in this plug-in - ("Content"). Unless otherwise indicated below, the Content is provided - to you under the terms and conditions of the Eclipse Public License - Version 1.0 ("EPL"). A copy of the EPL is available at http:// - www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" - will mean the Content. - - If you did not receive this Content directly from the Eclipse - Foundation, the Content is being redistributed by another party - ("Redistributor") and different terms and conditions may apply to your - use of any object code in the Content. Check the Redistributor's - license that was provided with the Content. If no such license exists, - contact the Redistributor. Unless otherwise indicated below, the terms - and conditions of the EPL still apply to any source code in the - Content and such source code may be obtained at http://www.eclipse.org. - - 18. Some of the cuBLAS library routines uses code from - OpenAI, which is subject to the following license: - - License URL - https://github.com/openai/openai-gemm/blob/master/LICENSE - - License Text - The MIT License - - Copyright (c) 2016 OpenAI (http://openai.com), 2016 Google Inc. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - 19. Licensee's use of the Visual Studio Setup Configuration - Samples is subject to the following license: - - The MIT License (MIT) - Copyright (C) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - 20. Licensee's use of linmath.h header for CPU functions for - GL vector/matrix operations from lunarG is subject to the - Apache License Version 2.0. - - 21. The DX12-CUDA sample uses the d3dx12.h header, which is - subject to the MIT license . - ------------------ diff --git a/voicevox_engine/tools/licenses/cudnn/LICENSE b/voicevox_engine/tools/licenses/cudnn/LICENSE deleted file mode 100644 index 1aafb2b5ec281d18a1c3a2b04e77e2ad53eaf30d..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/licenses/cudnn/LICENSE +++ /dev/null @@ -1,305 +0,0 @@ -LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS - -This license agreement, including exhibits attached ("Agreement”) is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs your use of a NVIDIA software development kit (“SDK”). - -Each SDK has its own set of software and materials, but here is a description of the types of items that may be included in a SDK: source code, header files, APIs, data sets and assets (examples include images, textures, models, scenes, videos, native API input/output files), binary software, sample code, libraries, utility programs, programming code and documentation. - -This Agreement can be accepted only by an adult of legal age of majority in the country in which the SDK is used. - -If you are entering into this Agreement on behalf of a company or other legal entity, you represent that you have the legal authority to bind the entity to this Agreement, in which case “you” will mean the entity you represent. - -If you don’t have the required age or authority to accept this Agreement, or if you don’t accept all the terms and conditions of this Agreement, do not download, install or use the SDK. - -You agree to use the SDK only for purposes that are permitted by (a) this Agreement, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions. - -Chapter 1. License. - -1.1. Grant - -Subject to the terms of this Agreement, NVIDIA hereby grants you a non-exclusive, non-transferable license, without the right to sublicense (except as expressly provided in this Agreement) to: - -(i) Install and use the SDK, - -(ii) Modify and create derivative works of sample source code delivered in the SDK, and - -(iii) Distribute those portions of the SDK that are identified in this Agreement as distributable, as incorporated in object code format into a software application that meets the distribution requirements indicated in this Agreement. - -1.2. Distribution Requirements - -These are the distribution requirements for you to exercise the distribution grant: - -(i) Your application must have material additional functionality, beyond the included portions of the SDK. - -(ii) The distributable portions of the SDK shall only be accessed by your application. - -(iii) The following notice shall be included in modifications and derivative works of sample source code distributed: “This software contains source code provided by NVIDIA Corporation.” - -(iv) Unless a developer tool is identified in this Agreement as distributable, it is delivered for your internal use only. - -(v) The terms under which you distribute your application must be consistent with the terms of this Agreement, including (without limitation) terms relating to the license grant and license restrictions and protection of NVIDIA’s intellectual property rights. Additionally, you agree that you will protect the privacy, security and legal rights of your application users. - -(vi) You agree to notify NVIDIA in writing of any known or suspected distribution or use of the SDK not in compliance with the requirements of this Agreement, and to enforce the terms of your agreements with respect to distributed SDK. - -1.3 Authorized Users - -You may allow employees and contractors of your entity or of your subsidiary(ies) to access and use the SDK from your secure network to perform work on your behalf. - -If you are an academic institution you may allow users enrolled or employed by the academic institution to access and use the SDK from your secure network. - -You are responsible for the compliance with the terms of this Agreement by your authorized users. If you become aware that your authorized users didn’t follow the terms of this Agreement, you agree to take reasonable steps to resolve the non-compliance and prevent new occurrences. - -1.4 Pre-Release SDK - -The SDK versions identified as alpha, beta, preview or otherwise as pre-release, may not be fully functional, may contain errors or design flaws, and may have reduced or different security, privacy, accessibility, availability, and reliability standards relative to commercial versions of NVIDIA software and materials. Use of a pre-release SDK may result in unexpected results, loss of data, project delays or other unpredictable damage or loss. - -You may use a pre-release SDK at your own risk, understanding that pre-release SDKs are not intended for use in production or business-critical systems. - -NVIDIA may choose not to make available a commercial version of any pre-release SDK. NVIDIA may also choose to abandon development and terminate the availability of a pre-release SDK at any time without liability. - -1.5 Updates - -NVIDIA may, at its option, make available patches, workarounds or other updates to this SDK. Unless the updates are provided with their separate governing terms, they are deemed part of the SDK licensed to you as provided in this Agreement. - -You agree that the form and content of the SDK that NVIDIA provides may change without prior notice to you. While NVIDIA generally maintains compatibility between versions, NVIDIA may in some cases make changes that introduce incompatibilities in future versions of the SDK. - -1.6 Components Under Other Licenses - -The SDK may come bundled with, or otherwise include or be distributed with, NVIDIA or third party software licensed with separate legal notices or terms as may be described in proprietary notices accompanying the SDK. If and to the extent there is a conflict between the terms in this Agreement and the license terms associated with the component, the license terms associated with the components control only to the extent necessary to resolve the conflict. - -1.7 Reservation of Rights - -NVIDIA reserves all rights, title and interest in and to the SDK not expressly granted to you under this Agreement. - -Chapter 2. Limitations. - -The following license limitations apply to your use of the SDK: - -2.1 You may not reverse engineer, decompile or disassemble, or remove copyright or other proprietary notices from any portion of the SDK or copies of the SDK. - -2.2 Except as expressly provided in this Agreement, you may not copy, sell, rent, sublicense, transfer, distribute, modify, or create derivative works of any portion of the SDK. - -2.3 Unless you have an agreement with NVIDIA for this purpose, you may not indicate that an application created with the SDK is sponsored or endorsed by NVIDIA. - -2.4 You may not bypass, disable, or circumvent any encryption, security, digital rights management or authentication mechanism in the SDK. - -2.5 You may not use the SDK in any manner that would cause it to become subject to an open source software license. As examples, licenses that require as a condition of use, modification, and/or distribution that the SDK be (i) disclosed or distributed in source code form; (ii) licensed for the purpose of making derivative works; or (iii) redistributable at no charge. - -2.6 You acknowledge that the SDK as delivered is not tested or certified by NVIDIA for use in connection with the design, construction, maintenance, and/or operation of any system where the use or failure of such system could result in a situation that threatens the safety of human life or results in catastrophic damages (each, a “Critical Application”). Examples of Critical Applications include use in avionics, navigation, autonomous vehicle applications, ai solutions for automotive products, military, medical, life support or other life critical applications. NVIDIA shall not be liable to you or any third party, in whole or in part, for any claims or damages arising from such uses. You are solely responsible for ensuring that any product or service developed with the SDK as a whole includes sufficient features to comply with all applicable legal and regulatory standards and requirements. - -2.7 You agree to defend, indemnify and hold harmless NVIDIA and its affiliates, and their respective employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, fines, restitutions and expenses (including but not limited to attorney’s fees and costs incident to establishing the right of indemnification) arising out of or related to products or services that use the SDK in or for Critical Applications, and for use of the SDK, outside of the scope of this Agreement or not in compliance with its terms. - -Chapter 3. Ownership. - -3.1 NVIDIA or its licensors hold all rights, title and interest in and to the SDK and its modifications and derivative works, including their respective intellectual property rights, subject to your rights under Section 3.2. This SDK may include software and materials from NVIDIA’s licensors, and these licensors are intended third party beneficiaries that may enforce this Agreement with respect to their intellectual property rights. - -3.2 You hold all rights, title and interest in and to your applications and your derivative works of the sample source code delivered in the SDK, including their respective intellectual property rights, subject to NVIDIA’s rights under section 3.1. - -3.3 You may, but don’t have to, provide to NVIDIA suggestions, feature requests or other feedback regarding the SDK, including possible enhancements or modifications to the SDK. For any feedback that you voluntarily provide, you hereby grant NVIDIA and its affiliates a perpetual, non-exclusive, worldwide, irrevocable license to use, reproduce, modify, license, sublicense (through multiple tiers of sublicensees), and distribute (through multiple tiers of distributors) it without the payment of any royalties or fees to you. NVIDIA will use feedback at its choice. NVIDIA is constantly looking for ways to improve its products, so you may send feedback to NVIDIA through the developer portal at https://developer.nvidia.com. - -Chapter 4. No Warranties. - -THE SDK IS PROVIDED BY NVIDIA “AS IS” AND “WITH ALL FAULTS.” TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND OR NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, OR THE ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. NO WARRANTY IS MADE ON THE BASIS OF TRADE USAGE, COURSE OF DEALING OR COURSE OF TRADE. - -Chapter 5. Limitations of Liability. - -TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, LOSS OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS OF PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT OR THE USE OR PERFORMANCE OF THE SDK, WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED UPON BREACH OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF LIABILITY. IN NO EVENT WILL NVIDIA’S AND ITS AFFILIATES TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THIS AGREEMENT EXCEED US$10.00. THE NATURE OF THE LIABILITY OR THE NUMBER OF CLAIMS OR SUITS SHALL NOT ENLARGE OR EXTEND THIS LIMIT. - -These exclusions and limitations of liability shall apply regardless if NVIDIA or its affiliates have been advised of the possibility of such damages, and regardless of whether a remedy fails its essential purpose. These exclusions and limitations of liability form an essential basis of the bargain between the parties, and, absent any of these exclusions or limitations of liability, the provisions of this Agreement, including, without limitation, the economic terms, would be substantially different. - -Chapter 6. Termination. - -6.1 This Agreement will continue to apply until terminated by either you or NVIDIA as described below. - -6.2 If you want to terminate this Agreement, you may do so by stopping to use the SDK. - -6.3 NVIDIA may, at any time, terminate this Agreement if: (i) you fail to comply with any term of this Agreement and the non-compliance is not fixed within thirty (30) days following notice from NVIDIA (or immediately if you violate NVIDIA’s intellectual property rights); (ii) you commence or participate in any legal proceeding against NVIDIA with respect to the SDK; or (iii) NVIDIA decides to no longer provide the SDK in a country or, in NVIDIA’s sole discretion, the continued use of it is no longer commercially viable. - -6.4 Upon any termination of this Agreement, you agree to promptly discontinue use of the SDK and destroy all copies in your possession or control. Your prior distributions in accordance with this Agreement are not affected by the termination of this Agreement. Upon written request, you will certify in writing that you have complied with your commitments under this section. Upon any termination of this Agreement all provisions survive except for the licenses granted to you. - -Chapter 7. General. - -If you wish to assign this Agreement or your rights and obligations, including by merger, consolidation, dissolution or operation of law, contact NVIDIA to ask for permission. Any attempted assignment not approved by NVIDIA in writing shall be void and of no effect. NVIDIA may assign, delegate or transfer this Agreement and its rights and obligations, and if to a non-affiliate you will be notified. - -You agree to cooperate with NVIDIA and provide reasonably requested information to verify your compliance with this Agreement. - -This Agreement will be governed in all respects by the laws of the United States and of the State of Delaware as those laws are applied to contracts entered into and performed entirely within Delaware by Delaware residents, without regard to the conflicts of laws principles. The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. You agree to all terms of this Agreement in the English language. - -The state or federal courts residing in Santa Clara County, California shall have exclusive jurisdiction over any dispute or claim arising out of this Agreement. Notwithstanding this, you agree that NVIDIA shall still be allowed to apply for injunctive remedies or an equivalent type of urgent legal relief in any jurisdiction. - -If any court of competent jurisdiction determines that any provision of this Agreement is illegal, invalid or unenforceable, such provision will be construed as limited to the extent necessary to be consistent with and fully enforceable under the law and the remaining provisions will remain in full force and effect. Unless otherwise specified, remedies are cumulative. - -Each party acknowledges and agrees that the other is an independent contractor in the performance of this Agreement - -The SDK has been developed entirely at private expense and is “commercial items” consisting of “commercial computer software” and “commercial computer software documentation” provided with RESTRICTED RIGHTS. Use, duplication or disclosure by the U.S. Government or a U.S. Government subcontractor is subject to the restrictions in this Agreement pursuant to DFARS 227.7202-3(a) or as set forth in subparagraphs (b)(1) and (2) of the Commercial Computer Software - Restricted Rights clause at FAR 52.227-19, as applicable. Contractor/ manufacturer is NVIDIA, 2788 San Tomas Expressway, Santa Clara, CA 95051 - -The SDK is subject to United States export laws and regulations. You agree that you will not ship, transfer or export the SDK into any country, or use the SDK in any manner, prohibited by the United States Bureau of Industry and Security or economic sanctions regulations administered by the U.S. Department of Treasury’s Office of Foreign Assets Control (OFAC), or any applicable export laws, restrictions or regulations. These laws include restrictions on destinations, end users and end use. By accepting this Agreement, you confirm that you are not a resident or citizen of any country currently embargoed by the U.S. and that you are not otherwise prohibited from receiving the SDK - -Any notice delivered by NVIDIA to you under this Agreement will be delivered via mail, email or fax. You agree that any notices that NVIDIA sends you electronically will satisfy any legal communication requirements. Please direct your legal notices or other correspondence to NVIDIA Corporation, 2788 San Tomas Expressway, Santa Clara, California 95051, United States of America, Attention: Legal Department. - -This Agreement and any exhibits incorporated into this Agreement constitute the entire agreement of the parties with respect to the subject matter of this Agreement and supersede all prior negotiations or documentation exchanged between the parties relating to this SDK license. Any additional and/or conflicting terms on documents issued by you are null, void, and invalid. Any amendment or waiver under this Agreement shall be in writing and signed by representatives of both parties. - -(v. February 22, 2022) - -Chapter 8. cuDNN SUPPLEMENT TO SOFTWARE LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS - -The terms in this supplement govern your use of the NVIDIA cuDNN SDK under the terms of your license agreement (“Agreement”) as modified by this supplement. Capitalized terms used but not defined below have the meaning assigned to them in the Agreement. - -This supplement is an exhibit to the Agreement and is incorporated as an integral part of the Agreement. In the event of conflict between the terms in this supplement and the terms in the Agreement, the terms in this supplement govern. - -4.1 License Scope. The SDK is licensed for you to develop applications only for use in systems with NVIDIA GPUs. - -2. Distribution. The following portions of the SDK are distributable under the Agreement: the runtime files .so and .dll. - -In addition to the rights above, for parties that are developing software intended solely for use on Jetson development kits or Jetson modules and running Linux for Tegra software the following shall apply: the SDK may be distributed in its entirety, as provided by NVIDIA and without separation of its components, for you and/or your licensees to create software development kits for use only on the Jetson platform and running Linux for Tegra software. - -3. Licensing. If the distribution terms in this Agreement are not suitable for your organization, or for any questions regarding this Agreement, please contact NVIDIA at nvidia-compute-license-questions@nvidia.com - -(v. February 22, 2022) - -Notice - -This document is provided for information purposes only and shall not be regarded as a warranty of a certain functionality, condition, or quality of a product. NVIDIA Corporation (“NVIDIA”) makes no representations or warranties, expressed or implied, as to the accuracy or completeness of the information contained in this document and assumes no responsibility for any errors contained herein. NVIDIA shall have no liability for the consequences or use of such information or for any infringement of patents or other rights of third parties that may result from its use. This document is not a commitment to develop, release, or deliver any Material (defined below), code, or functionality. - -NVIDIA reserves the right to make corrections, modifications, enhancements, improvements, and any other changes to this document, at any time without notice. - -Customer should obtain the latest relevant information before placing orders and should verify that such information is current and complete. - -NVIDIA products are sold subject to the NVIDIA standard terms and conditions of sale supplied at the time of order acknowledgement, unless otherwise agreed in an individual sales agreement signed by authorized representatives of NVIDIA and customer (“Terms of Sale”). NVIDIA hereby expressly objects to applying any customer general terms and conditions with regards to the purchase of the NVIDIA product referenced in this document. No contractual obligations are formed either directly or indirectly by this document. - -NVIDIA products are not designed, authorized, or warranted to be suitable for use in medical, military, aircraft, space, or life support equipment, nor in applications where failure or malfunction of the NVIDIA product can reasonably be expected to result in personal injury, death, or property or environmental damage. NVIDIA accepts no liability for inclusion and/or use of NVIDIA products in such equipment or applications and therefore such inclusion and/or use is at customer’s own risk. - -NVIDIA makes no representation or warranty that products based on this document will be suitable for any specified use. Testing of all parameters of each product is not necessarily performed by NVIDIA. It is customer’s sole responsibility to evaluate and determine the applicability of any information contained in this document, ensure the product is suitable and fit for the application planned by customer, and perform the necessary testing for the application in order to avoid a default of the application or the product. Weaknesses in customer’s product designs may affect the quality and reliability of the NVIDIA product and may result in additional or different conditions and/or requirements beyond those contained in this document. NVIDIA accepts no liability related to any default, damage, costs, or problem which may be based on or attributable to: (i) the use of the NVIDIA product in any manner that is contrary to this document or (ii) customer product designs. - -No license, either expressed or implied, is granted under any NVIDIA patent right, copyright, or other NVIDIA intellectual property right under this document. Information published by NVIDIA regarding third-party products or services does not constitute a license from NVIDIA to use such products or services or a warranty or endorsement thereof. Use of such information may require a license from a third party under the patents or other intellectual property rights of the third party, or a license from NVIDIA under the patents or other intellectual property rights of NVIDIA. - -Reproduction of information in this document is permissible only if approved in advance by NVIDIA in writing, reproduced without alteration and in full compliance with all applicable export laws and regulations, and accompanied by all associated conditions, limitations, and notices. - -THIS DOCUMENT AND ALL NVIDIA DESIGN SPECIFICATIONS, REFERENCE BOARDS, FILES, DRAWINGS, DIAGNOSTICS, LISTS, AND OTHER DOCUMENTS (TOGETHER AND SEPARATELY, “MATERIALS”) ARE BEING PROVIDED “AS IS.” NVIDIA MAKES NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL NVIDIA BE LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT LIMITATION ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF ANY USE OF THIS DOCUMENT, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Notwithstanding any damages that customer might incur for any reason whatsoever, NVIDIA’s aggregate and cumulative liability towards customer for the products described herein shall be limited in accordance with the Terms of Sale for the product. - -Arm - -Arm, AMBA and Arm Powered are registered trademarks of Arm Limited. Cortex, MPCore and Mali are trademarks of Arm Limited. "Arm" is used to represent Arm Holdings plc; its operating company Arm Limited; and the regional subsidiaries Arm Inc.; Arm KK; Arm Korea Limited.; Arm Taiwan Limited; Arm France SAS; Arm Consulting (Shanghai) Co. Ltd.; Arm Germany GmbH; Arm Embedded Technologies Pvt. Ltd.; Arm Norway, AS and Arm Sweden AB. - -HDMI - -HDMI, the HDMI logo, and High-Definition Multimedia Interface are trademarks or registered trademarks of HDMI Licensing LLC. - -Blackberry/QNX - -Copyright © 2020 BlackBerry Limited. All rights reserved. - -Trademarks, including but not limited to BLACKBERRY, EMBLEM Design, QNX, AVIAGE, MOMENTICS, NEUTRINO and QNX CAR are the trademarks or registered trademarks of BlackBerry Limited, used under license, and the exclusive rights to such trademarks are expressly reserved. - -Google - -Android, Android TV, Google Play and the Google Play logo are trademarks of Google, Inc. - -Trademarks - -NVIDIA, the NVIDIA logo, and BlueField, CUDA, DALI, DRIVE, Hopper, JetPack, Jetson AGX Xavier, Jetson Nano, Maxwell, NGC, Nsight, Orin, Pascal, Quadro, Tegra, TensorRT, Triton, Turing and Volta are trademarks and/or registered trademarks of NVIDIA Corporation in the United States and other countries. Other company and product names may be trademarks of the respective companies with which they are associated. - -Copyright - -© 2014-2023 NVIDIA Corporation & affiliates. All rights reserved. - -NVIDIA Corporation | 2788 San Tomas Expressway, Santa Clara, CA 95051 - -www.nvidia.com - -THIRD PARTY LICENSES - -zlib - -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 - - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - -*/ - - - -mateidavid/zstr - -The MIT License (MIT) - -Copyright (c) 2015 Matei David, Ontario Institute for Cancer Research - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - - -RapidJSON - -Tencent is pleased to support the open source community by making RapidJSON available. - -Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. - -Licensed under the MIT License (the "License"); you may not use this file except -in compliance with the License. You may obtain a copy of the License at - -http://opensource.org/licenses/MIT - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. - - - -{fmt} - -Copyright (c) 2012 - present, Victor Zverovich - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---- Optional exception to the license --- - -As an exception, if, as a result of your compiling your source code, portions of this Software are embedded into a machine-executable object form of such source code, you may redistribute such embedded portions in such object form without including the above copyright and permission notices. - - - -Sleef - -Copyright Naoki Shibata and contributors 2010 - 2021. -Distributed under the Boost Software License, Version 1.0. -(See accompanying file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/voicevox_engine/tools/licenses/mpg123/COPYING b/voicevox_engine/tools/licenses/mpg123/COPYING deleted file mode 100644 index 14e14f01cfc70ab24e95ad6be4fd7d6bbc1126de..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/licenses/mpg123/COPYING +++ /dev/null @@ -1,772 +0,0 @@ -This is the file that contains the terms of use, copying, etc. for the mpg123 distribution package. - -Main message, to include in "About ..." boxes, etc: - - Copyright (c) 1995-2020 by Michael Hipp and others, - free software under the terms of the LGPL v2.1 - -There is an attempt to cover the actual list of authors in the AUTHORS file. -Project maintainer since 2006 is Thomas Orgis and many people have contributed -since the Michael Hipp era, but he stays the initial source and it would -be impractical to count them all individually, so it's "and others". -Source files contain the phrase "the mpg123 project" to the same effect -in their license boilerplate; especially those that were added after -maintainership changed. The person mainly responsible for the first version -is usually named in the phrase "initially written by ...". - -All files in the distribution that don't carry a license note on their own are -licensed under the terms of the LGPL 2.1; exceptions may apply, especially to -files not in the official distribution but in the revision control repository. - -The formal license text follows. - -======================= -1. The LGPL version 2.1 -======================= - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - -==================== -2. The GPL version 2 -==================== - - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS diff --git a/voicevox_engine/tools/licenses/open_jtalk/COPYING b/voicevox_engine/tools/licenses/open_jtalk/COPYING deleted file mode 100644 index 495268369d51f7794083769e3305ef108593ab94..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/licenses/open_jtalk/COPYING +++ /dev/null @@ -1,39 +0,0 @@ -/* ----------------------------------------------------------------- */ -/* The Japanese TTS System "Open JTalk" */ -/* developed by HTS Working Group */ -/* http://open-jtalk.sourceforge.net/ */ -/* ----------------------------------------------------------------- */ -/* */ -/* Copyright (c) 2008-2016 Nagoya Institute of Technology */ -/* Department of Computer Science */ -/* */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* - Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* - Redistributions in binary form must reproduce the above */ -/* copyright notice, this list of conditions and the following */ -/* disclaimer in the documentation and/or other materials provided */ -/* with the distribution. */ -/* - Neither the name of the HTS working group nor the names of its */ -/* contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND */ -/* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, */ -/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ -/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ -/* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS */ -/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */ -/* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON */ -/* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, */ -/* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY */ -/* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ -/* POSSIBILITY OF SUCH DAMAGE. */ -/* ----------------------------------------------------------------- */ diff --git a/voicevox_engine/tools/licenses/open_jtalk/mecab-naist-jdic/COPYING b/voicevox_engine/tools/licenses/open_jtalk/mecab-naist-jdic/COPYING deleted file mode 100644 index 40bdeecb430c04ac9b463c27e7fda85699206e6c..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/licenses/open_jtalk/mecab-naist-jdic/COPYING +++ /dev/null @@ -1,69 +0,0 @@ -Copyright (c) 2009, Nara Institute of Science and Technology, Japan. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -Neither the name of the Nara Institute of Science and Technology -(NAIST) nor the names of its contributors may be used to endorse or -promote products derived from this software without specific prior -written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/* ----------------------------------------------------------------- */ -/* The Japanese TTS System "Open JTalk" */ -/* developed by HTS Working Group */ -/* http://open-jtalk.sourceforge.net/ */ -/* ----------------------------------------------------------------- */ -/* */ -/* Copyright (c) 2008-2016 Nagoya Institute of Technology */ -/* Department of Computer Science */ -/* */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* - Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* - Redistributions in binary form must reproduce the above */ -/* copyright notice, this list of conditions and the following */ -/* disclaimer in the documentation and/or other materials provided */ -/* with the distribution. */ -/* - Neither the name of the HTS working group nor the names of its */ -/* contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND */ -/* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, */ -/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ -/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ -/* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS */ -/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */ -/* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON */ -/* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, */ -/* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY */ -/* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ -/* POSSIBILITY OF SUCH DAMAGE. */ -/* ----------------------------------------------------------------- */ diff --git a/voicevox_engine/tools/licenses/open_jtalk/mecab/COPYING b/voicevox_engine/tools/licenses/open_jtalk/mecab/COPYING deleted file mode 100644 index 8c50c6c47472d3b190177ce754c5227091040856..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/licenses/open_jtalk/mecab/COPYING +++ /dev/null @@ -1,69 +0,0 @@ -Copyright (c) 2001-2008, Taku Kudo -Copyright (c) 2004-2008, Nippon Telegraph and Telephone Corporation -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are -permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - - * Neither the name of the Nippon Telegraph and Telegraph Corporation - nor the names of its contributors may be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/* ----------------------------------------------------------------- */ -/* The Japanese TTS System "Open JTalk" */ -/* developed by HTS Working Group */ -/* http://open-jtalk.sourceforge.net/ */ -/* ----------------------------------------------------------------- */ -/* */ -/* Copyright (c) 2008-2016 Nagoya Institute of Technology */ -/* Department of Computer Science */ -/* */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* - Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* - Redistributions in binary form must reproduce the above */ -/* copyright notice, this list of conditions and the following */ -/* disclaimer in the documentation and/or other materials provided */ -/* with the distribution. */ -/* - Neither the name of the HTS working group nor the names of its */ -/* contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND */ -/* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, */ -/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ -/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ -/* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS */ -/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */ -/* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON */ -/* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, */ -/* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY */ -/* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ -/* POSSIBILITY OF SUCH DAMAGE. */ -/* ----------------------------------------------------------------- */ diff --git a/voicevox_engine/tools/licenses/world/LICENSE.txt b/voicevox_engine/tools/licenses/world/LICENSE.txt deleted file mode 100644 index 1c12e7699545c3f2a4340f339664c6925de4d634..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/licenses/world/LICENSE.txt +++ /dev/null @@ -1,39 +0,0 @@ -/* ----------------------------------------------------------------- */ -/* WORLD: High-quality speech analysis, */ -/* manipulation and synthesis system */ -/* developed by M. Morise */ -/* http://www.kisc.meiji.ac.jp/~mmorise/world/english/ */ -/* ----------------------------------------------------------------- */ -/* */ -/* Copyright (c) 2010 M. Morise */ -/* */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* - Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* - Redistributions in binary form must reproduce the above */ -/* copyright notice, this list of conditions and the following */ -/* disclaimer in the documentation and/or other materials provided */ -/* with the distribution. */ -/* - Neither the name of the M. Morise nor the names of its */ -/* contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND */ -/* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, */ -/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ -/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ -/* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS */ -/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */ -/* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON */ -/* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, */ -/* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY */ -/* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ -/* POSSIBILITY OF SUCH DAMAGE. */ -/* ----------------------------------------------------------------- */ diff --git a/voicevox_engine/tools/make_docs.py b/voicevox_engine/tools/make_docs.py deleted file mode 100644 index 88eb55d1473aa0d444f98a7ec3069017c3a49169..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/make_docs.py +++ /dev/null @@ -1,80 +0,0 @@ -import json -from pathlib import Path - -from voicevox_engine.app.application import generate_app -from voicevox_engine.core.core_adapter import CoreAdapter -from voicevox_engine.core.core_initializer import CoreManager -from voicevox_engine.dev.core.mock import MockCoreWrapper -from voicevox_engine.dev.tts_engine.mock import MockTTSEngine -from voicevox_engine.engine_manifest import load_manifest -from voicevox_engine.library.library_manager import LibraryManager -from voicevox_engine.preset.preset_manager import PresetManager -from voicevox_engine.setting.setting_manager import USER_SETTING_PATH, SettingHandler -from voicevox_engine.tts_pipeline.tts_engine import TTSEngineManager -from voicevox_engine.user_dict.user_dict_manager import UserDictionary -from voicevox_engine.utility.path_utility import ( - engine_manifest_path, - engine_root, - get_save_dir, -) - - -def generate_api_docs_html(schema: str) -> str: - """OpenAPI schema から API ドキュメント HTML を生成する""" - - return ( - """ - - - voicevox_engine API Document - - - - -
- - - -""" - % schema - ) - - -if __name__ == "__main__": - core_manager = CoreManager() - core_manager.register_core(CoreAdapter(MockCoreWrapper()), "mock") - tts_engines = TTSEngineManager() - tts_engines.register_engine(MockTTSEngine(), "mock") - engine_manifest = load_manifest(engine_manifest_path()) - library_manager = LibraryManager( - get_save_dir() / "installed_libraries", - engine_manifest.supported_vvlib_manifest_version, - engine_manifest.brand_name, - engine_manifest.name, - engine_manifest.uuid, - ) - - # FastAPI の機能を用いて OpenAPI schema を生成する - app = generate_app( - tts_engines=tts_engines, - core_manager=core_manager, - setting_loader=SettingHandler(USER_SETTING_PATH), - preset_manager=PresetManager( # FIXME: impl MockPresetManager - preset_path=engine_root() / "presets.yaml", - ), - user_dict=UserDictionary(), - engine_manifest=engine_manifest, - library_manager=library_manager, - ) - api_schema = json.dumps(app.openapi()) - - # API ドキュメント HTML を生成する - api_docs_html = generate_api_docs_html(api_schema) - - # HTML ファイルとして保存する - api_docs_root = Path("docs/api") # 'upload-docs' workflow の対象 - output_path = api_docs_root / "index.html" - output_path.parent.mkdir(parents=True, exist_ok=True) - output_path.write_text(api_docs_html) diff --git a/voicevox_engine/tools/merge_update_infos.py b/voicevox_engine/tools/merge_update_infos.py deleted file mode 100644 index 7c1ea57842b8fdefa4ab82d332f1432de712de25..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/merge_update_infos.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -更新履歴をマージする。 -""" - -import argparse -import json -from collections import OrderedDict -from pathlib import Path - - -def merge_json_string(src: str, dst: str) -> str: - """ - バージョンが同じ場合は要素を結合する - >>> src = '[{"version": "0.0.1", "a": ["a1"], "b": ["b1", "b2"]}]' - >>> dst = '[{"version": "0.0.1", "a": ["a2"], "b": ["b1", "b3"]}]' - >>> merge_json_string(src, dst) - '[{"version": "0.0.1", "a": ["a1", "a2"], "b": ["b1", "b2", "b3"]}]' - - バージョンが無かった場合は無視される - >>> src = '[{"version": "1"}]' - >>> dst = '[{"version": "1"}, {"version": "2"}]' - >>> merge_json_string(src, dst) - '[{"version": "1"}]' - """ - # FIXME: バリデーションする - # TODO: `str | list[str]`だけど`str`が来るとエラーになるのでならないようにしたい - src_json: list[dict[str, str | list[str]]] = json.loads(src) - dst_json: list[dict[str, str | list[str]]] = json.loads(dst) - - for src_item in src_json: - for dst_item in dst_json: - if src_item["version"] == dst_item["version"]: - for key in src_item: - if key == "version": - continue - - src_value = src_item[key] - dst_value = dst_item[key] - assert isinstance(src_value, list) - assert isinstance(dst_value, list) - - # 異なるものがあった場合だけ後ろに付け足す - src_item[key] = list(OrderedDict.fromkeys(src_value + dst_value)) - - return json.dumps(src_json) - - -def merge_update_infos(src_path: Path, dst_path: Path, output_path: Path) -> None: - src = src_path.read_text(encoding="utf-8") - dst = dst_path.read_text(encoding="utf-8") - merged = merge_json_string(src, dst) - output_path.write_text(merged) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("src_path", type=Path) - parser.add_argument("dst_path", type=Path) - parser.add_argument("output_path", type=Path) - args = parser.parse_args() - merge_update_infos(args.src_path, args.dst_path, args.output_path) diff --git a/voicevox_engine/tools/modify_pyinstaller.bash b/voicevox_engine/tools/modify_pyinstaller.bash deleted file mode 100644 index 26b3e337e02096a7de0fb87903638264cadca432..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/modify_pyinstaller.bash +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# PyInstallerをカスタマイズしてから再インストールする -# 良いGPUが自動的に選択されるようにしている -# https://github.com/VOICEVOX/voicevox_engine/issues/502 - -# 自前ビルドすることでブートローダーのハッシュ値が変わってウイルス判定を回避する効果もあるかも - -set -eux - -pyinstaller_version=$(pyinstaller -v) -tempdir=$(mktemp -dt modify_pyinstaller.XXXXXXXX) -trap 'rm -rf "$tempdir"' EXIT -git clone https://github.com/pyinstaller/pyinstaller.git "$tempdir" -b "v$pyinstaller_version" --depth 1 -cat > "$tempdir/bootloader/src/symbols.c" << EOF -#ifdef _WIN32 -#include - -// https://docs.nvidia.com/gameworks/content/technologies/desktop/optimus.htm -__declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; - -// https://gpuopen.com/learn/amdpowerxpressrequesthighperformance/ -__declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001; -#endif -EOF -(cd "$tempdir/bootloader" && python ./waf all --msvc_targets="x64") -pip install -U "$tempdir" diff --git a/voicevox_engine/tools/process_voicevox_resource.bash b/voicevox_engine/tools/process_voicevox_resource.bash deleted file mode 100644 index 086557209417e829def6e347e0ed379619de5da6..0000000000000000000000000000000000000000 --- a/voicevox_engine/tools/process_voicevox_resource.bash +++ /dev/null @@ -1,32 +0,0 @@ -set -eux - -if [ ! -v DOWNLOAD_RESOURCE_PATH ]; then - echo "DOWNLOAD_RESOURCE_PATHが未定義です" - exit 1 -fi - -# ダミーのキャラクター情報を置き換える -rm -r resources/character_info -cp -r "${DOWNLOAD_RESOURCE_PATH}/character_info" resources/character_info - -# キャラクター情報を前処理する -python "${DOWNLOAD_RESOURCE_PATH}/scripts/clean_character_info.py" \ - --character_info_dir resources/character_info/ - -# エンジンマニフェストに含まれるダミーの情報を上書きする -jq -s '.[0] * .[1]' engine_manifest.json "${DOWNLOAD_RESOURCE_PATH}/engine/engine_manifest.json" \ - > engine_manifest.json.tmp -mv engine_manifest.json.tmp engine_manifest.json - -# エンジンとリソースの更新情報を統合する -python tools/merge_update_infos.py \ - resources/engine_manifest_assets/update_infos.json \ - "${DOWNLOAD_RESOURCE_PATH}/engine/engine_manifest_assets/update_infos.json" \ - resources/engine_manifest_assets/update_infos.json - -# リソースのマニフェストアセットをエンジンのディレクトリへ複製する -for f in "${DOWNLOAD_RESOURCE_PATH}"/engine/engine_manifest_assets/*; do - if [ "$(basename "${f}")" != "update_infos.json" ]; then - cp "${f}" ./resources/engine_manifest_assets/ - fi -done diff --git a/voicevox_engine/voicevox_engine/__init__.py b/voicevox_engine/voicevox_engine/__init__.py deleted file mode 100644 index ca702104050d218302f1b0850d0b679eb8c1c617..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "latest" diff --git a/voicevox_engine/voicevox_engine/app/__init__.py b/voicevox_engine/voicevox_engine/app/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/voicevox_engine/app/application.py b/voicevox_engine/voicevox_engine/app/application.py deleted file mode 100644 index 14fc89d216221af28b18de4cd4b072c10ae0e391..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/application.py +++ /dev/null @@ -1,109 +0,0 @@ -"""ASGI application の生成""" - -from pathlib import Path - -from fastapi import FastAPI - -from voicevox_engine import __version__ -from voicevox_engine.app.dependencies import generate_mutability_allowed_verifier -from voicevox_engine.app.global_exceptions import configure_global_exception_handlers -from voicevox_engine.app.middlewares import configure_middlewares -from voicevox_engine.app.openapi_schema import configure_openapi_schema -from voicevox_engine.app.routers.character import generate_character_router -from voicevox_engine.app.routers.engine_info import generate_engine_info_router -from voicevox_engine.app.routers.library import generate_library_router -from voicevox_engine.app.routers.morphing import generate_morphing_router -from voicevox_engine.app.routers.portal_page import generate_portal_page_router -from voicevox_engine.app.routers.preset import generate_preset_router -from voicevox_engine.app.routers.setting import generate_setting_router -from voicevox_engine.app.routers.tts_pipeline import generate_tts_pipeline_router -from voicevox_engine.app.routers.user_dict import generate_user_dict_router -from voicevox_engine.cancellable_engine import CancellableEngine -from voicevox_engine.core.core_adapter import CoreCharacter -from voicevox_engine.core.core_initializer import CoreManager -from voicevox_engine.engine_manifest import EngineManifest -from voicevox_engine.library.library_manager import LibraryManager -from voicevox_engine.metas.MetasStore import MetasStore -from voicevox_engine.preset.preset_manager import PresetManager -from voicevox_engine.resource_manager import ResourceManager -from voicevox_engine.setting.model import CorsPolicyMode -from voicevox_engine.setting.setting_manager import SettingHandler -from voicevox_engine.tts_pipeline.tts_engine import TTSEngineManager -from voicevox_engine.user_dict.user_dict_manager import UserDictionary -from voicevox_engine.utility.path_utility import engine_root -from voicevox_engine.utility.runtime_utility import is_development - - -def generate_app( - tts_engines: TTSEngineManager, - core_manager: CoreManager, - setting_loader: SettingHandler, - preset_manager: PresetManager, - user_dict: UserDictionary, - engine_manifest: EngineManifest, - library_manager: LibraryManager, - cancellable_engine: CancellableEngine | None = None, - character_info_dir: Path | None = None, - cors_policy_mode: CorsPolicyMode = CorsPolicyMode.localapps, - allow_origin: list[str] | None = None, - disable_mutable_api: bool = False, -) -> FastAPI: - """ASGI 'application' 仕様に準拠した VOICEVOX ENGINE アプリケーションインスタンスを生成する。""" - if character_info_dir is None: - character_info_dir = engine_root() / "resources" / "character_info" - - verify_mutability_allowed = generate_mutability_allowed_verifier( - disable_mutable_api - ) - - app = FastAPI( - title=engine_manifest.name, - description=f"{engine_manifest.brand_name} の音声合成エンジンです。", - version=__version__, - separate_input_output_schemas=False, # Pydantic V1 のときのスキーマに合わせるため - ) - app = configure_middlewares(app, cors_policy_mode, allow_origin) - app = configure_global_exception_handlers(app) - - resource_manager = ResourceManager(is_development()) - resource_manager.register_dir(character_info_dir) - - core_version_list = core_manager.versions() - - def _get_core_characters(version: str | None) -> list[CoreCharacter]: - version = version or core_manager.latest_version() - core = core_manager.get_core(version) - return core.characters - - metas_store = MetasStore( - character_info_dir, - _get_core_characters, - resource_manager, - ) - - app.include_router( - generate_tts_pipeline_router(tts_engines, preset_manager, cancellable_engine) - ) - app.include_router(generate_morphing_router(tts_engines, metas_store)) - app.include_router( - generate_preset_router(preset_manager, verify_mutability_allowed) - ) - app.include_router(generate_character_router(resource_manager, metas_store)) - if engine_manifest.supported_features.manage_library: - app.include_router( - generate_library_router(library_manager, verify_mutability_allowed) - ) - app.include_router(generate_user_dict_router(user_dict, verify_mutability_allowed)) - app.include_router(generate_engine_info_router(core_version_list, engine_manifest)) - app.include_router( - generate_setting_router( - setting_loader, engine_manifest.brand_name, verify_mutability_allowed - ) - ) - app.include_router(generate_portal_page_router(engine_manifest.name)) - - app = configure_openapi_schema( - app, engine_manifest.supported_features.manage_library - ) - - return app diff --git a/voicevox_engine/voicevox_engine/app/dependencies.py b/voicevox_engine/voicevox_engine/app/dependencies.py deleted file mode 100644 index 904682d9d55acb144ff8a3b0128d9e4257e034b8..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/dependencies.py +++ /dev/null @@ -1,22 +0,0 @@ -"""FastAPI dependencies""" - -from typing import Any, Callable, Coroutine, TypeAlias - -from fastapi import HTTPException - -VerifyMutabilityAllowed: TypeAlias = Callable[[], Coroutine[Any, Any, None]] - - -def generate_mutability_allowed_verifier( - disable_mutable_api: bool, -) -> VerifyMutabilityAllowed: - """verify_mutability_allowed 関数(データ変更の許可を確認する関数)を生成する。""" - - async def verify_mutability_allowed() -> None: - if disable_mutable_api: - msg = "エンジンの静的なデータを変更するAPIは無効化されています" - raise HTTPException(status_code=403, detail=msg) - else: - pass - - return verify_mutability_allowed diff --git a/voicevox_engine/voicevox_engine/app/global_exceptions.py b/voicevox_engine/voicevox_engine/app/global_exceptions.py deleted file mode 100644 index 81a00bfd1f299bfa15cdcdef1f809c258029574b..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/global_exceptions.py +++ /dev/null @@ -1,17 +0,0 @@ -"""グローバルな例外ハンドラの定義と登録""" - -from fastapi import FastAPI, Request -from fastapi.responses import JSONResponse - -from voicevox_engine.core.core_initializer import CoreNotFound - - -def configure_global_exception_handlers(app: FastAPI) -> FastAPI: - """グローバルな例外ハンドラを app へ設定する。""" - - # 指定されたコアが見つからないエラー - @app.exception_handler(CoreNotFound) - async def cnf_exception_handler(request: Request, e: CoreNotFound) -> JSONResponse: - return JSONResponse(status_code=422, content={"message": f"{str(e)}"}) - - return app diff --git a/voicevox_engine/voicevox_engine/app/middlewares.py b/voicevox_engine/voicevox_engine/app/middlewares.py deleted file mode 100644 index 3c44a21251678ff9c0834d1690524a36be34966e..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/middlewares.py +++ /dev/null @@ -1,78 +0,0 @@ -"""FastAPI ミドルウェア""" - -import re -import sys -from collections.abc import Awaitable, Callable - -from fastapi import FastAPI, Request, Response -from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import JSONResponse -from starlette.middleware.errors import ServerErrorMiddleware - -from voicevox_engine.setting.model import CorsPolicyMode - - -def configure_middlewares( - app: FastAPI, cors_policy_mode: CorsPolicyMode, allow_origin: list[str] | None -) -> FastAPI: - """FastAPI のミドルウェアを設定する。""" - - # 未処理の例外が発生するとCORSMiddlewareが適用されない問題に対するワークアラウンド - # ref: https://github.com/VOICEVOX/voicevox_engine/issues/91 - async def global_execution_handler(request: Request, exc: Exception) -> Response: - return JSONResponse( - status_code=500, - content="Internal Server Error", - ) - - app.add_middleware(ServerErrorMiddleware, handler=global_execution_handler) - - # CORS用のヘッダを生成するミドルウェア - localhost_regex = "^https?://(localhost|127\\.0\\.0\\.1|\\[::1\\])(:[0-9]+)?$" - compiled_localhost_regex = re.compile(localhost_regex) - allowed_origins = ["*"] - if cors_policy_mode == "localapps": - allowed_origins = ["app://."] - if allow_origin is not None: - allowed_origins += allow_origin - if "*" in allow_origin: - print( - 'WARNING: Deprecated use of argument "*" in allow_origin. ' - 'Use option "--cors_policy_mod all" instead. See "--help" for more.', - file=sys.stderr, - ) - - app.add_middleware( - CORSMiddleware, - allow_origins=allowed_origins, - allow_credentials=True, - allow_origin_regex=localhost_regex, - allow_methods=["*"], - allow_headers=["*"], - ) - - # 許可されていないOriginを遮断するミドルウェア - @app.middleware("http") - async def block_origin_middleware( - request: Request, call_next: Callable[[Request], Awaitable[Response]] - ) -> Response | JSONResponse: - isValidOrigin: bool = False - if "Origin" not in request.headers: # Originのない純粋なリクエストの場合 - isValidOrigin = True - elif "*" in allowed_origins: # すべてを許可する設定の場合 - isValidOrigin = True - elif request.headers["Origin"] in allowed_origins: # Originが許可されている場合 - isValidOrigin = True - elif compiled_localhost_regex.fullmatch( - request.headers["Origin"] - ): # localhostの場合 - isValidOrigin = True - - if isValidOrigin: - return await call_next(request) - else: - return JSONResponse( - status_code=403, content={"detail": "Origin not allowed"} - ) - - return app diff --git a/voicevox_engine/voicevox_engine/app/openapi_schema.py b/voicevox_engine/voicevox_engine/app/openapi_schema.py deleted file mode 100644 index 5bd85d9405fe7a406b238c05b75d49a594848c91..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/openapi_schema.py +++ /dev/null @@ -1,54 +0,0 @@ -"""OpenAPI schema の設定""" - -from typing import Any - -from fastapi import FastAPI -from fastapi.openapi.utils import get_openapi -from pydantic import BaseModel - -from voicevox_engine.library.model import BaseLibraryInfo, VvlibManifest - - -def configure_openapi_schema(app: FastAPI, manage_library: bool | None) -> FastAPI: - """自動生成された OpenAPI schema へカスタム属性を追加する。""" - - # BaseLibraryInfo/VvlibManifestモデルはAPIとして表には出ないが、エディタ側で利用したいので、手動で追加する - # ref: https://fastapi.tiangolo.com/advanced/extending-openapi/#modify-the-openapi-schema - def custom_openapi() -> Any: - if app.openapi_schema: - return app.openapi_schema - openapi_schema = get_openapi( - title=app.title, - version=app.version, - openapi_version=app.openapi_version, - summary=app.summary, - description=app.description, - terms_of_service=app.terms_of_service, - contact=app.contact, - license_info=app.license_info, - routes=app.routes, - webhooks=app.webhooks.routes, - tags=app.openapi_tags, - servers=app.servers, - separate_input_output_schemas=app.separate_input_output_schemas, - ) - if manage_library: - additional_models: list[type[BaseModel]] = [ - BaseLibraryInfo, - VvlibManifest, - ] - for model in additional_models: - # ref_templateを指定しない場合、definitionsを参照してしまうので、手動で指定する - schema = model.model_json_schema( - ref_template="#/components/schemas/{model}" - ) - # definitionsは既存のモデルを重複して定義するため、不要なので削除 - if "$defs" in schema: - del schema["$defs"] - openapi_schema["components"]["schemas"][schema["title"]] = schema - app.openapi_schema = openapi_schema - return openapi_schema - - app.openapi = custom_openapi # type: ignore[method-assign] - - return app diff --git a/voicevox_engine/voicevox_engine/app/routers/__init__.py b/voicevox_engine/voicevox_engine/app/routers/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/voicevox_engine/app/routers/character.py b/voicevox_engine/voicevox_engine/app/routers/character.py deleted file mode 100644 index 4ff60776621dffd3e17f48d84fc8938122455277..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/routers/character.py +++ /dev/null @@ -1,107 +0,0 @@ -"""キャラクター情報機能を提供する API Router""" - -from typing import Annotated - -from fastapi import APIRouter, Depends, HTTPException, Request -from fastapi.responses import FileResponse -from pydantic.json_schema import SkipJsonSchema - -from voicevox_engine.metas.Metas import Speaker, SpeakerInfo -from voicevox_engine.metas.MetasStore import Character, MetasStore, ResourceFormat -from voicevox_engine.resource_manager import ResourceManager, ResourceManagerError - -RESOURCE_ENDPOINT = "_resources" - - -async def _get_resource_baseurl(request: Request) -> str: - return f"{request.url.scheme}://{request.url.netloc}/{RESOURCE_ENDPOINT}" - - -def _characters_to_speakers(characters: list[Character]) -> list[Speaker]: - """キャラクターのリストを `Speaker` のリストへキャストする。""" - return list( - map( - lambda character: Speaker( - name=character.name, - speaker_uuid=character.uuid, - styles=character.talk_styles + character.sing_styles, - version=character.version, - supported_features=character.supported_features, - ), - characters, - ) - ) - - -def generate_character_router( - resource_manager: ResourceManager, metas_store: MetasStore -) -> APIRouter: - """キャラクター情報 API Router を生成する""" - router = APIRouter(tags=["その他"]) - - @router.get("/speakers") - def speakers(core_version: str | SkipJsonSchema[None] = None) -> list[Speaker]: - """喋れるキャラクターの情報の一覧を返します。""" - characters = metas_store.talk_characters(core_version) - return _characters_to_speakers(characters) - - @router.get("/speaker_info") - def speaker_info( - resource_baseurl: Annotated[str, Depends(_get_resource_baseurl)], - speaker_uuid: str, - resource_format: ResourceFormat = "base64", - core_version: str | SkipJsonSchema[None] = None, - ) -> SpeakerInfo: - """ - UUID で指定された喋れるキャラクターの情報を返します。 - 画像や音声はresource_formatで指定した形式で返されます。 - """ - return metas_store.character_info( - character_uuid=speaker_uuid, - talk_or_sing="talk", - core_version=core_version, - resource_baseurl=resource_baseurl, - resource_format=resource_format, - ) - - @router.get("/singers") - def singers(core_version: str | SkipJsonSchema[None] = None) -> list[Speaker]: - """歌えるキャラクターの情報の一覧を返します。""" - characters = metas_store.sing_characters(core_version) - return _characters_to_speakers(characters) - - @router.get("/singer_info") - def singer_info( - resource_baseurl: Annotated[str, Depends(_get_resource_baseurl)], - speaker_uuid: str, - resource_format: ResourceFormat = "base64", - core_version: str | SkipJsonSchema[None] = None, - ) -> SpeakerInfo: - """ - UUID で指定された歌えるキャラクターの情報を返します。 - 画像や音声はresource_formatで指定した形式で返されます。 - """ - return metas_store.character_info( - character_uuid=speaker_uuid, - talk_or_sing="sing", - core_version=core_version, - resource_baseurl=resource_baseurl, - resource_format=resource_format, - ) - - # リソースはAPIとしてアクセスするものではないことを表明するためOpenAPIスキーマーから除外する - @router.get(f"/{RESOURCE_ENDPOINT}/{{resource_hash}}", include_in_schema=False) - async def resources(resource_hash: str) -> FileResponse: - """ - ResourceManagerから発行されたハッシュ値に対応するリソースファイルを返す - """ - try: - resource_path = resource_manager.resource_path(resource_hash) - except ResourceManagerError: - raise HTTPException(status_code=404) - return FileResponse( - resource_path, - headers={"Cache-Control": "max-age=2592000"}, # 30日 - ) - - return router diff --git a/voicevox_engine/voicevox_engine/app/routers/engine_info.py b/voicevox_engine/voicevox_engine/app/routers/engine_info.py deleted file mode 100644 index 294d2591ea4c3e90a5c461275f2199f231ca0d7f..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/routers/engine_info.py +++ /dev/null @@ -1,30 +0,0 @@ -"""エンジンの情報機能を提供する API Router""" - -from fastapi import APIRouter - -from voicevox_engine import __version__ -from voicevox_engine.engine_manifest import EngineManifest - - -def generate_engine_info_router( - core_version_list: list[str], engine_manifest_data: EngineManifest -) -> APIRouter: - """エンジン情報 API Router を生成する""" - router = APIRouter(tags=["その他"]) - - @router.get("/version") - async def version() -> str: - """エンジンのバージョンを取得します。""" - return __version__ - - @router.get("/core_versions") - async def core_versions() -> list[str]: - """利用可能なコアのバージョン一覧を取得します。""" - return core_version_list - - @router.get("/engine_manifest") - async def engine_manifest() -> EngineManifest: - """エンジンマニフェストを取得します。""" - return engine_manifest_data - - return router diff --git a/voicevox_engine/voicevox_engine/app/routers/library.py b/voicevox_engine/voicevox_engine/app/routers/library.py deleted file mode 100644 index ed693340d741b097afcb96e06c9e5930bef3c37b..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/routers/library.py +++ /dev/null @@ -1,102 +0,0 @@ -"""音声ライブラリ機能を提供する API Router""" - -import asyncio -from io import BytesIO -from typing import Annotated - -from fastapi import APIRouter, Depends, HTTPException, Path, Request - -from voicevox_engine.library.library_manager import ( - LibraryFormatInvalidError, - LibraryInternalError, - LibraryManager, - LibraryNotFoundError, - LibraryOperationUnauthorizedError, - LibraryUnsupportedError, -) -from voicevox_engine.library.model import DownloadableLibraryInfo, InstalledLibraryInfo - -from ..dependencies import VerifyMutabilityAllowed - - -def generate_library_router( - library_manager: LibraryManager, verify_mutability: VerifyMutabilityAllowed -) -> APIRouter: - """音声ライブラリ API Router を生成する""" - router = APIRouter(tags=["音声ライブラリ管理"]) - - @router.get( - "/downloadable_libraries", - response_description="ダウンロード可能な音声ライブラリの情報リスト", - ) - def downloadable_libraries() -> list[DownloadableLibraryInfo]: - """ - ダウンロード可能な音声ライブラリの情報を返します。 - """ - return library_manager.downloadable_libraries() - - @router.get( - "/installed_libraries", - response_description="インストールした音声ライブラリの情報", - ) - def installed_libraries() -> dict[str, InstalledLibraryInfo]: - """ - インストールした音声ライブラリの情報を返します。 - """ - return library_manager.installed_libraries() - - @router.post( - "/install_library/{library_uuid}", - status_code=204, - dependencies=[Depends(verify_mutability)], - ) - async def install_library( - library_uuid: Annotated[str, Path(description="音声ライブラリのID")], - request: Request, - ) -> None: - """ - 音声ライブラリをインストールします。 - 音声ライブラリのZIPファイルをリクエストボディとして送信してください。 - """ - archive = BytesIO(await request.body()) - loop = asyncio.get_event_loop() - try: - await loop.run_in_executor( - None, library_manager.install_library, library_uuid, archive - ) - except LibraryNotFoundError as e: - raise HTTPException(status_code=404, detail=str(e)) - except LibraryFormatInvalidError as e: - raise HTTPException(status_code=422, detail=str(e)) - except LibraryUnsupportedError as e: - raise HTTPException(status_code=422, detail=str(e)) - except LibraryOperationUnauthorizedError as e: - raise HTTPException(status_code=403, detail=str(e)) - except LibraryInternalError as e: - raise HTTPException(status_code=500, detail=str(e)) - - @router.post( - "/uninstall_library/{library_uuid}", - status_code=204, - dependencies=[Depends(verify_mutability)], - ) - def uninstall_library( - library_uuid: Annotated[str, Path(description="音声ライブラリのID")] - ) -> None: - """ - 音声ライブラリをアンインストールします。 - """ - try: - library_manager.uninstall_library(library_uuid) - except LibraryNotFoundError as e: - raise HTTPException(status_code=404, detail=str(e)) - except LibraryFormatInvalidError as e: - raise HTTPException(status_code=422, detail=str(e)) - except LibraryUnsupportedError as e: - raise HTTPException(status_code=422, detail=str(e)) - except LibraryOperationUnauthorizedError as e: - raise HTTPException(status_code=403, detail=str(e)) - except LibraryInternalError as e: - raise HTTPException(status_code=500, detail=str(e)) - - return router diff --git a/voicevox_engine/voicevox_engine/app/routers/morphing.py b/voicevox_engine/voicevox_engine/app/routers/morphing.py deleted file mode 100644 index dd819975714683d17b013d469e88865724ec51d6..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/routers/morphing.py +++ /dev/null @@ -1,132 +0,0 @@ -"""モーフィング機能を提供する API Router""" - -from functools import lru_cache -from tempfile import NamedTemporaryFile -from typing import Annotated - -import soundfile -from fastapi import APIRouter, HTTPException, Query -from pydantic.json_schema import SkipJsonSchema -from starlette.background import BackgroundTask -from starlette.responses import FileResponse - -from voicevox_engine.metas.Metas import StyleId -from voicevox_engine.metas.MetasStore import MetasStore -from voicevox_engine.model import AudioQuery -from voicevox_engine.morphing.model import MorphableTargetInfo -from voicevox_engine.morphing.morphing import ( - StyleIdNotFoundError, - get_morphable_targets, - is_morphable, -) -from voicevox_engine.morphing.morphing import ( - synthesis_morphing_parameter as _synthesis_morphing_parameter, -) -from voicevox_engine.morphing.morphing import synthesize_morphed_wave -from voicevox_engine.tts_pipeline.tts_engine import LATEST_VERSION, TTSEngineManager -from voicevox_engine.utility.file_utility import try_delete_file - -# キャッシュを有効化 -# モジュール側でlru_cacheを指定するとキャッシュを制御しにくいため、HTTPサーバ側で指定する -# TODO: キャッシュを管理するモジュール側API・HTTP側APIを用意する -synthesis_morphing_parameter = lru_cache(maxsize=4)(_synthesis_morphing_parameter) - - -def generate_morphing_router( - tts_engines: TTSEngineManager, metas_store: MetasStore -) -> APIRouter: - """モーフィング API Router を生成する""" - router = APIRouter(tags=["音声合成"]) - - @router.post( - "/morphable_targets", - summary="指定したスタイルに対してエンジン内のキャラクターがモーフィングが可能か判定する", - ) - def morphable_targets( - base_style_ids: list[StyleId], core_version: str | SkipJsonSchema[None] = None - ) -> list[dict[str, MorphableTargetInfo]]: - """ - 指定されたベーススタイルに対してエンジン内の各キャラクターがモーフィング機能を利用可能か返します。 - モーフィングの許可/禁止は`/speakers`の`speaker.supported_features.synthesis_morphing`に記載されています。 - プロパティが存在しない場合は、モーフィングが許可されているとみなします。 - 返り値のスタイルIDはstring型なので注意。 - """ - characters = metas_store.characters(core_version) - try: - morphable_targets = get_morphable_targets(characters, base_style_ids) - except StyleIdNotFoundError as e: - msg = f"該当するスタイル(style_id={e.style_id})が見つかりません" - raise HTTPException(status_code=404, detail=msg) - # NOTE: jsonはint型のキーを持てないので、string型に変換する - return [ - {str(k): v for k, v in morphable_target.items()} - for morphable_target in morphable_targets - ] - - @router.post( - "/synthesis_morphing", - response_class=FileResponse, - responses={ - 200: { - "content": { - "audio/wav": {"schema": {"type": "string", "format": "binary"}} - }, - } - }, - summary="2種類のスタイルでモーフィングした音声を合成する", - ) - def _synthesis_morphing( - query: AudioQuery, - base_style_id: Annotated[StyleId, Query(alias="base_speaker")], - target_style_id: Annotated[StyleId, Query(alias="target_speaker")], - morph_rate: Annotated[float, Query(ge=0.0, le=1.0)], - core_version: str | SkipJsonSchema[None] = None, - ) -> FileResponse: - """ - 指定された2種類のスタイルで音声を合成、指定した割合でモーフィングした音声を得ます。 - モーフィングの割合は`morph_rate`で指定でき、0.0でベースのスタイル、1.0でターゲットのスタイルに近づきます。 - """ - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - - # モーフィングが許可されないキャラクターペアを拒否する - characters = metas_store.characters(core_version) - try: - morphable = is_morphable(characters, base_style_id, target_style_id) - except StyleIdNotFoundError as e: - msg = f"該当するスタイル(style_id={e.style_id})が見つかりません" - raise HTTPException(status_code=404, detail=msg) - if not morphable: - msg = "指定されたスタイルペアでのモーフィングはできません" - raise HTTPException(status_code=400, detail=msg) - - # 生成したパラメータはキャッシュされる - morph_param = synthesis_morphing_parameter( - engine=engine, - query=query, - base_style_id=base_style_id, - target_style_id=target_style_id, - ) - - morph_wave = synthesize_morphed_wave( - morph_param=morph_param, - morph_rate=morph_rate, - output_fs=query.outputSamplingRate, - output_stereo=query.outputStereo, - ) - - with NamedTemporaryFile(delete=False) as f: - soundfile.write( - file=f, - data=morph_wave, - samplerate=query.outputSamplingRate, - format="WAV", - ) - - return FileResponse( - f.name, - media_type="audio/wav", - background=BackgroundTask(try_delete_file, f.name), - ) - - return router diff --git a/voicevox_engine/voicevox_engine/app/routers/portal_page.py b/voicevox_engine/voicevox_engine/app/routers/portal_page.py deleted file mode 100644 index 38902ee6ba9e11cc991daf5daf25d1ea48614c5d..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/routers/portal_page.py +++ /dev/null @@ -1,30 +0,0 @@ -"""ポータルページ機能を提供する API Router""" - -from fastapi import APIRouter -from fastapi.responses import HTMLResponse - -from voicevox_engine.engine_manifest import EngineName - - -def generate_portal_page_router(engine_name: EngineName) -> APIRouter: - """ポータルページ API Router を生成する""" - router = APIRouter() - - @router.get("/", response_class=HTMLResponse, tags=["その他"]) - async def get_portal_page() -> str: - """ポータルページを返します。""" - return f""" - - - {engine_name} - - -

{engine_name}

- {engine_name} へようこそ! - - """ - - return router diff --git a/voicevox_engine/voicevox_engine/app/routers/preset.py b/voicevox_engine/voicevox_engine/app/routers/preset.py deleted file mode 100644 index c01fc12b3f59931ccd44c44cf8e4f84e199c7693..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/routers/preset.py +++ /dev/null @@ -1,105 +0,0 @@ -"""プリセット機能を提供する API Router""" - -from typing import Annotated - -from fastapi import APIRouter, Body, Depends, HTTPException, Query - -from voicevox_engine.preset.model import Preset -from voicevox_engine.preset.preset_manager import ( - PresetInputError, - PresetInternalError, - PresetManager, -) - -from ..dependencies import VerifyMutabilityAllowed - - -def generate_preset_router( - preset_manager: PresetManager, verify_mutability: VerifyMutabilityAllowed -) -> APIRouter: - """プリセット API Router を生成する""" - router = APIRouter(tags=["その他"]) - - @router.get( - "/presets", - response_description="プリセットのリスト", - ) - def get_presets() -> list[Preset]: - """ - エンジンが保持しているプリセットの設定を返します - """ - try: - presets = preset_manager.load_presets() - except PresetInputError as err: - raise HTTPException(status_code=422, detail=str(err)) - except PresetInternalError as err: - raise HTTPException(status_code=500, detail=str(err)) - return presets - - @router.post( - "/add_preset", - response_description="追加したプリセットのプリセットID", - dependencies=[Depends(verify_mutability)], - ) - def add_preset( - preset: Annotated[ - Preset, - Body( - description="新しいプリセット。プリセットIDが既存のものと重複している場合は、新規のプリセットIDが採番されます。" - ), - ] - ) -> int: - """ - 新しいプリセットを追加します - """ - try: - id = preset_manager.add_preset(preset) - except PresetInputError as err: - raise HTTPException(status_code=422, detail=str(err)) - except PresetInternalError as err: - raise HTTPException(status_code=500, detail=str(err)) - return id - - @router.post( - "/update_preset", - response_description="更新したプリセットのプリセットID", - dependencies=[Depends(verify_mutability)], - ) - def update_preset( - preset: Annotated[ - Preset, - Body( - description="更新するプリセット。プリセットIDが更新対象と一致している必要があります。" - ), - ] - ) -> int: - """ - 既存のプリセットを更新します - """ - try: - id = preset_manager.update_preset(preset) - except PresetInputError as err: - raise HTTPException(status_code=422, detail=str(err)) - except PresetInternalError as err: - raise HTTPException(status_code=500, detail=str(err)) - return id - - @router.post( - "/delete_preset", - status_code=204, - dependencies=[Depends(verify_mutability)], - ) - def delete_preset( - id: Annotated[int, Query(description="削除するプリセットのプリセットID")] - ) -> None: - """ - 既存のプリセットを削除します - """ - try: - preset_manager.delete_preset(id) - except PresetInputError as err: - raise HTTPException(status_code=422, detail=str(err)) - except PresetInternalError as err: - raise HTTPException(status_code=500, detail=str(err)) - - return router diff --git a/voicevox_engine/voicevox_engine/app/routers/setting.py b/voicevox_engine/voicevox_engine/app/routers/setting.py deleted file mode 100644 index 74a657302f0d875d4c410cbb1a6d544082a94c9d..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/routers/setting.py +++ /dev/null @@ -1,73 +0,0 @@ -"""設定機能を提供する API Router""" - -from typing import Annotated - -from fastapi import APIRouter, Depends, Form, Request, Response -from fastapi.templating import Jinja2Templates -from jinja2 import Environment, FileSystemLoader -from pydantic.json_schema import SkipJsonSchema - -from voicevox_engine.engine_manifest import BrandName -from voicevox_engine.setting.model import CorsPolicyMode -from voicevox_engine.setting.setting_manager import Setting, SettingHandler -from voicevox_engine.utility.path_utility import resource_root - -from ..dependencies import VerifyMutabilityAllowed - -_setting_ui_template = Jinja2Templates( - env=Environment( - variable_start_string="", - variable_end_string="", - loader=FileSystemLoader(resource_root()), - ), -) - - -def generate_setting_router( - setting_loader: SettingHandler, - brand_name: BrandName, - verify_mutability: VerifyMutabilityAllowed, -) -> APIRouter: - """設定 API Router を生成する""" - router = APIRouter(tags=["設定"]) - - @router.get("/setting", response_class=Response) - def setting_get(request: Request) -> Response: - """ - 設定ページを返します。 - """ - settings = setting_loader.load() - - cors_policy_mode = settings.cors_policy_mode - allow_origin = settings.allow_origin - - if allow_origin is None: - allow_origin = "" - - return _setting_ui_template.TemplateResponse( - request=request, - name="setting_ui_template.html", - context={ - "brand_name": brand_name, - "cors_policy_mode": cors_policy_mode.value, - "allow_origin": allow_origin, - }, - ) - - @router.post("/setting", status_code=204, dependencies=[Depends(verify_mutability)]) - def setting_post( - cors_policy_mode: Annotated[CorsPolicyMode, Form()], - allow_origin: Annotated[str | SkipJsonSchema[None], Form()] = None, - ) -> None: - """ - 設定を更新します。 - """ - settings = Setting( - cors_policy_mode=cors_policy_mode, - allow_origin=allow_origin, - ) - - # 更新した設定へ上書き - setting_loader.save(settings) - - return router diff --git a/voicevox_engine/voicevox_engine/app/routers/tts_pipeline.py b/voicevox_engine/voicevox_engine/app/routers/tts_pipeline.py deleted file mode 100644 index 989dd70c516c31011f505d2cbaa259900deed2fe..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/routers/tts_pipeline.py +++ /dev/null @@ -1,577 +0,0 @@ -"""音声合成機能を提供する API Router""" - -import zipfile -from tempfile import NamedTemporaryFile, TemporaryFile -from typing import Annotated, Self - -import soundfile -from fastapi import APIRouter, HTTPException, Query, Request -from pydantic import BaseModel, Field -from pydantic.json_schema import SkipJsonSchema -from starlette.background import BackgroundTask -from starlette.responses import FileResponse - -from voicevox_engine.cancellable_engine import ( - CancellableEngine, - CancellableEngineInternalError, -) -from voicevox_engine.core.core_adapter import DeviceSupport -from voicevox_engine.metas.Metas import StyleId -from voicevox_engine.model import AudioQuery -from voicevox_engine.preset.preset_manager import ( - PresetInputError, - PresetInternalError, - PresetManager, -) -from voicevox_engine.tts_pipeline.connect_base64_waves import ( - ConnectBase64WavesException, - connect_base64_waves, -) -from voicevox_engine.tts_pipeline.kana_converter import ( - ParseKanaError, - create_kana, - parse_kana, -) -from voicevox_engine.tts_pipeline.model import ( - AccentPhrase, - FrameAudioQuery, - ParseKanaErrorCode, - Score, -) -from voicevox_engine.tts_pipeline.tts_engine import ( - LATEST_VERSION, - TalkSingInvalidInputError, - TTSEngineManager, -) -from voicevox_engine.utility.file_utility import try_delete_file - - -class ParseKanaBadRequest(BaseModel): - text: str = Field(description="エラーメッセージ") - error_name: str = Field( - description="エラー名\n\n" - "|name|description|\n|---|---|\n" - + "\n".join( - [ - "| {} | {} |".format(err.name, err.value) - for err in list(ParseKanaErrorCode) - ] - ), - ) - error_args: dict[str, str] = Field(description="エラーを起こした箇所") - - def __init__(self, err: ParseKanaError): - super().__init__(text=err.text, error_name=err.errname, error_args=err.kwargs) - - -class SupportedDevicesInfo(BaseModel): - """ - 対応しているデバイスの情報 - """ - - cpu: bool = Field(description="CPUに対応しているか") - cuda: bool = Field(description="CUDA(Nvidia GPU)に対応しているか") - dml: bool = Field(description="DirectML(Nvidia GPU/Radeon GPU等)に対応しているか") - - @classmethod - def generate_from(cls, device_support: DeviceSupport) -> Self: - """`DeviceSupport` インスタンスからこのインスタンスを生成する。""" - return cls( - cpu=device_support.cpu, - cuda=device_support.cuda, - dml=device_support.dml, - ) - - -def generate_tts_pipeline_router( - tts_engines: TTSEngineManager, - preset_manager: PresetManager, - cancellable_engine: CancellableEngine | None, -) -> APIRouter: - """音声合成 API Router を生成する""" - router = APIRouter() - - @router.post( - "/audio_query", - tags=["クエリ作成"], - summary="音声合成用のクエリを作成する", - ) - def audio_query( - text: str, - style_id: Annotated[StyleId, Query(alias="speaker")], - core_version: str | SkipJsonSchema[None] = None, - ) -> AudioQuery: - """ - 音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。 - """ - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - accent_phrases = engine.create_accent_phrases(text, style_id) - return AudioQuery( - accent_phrases=accent_phrases, - speedScale=1, - pitchScale=0, - intonationScale=1, - volumeScale=1, - prePhonemeLength=0.1, - postPhonemeLength=0.1, - pauseLength=None, - pauseLengthScale=1, - outputSamplingRate=engine.default_sampling_rate, - outputStereo=False, - kana=create_kana(accent_phrases), - ) - - @router.post( - "/audio_query_from_preset", - tags=["クエリ作成"], - summary="音声合成用のクエリをプリセットを用いて作成する", - ) - def audio_query_from_preset( - text: str, - preset_id: int, - core_version: str | SkipJsonSchema[None] = None, - ) -> AudioQuery: - """ - 音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。 - """ - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - try: - presets = preset_manager.load_presets() - except PresetInputError as err: - raise HTTPException(status_code=422, detail=str(err)) - except PresetInternalError as err: - raise HTTPException(status_code=500, detail=str(err)) - for preset in presets: - if preset.id == preset_id: - selected_preset = preset - break - else: - raise HTTPException( - status_code=422, detail="該当するプリセットIDが見つかりません" - ) - - accent_phrases = engine.create_accent_phrases(text, selected_preset.style_id) - return AudioQuery( - accent_phrases=accent_phrases, - speedScale=selected_preset.speedScale, - pitchScale=selected_preset.pitchScale, - intonationScale=selected_preset.intonationScale, - volumeScale=selected_preset.volumeScale, - prePhonemeLength=selected_preset.prePhonemeLength, - postPhonemeLength=selected_preset.postPhonemeLength, - pauseLength=selected_preset.pauseLength, - pauseLengthScale=selected_preset.pauseLengthScale, - outputSamplingRate=engine.default_sampling_rate, - outputStereo=False, - kana=create_kana(accent_phrases), - ) - - @router.post( - "/accent_phrases", - tags=["クエリ編集"], - summary="テキストからアクセント句を得る", - responses={ - 400: { - "description": "読み仮名のパースに失敗", - "model": ParseKanaBadRequest, - } - }, - ) - def accent_phrases( - text: str, - style_id: Annotated[StyleId, Query(alias="speaker")], - is_kana: bool = False, - core_version: str | SkipJsonSchema[None] = None, - ) -> list[AccentPhrase]: - """ - テキストからアクセント句を得ます。 - is_kanaが`true`のとき、テキストは次のAquesTalk 風記法で解釈されます。デフォルトは`false`です。 - * 全てのカナはカタカナで記述される - * アクセント句は`/`または`、`で区切る。`、`で区切った場合に限り無音区間が挿入される。 - * カナの手前に`_`を入れるとそのカナは無声化される - * アクセント位置を`'`で指定する。全てのアクセント句にはアクセント位置を1つ指定する必要がある。 - * アクセント句末に`?`(全角)を入れることにより疑問文の発音ができる。 - """ - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - if is_kana: - try: - return engine.create_accent_phrases_from_kana(text, style_id) - except ParseKanaError as err: - raise HTTPException( - status_code=400, detail=ParseKanaBadRequest(err).model_dump() - ) - else: - return engine.create_accent_phrases(text, style_id) - - @router.post( - "/mora_data", - tags=["クエリ編集"], - summary="アクセント句から音高・音素長を得る", - ) - def mora_data( - accent_phrases: list[AccentPhrase], - style_id: Annotated[StyleId, Query(alias="speaker")], - core_version: str | SkipJsonSchema[None] = None, - ) -> list[AccentPhrase]: - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - return engine.update_length_and_pitch(accent_phrases, style_id) - - @router.post( - "/mora_length", - tags=["クエリ編集"], - summary="アクセント句から音素長を得る", - ) - def mora_length( - accent_phrases: list[AccentPhrase], - style_id: Annotated[StyleId, Query(alias="speaker")], - core_version: str | SkipJsonSchema[None] = None, - ) -> list[AccentPhrase]: - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - return engine.update_length(accent_phrases, style_id) - - @router.post( - "/mora_pitch", - tags=["クエリ編集"], - summary="アクセント句から音高を得る", - ) - def mora_pitch( - accent_phrases: list[AccentPhrase], - style_id: Annotated[StyleId, Query(alias="speaker")], - core_version: str | SkipJsonSchema[None] = None, - ) -> list[AccentPhrase]: - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - return engine.update_pitch(accent_phrases, style_id) - - @router.post( - "/synthesis", - response_class=FileResponse, - responses={ - 200: { - "content": { - "audio/wav": {"schema": {"type": "string", "format": "binary"}} - }, - } - }, - tags=["音声合成"], - summary="音声合成する", - ) - def synthesis( - query: AudioQuery, - style_id: Annotated[StyleId, Query(alias="speaker")], - enable_interrogative_upspeak: Annotated[ - bool, - Query( - description="疑問系のテキストが与えられたら語尾を自動調整する", - ), - ] = True, - core_version: str | SkipJsonSchema[None] = None, - ) -> FileResponse: - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - wave = engine.synthesize_wave( - query, style_id, enable_interrogative_upspeak=enable_interrogative_upspeak - ) - - with NamedTemporaryFile(delete=False) as f: - soundfile.write( - file=f, data=wave, samplerate=query.outputSamplingRate, format="WAV" - ) - - return FileResponse( - f.name, - media_type="audio/wav", - background=BackgroundTask(try_delete_file, f.name), - ) - - @router.post( - "/cancellable_synthesis", - response_class=FileResponse, - responses={ - 200: { - "content": { - "audio/wav": {"schema": {"type": "string", "format": "binary"}} - }, - } - }, - tags=["音声合成"], - summary="音声合成する(キャンセル可能)", - ) - def cancellable_synthesis( - query: AudioQuery, - request: Request, - style_id: Annotated[StyleId, Query(alias="speaker")], - core_version: str | SkipJsonSchema[None] = None, - ) -> FileResponse: - if cancellable_engine is None: - raise HTTPException( - status_code=404, - detail="実験的機能はデフォルトで無効になっています。使用するには引数を指定してください。", - ) - try: - version = core_version or LATEST_VERSION - f_name = cancellable_engine._synthesis_impl( - query, style_id, request, version=version - ) - except CancellableEngineInternalError as e: - raise HTTPException(status_code=500, detail=str(e)) - - if f_name == "": - raise HTTPException(status_code=422, detail="不明なバージョンです") - - return FileResponse( - f_name, - media_type="audio/wav", - background=BackgroundTask(try_delete_file, f_name), - ) - - @router.post( - "/multi_synthesis", - response_class=FileResponse, - responses={ - 200: { - "content": { - "application/zip": { - "schema": {"type": "string", "format": "binary"} - } - }, - } - }, - tags=["音声合成"], - summary="複数まとめて音声合成する", - ) - def multi_synthesis( - queries: list[AudioQuery], - style_id: Annotated[StyleId, Query(alias="speaker")], - core_version: str | SkipJsonSchema[None] = None, - ) -> FileResponse: - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - sampling_rate = queries[0].outputSamplingRate - - with NamedTemporaryFile(delete=False) as f: - with zipfile.ZipFile(f, mode="a") as zip_file: - for i in range(len(queries)): - if queries[i].outputSamplingRate != sampling_rate: - raise HTTPException( - status_code=422, - detail="サンプリングレートが異なるクエリがあります", - ) - - with TemporaryFile() as wav_file: - wave = engine.synthesize_wave(queries[i], style_id) - soundfile.write( - file=wav_file, - data=wave, - samplerate=sampling_rate, - format="WAV", - ) - wav_file.seek(0) - zip_file.writestr(f"{str(i + 1).zfill(3)}.wav", wav_file.read()) - - return FileResponse( - f.name, - media_type="application/zip", - background=BackgroundTask(try_delete_file, f.name), - ) - - @router.post( - "/sing_frame_audio_query", - tags=["クエリ作成"], - summary="歌唱音声合成用のクエリを作成する", - ) - def sing_frame_audio_query( - score: Score, - style_id: Annotated[StyleId, Query(alias="speaker")], - core_version: str | SkipJsonSchema[None] = None, - ) -> FrameAudioQuery: - """ - 歌唱音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま歌唱音声合成に利用できます。各値の意味は`Schemas`を参照してください。 - """ - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - try: - phonemes, f0, volume = engine.create_sing_phoneme_and_f0_and_volume( - score, style_id - ) - except TalkSingInvalidInputError as e: - raise HTTPException(status_code=400, detail=str(e)) - - return FrameAudioQuery( - f0=f0, - volume=volume, - phonemes=phonemes, - volumeScale=1, - outputSamplingRate=engine.default_sampling_rate, - outputStereo=False, - ) - - @router.post( - "/sing_frame_volume", - tags=["クエリ編集"], - summary="スコア・歌唱音声合成用のクエリからフレームごとの音量を得る", - ) - def sing_frame_volume( - score: Score, - frame_audio_query: FrameAudioQuery, - style_id: Annotated[StyleId, Query(alias="speaker")], - core_version: str | SkipJsonSchema[None] = None, - ) -> list[float]: - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - try: - return engine.create_sing_volume_from_phoneme_and_f0( - score, frame_audio_query.phonemes, frame_audio_query.f0, style_id - ) - except TalkSingInvalidInputError as e: - raise HTTPException(status_code=400, detail=str(e)) - - @router.post( - "/frame_synthesis", - response_class=FileResponse, - responses={ - 200: { - "content": { - "audio/wav": {"schema": {"type": "string", "format": "binary"}} - }, - } - }, - tags=["音声合成"], - ) - def frame_synthesis( - query: FrameAudioQuery, - style_id: Annotated[StyleId, Query(alias="speaker")], - core_version: str | SkipJsonSchema[None] = None, - ) -> FileResponse: - """ - 歌唱音声合成を行います。 - """ - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - try: - wave = engine.frame_synthsize_wave(query, style_id) - except TalkSingInvalidInputError as e: - raise HTTPException(status_code=400, detail=str(e)) - - with NamedTemporaryFile(delete=False) as f: - soundfile.write( - file=f, data=wave, samplerate=query.outputSamplingRate, format="WAV" - ) - - return FileResponse( - f.name, - media_type="audio/wav", - background=BackgroundTask(try_delete_file, f.name), - ) - - @router.post( - "/connect_waves", - response_class=FileResponse, - responses={ - 200: { - "content": { - "audio/wav": {"schema": {"type": "string", "format": "binary"}} - }, - } - }, - tags=["その他"], - summary="base64エンコードされた複数のwavデータを一つに結合する", - ) - def connect_waves(waves: list[str]) -> FileResponse: - """ - base64エンコードされたwavデータを一纏めにし、wavファイルで返します。 - """ - try: - waves_nparray, sampling_rate = connect_base64_waves(waves) - except ConnectBase64WavesException as err: - raise HTTPException(status_code=422, detail=str(err)) - - with NamedTemporaryFile(delete=False) as f: - soundfile.write( - file=f, - data=waves_nparray, - samplerate=sampling_rate, - format="WAV", - ) - - return FileResponse( - f.name, - media_type="audio/wav", - background=BackgroundTask(try_delete_file, f.name), - ) - - @router.post( - "/validate_kana", - tags=["その他"], - summary="テキストがAquesTalk 風記法に従っているか判定する", - responses={ - 400: { - "description": "テキストが不正です", - "model": ParseKanaBadRequest, - } - }, - ) - async def validate_kana( - text: Annotated[str, Query(description="判定する対象の文字列")] - ) -> bool: - """ - テキストがAquesTalk 風記法に従っているかどうかを判定します。 - 従っていない場合はエラーが返ります。 - """ - try: - parse_kana(text) - return True - except ParseKanaError as err: - raise HTTPException( - status_code=400, - detail=ParseKanaBadRequest(err).model_dump(), - ) - - @router.post("/initialize_speaker", status_code=204, tags=["その他"]) - def initialize_speaker( - style_id: Annotated[StyleId, Query(alias="speaker")], - skip_reinit: Annotated[ - bool, - Query( - description="既に初期化済みのスタイルの再初期化をスキップするかどうか" - ), - ] = False, - core_version: str | SkipJsonSchema[None] = None, - ) -> None: - """ - 指定されたスタイルを初期化します。 - 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 - """ - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - engine.initialize_synthesis(style_id, skip_reinit=skip_reinit) - - @router.get("/is_initialized_speaker", tags=["その他"]) - def is_initialized_speaker( - style_id: Annotated[StyleId, Query(alias="speaker")], - core_version: str | SkipJsonSchema[None] = None, - ) -> bool: - """ - 指定されたスタイルが初期化されているかどうかを返します。 - """ - version = core_version or LATEST_VERSION - engine = tts_engines.get_engine(version) - return engine.is_synthesis_initialized(style_id) - - @router.get("/supported_devices", tags=["その他"]) - def supported_devices( - core_version: str | SkipJsonSchema[None] = None, - ) -> SupportedDevicesInfo: - """対応デバイスの一覧を取得します。""" - version = core_version or LATEST_VERSION - supported_devices = tts_engines.get_engine(version).supported_devices - if supported_devices is None: - raise HTTPException(status_code=422, detail="非対応の機能です。") - return SupportedDevicesInfo.generate_from(supported_devices) - - return router diff --git a/voicevox_engine/voicevox_engine/app/routers/user_dict.py b/voicevox_engine/voicevox_engine/app/routers/user_dict.py deleted file mode 100644 index a1a918d939afdaa9f8c6a859457102db24c87b67..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/app/routers/user_dict.py +++ /dev/null @@ -1,200 +0,0 @@ -"""ユーザー辞書機能を提供する API Router""" - -from typing import Annotated - -from fastapi import APIRouter, Body, Depends, HTTPException, Path, Query -from pydantic import ValidationError -from pydantic.json_schema import SkipJsonSchema - -from voicevox_engine.user_dict.model import UserDictWord, WordTypes -from voicevox_engine.user_dict.user_dict_manager import UserDictionary -from voicevox_engine.user_dict.user_dict_word import ( - USER_DICT_MAX_PRIORITY, - USER_DICT_MIN_PRIORITY, - UserDictInputError, - WordProperty, -) - -from ..dependencies import VerifyMutabilityAllowed - - -def generate_user_dict_router( - user_dict: UserDictionary, verify_mutability: VerifyMutabilityAllowed -) -> APIRouter: - """ユーザー辞書 API Router を生成する""" - router = APIRouter(tags=["ユーザー辞書"]) - - @router.get( - "/user_dict", - response_description="単語のUUIDとその詳細", - ) - def get_user_dict_words() -> dict[str, UserDictWord]: - """ - ユーザー辞書に登録されている単語の一覧を返します。 - 単語の表層形(surface)は正規化済みの物を返します。 - """ - try: - return user_dict.read_dict() - except UserDictInputError as err: - raise HTTPException(status_code=422, detail=str(err)) - except Exception: - raise HTTPException( - status_code=500, detail="辞書の読み込みに失敗しました。" - ) - - @router.post("/user_dict_word", dependencies=[Depends(verify_mutability)]) - def add_user_dict_word( - surface: Annotated[str, Query(description="言葉の表層形")], - pronunciation: Annotated[str, Query(description="言葉の発音(カタカナ)")], - accent_type: Annotated[ - int, Query(description="アクセント型(音が下がる場所を指す)") - ], - word_type: Annotated[ - WordTypes | SkipJsonSchema[None], - Query( - description="PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか" - ), - ] = None, - priority: Annotated[ - int | SkipJsonSchema[None], - Query( - ge=USER_DICT_MIN_PRIORITY, - le=USER_DICT_MAX_PRIORITY, - description="単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨", - # "SkipJsonSchema[None]"の副作用でスキーマーが欠落する問題に対するワークアラウンド - json_schema_extra={ - "maximum": USER_DICT_MAX_PRIORITY, - "minimum": USER_DICT_MIN_PRIORITY, - }, - ), - ] = None, - ) -> str: - """ - ユーザー辞書に言葉を追加します。 - """ - try: - word_uuid = user_dict.apply_word( - WordProperty( - surface=surface, - pronunciation=pronunciation, - accent_type=accent_type, - word_type=word_type, - priority=priority, - ) - ) - return word_uuid - except ValidationError as e: - raise HTTPException( - status_code=422, detail="パラメータに誤りがあります。\n" + str(e) - ) - except UserDictInputError as err: - raise HTTPException(status_code=422, detail=str(err)) - except Exception: - raise HTTPException( - status_code=500, detail="ユーザー辞書への追加に失敗しました。" - ) - - @router.put( - "/user_dict_word/{word_uuid}", - status_code=204, - dependencies=[Depends(verify_mutability)], - ) - def rewrite_user_dict_word( - surface: Annotated[str, Query(description="言葉の表層形")], - pronunciation: Annotated[str, Query(description="言葉の発音(カタカナ)")], - accent_type: Annotated[ - int, Query(description="アクセント型(音が下がる場所を指す)") - ], - word_uuid: Annotated[str, Path(description="更新する言葉のUUID")], - word_type: Annotated[ - WordTypes | SkipJsonSchema[None], - Query( - description="PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか" - ), - ] = None, - priority: Annotated[ - int | SkipJsonSchema[None], - Query( - ge=USER_DICT_MIN_PRIORITY, - le=USER_DICT_MAX_PRIORITY, - description="単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。", - # "SkipJsonSchema[None]"の副作用でスキーマーが欠落する問題に対するワークアラウンド - json_schema_extra={ - "maximum": USER_DICT_MAX_PRIORITY, - "minimum": USER_DICT_MIN_PRIORITY, - }, - ), - ] = None, - ) -> None: - """ - ユーザー辞書に登録されている言葉を更新します。 - """ - try: - user_dict.rewrite_word( - word_uuid, - WordProperty( - surface=surface, - pronunciation=pronunciation, - accent_type=accent_type, - word_type=word_type, - priority=priority, - ), - ) - except ValidationError as e: - raise HTTPException( - status_code=422, detail="パラメータに誤りがあります。\n" + str(e) - ) - except UserDictInputError as err: - raise HTTPException(status_code=422, detail=str(err)) - except Exception: - raise HTTPException( - status_code=500, detail="ユーザー辞書の更新に失敗しました。" - ) - - @router.delete( - "/user_dict_word/{word_uuid}", - status_code=204, - dependencies=[Depends(verify_mutability)], - ) - def delete_user_dict_word( - word_uuid: Annotated[str, Path(description="削除する言葉のUUID")] - ) -> None: - """ - ユーザー辞書に登録されている言葉を削除します。 - """ - try: - user_dict.delete_word(word_uuid=word_uuid) - except UserDictInputError as err: - raise HTTPException(status_code=422, detail=str(err)) - except Exception: - raise HTTPException( - status_code=500, detail="ユーザー辞書の更新に失敗しました。" - ) - - @router.post( - "/import_user_dict", - status_code=204, - dependencies=[Depends(verify_mutability)], - ) - def import_user_dict_words( - import_dict_data: Annotated[ - dict[str, UserDictWord], - Body(description="インポートするユーザー辞書のデータ"), - ], - override: Annotated[ - bool, Query(description="重複したエントリがあった場合、上書きするかどうか") - ], - ) -> None: - """ - 他のユーザー辞書をインポートします。 - """ - try: - user_dict.import_user_dict(dict_data=import_dict_data, override=override) - except UserDictInputError as err: - raise HTTPException(status_code=422, detail=str(err)) - except Exception: - raise HTTPException( - status_code=500, detail="ユーザー辞書のインポートに失敗しました。" - ) - - return router diff --git a/voicevox_engine/voicevox_engine/cancellable_engine.py b/voicevox_engine/voicevox_engine/cancellable_engine.py deleted file mode 100644 index a812892f337116c2c3753eee9a36ea8560c44b0e..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/cancellable_engine.py +++ /dev/null @@ -1,265 +0,0 @@ -"""キャンセル可能な音声合成""" - -import asyncio -import queue -import sys -from multiprocessing import Pipe, Process - -if sys.platform == "win32": - from multiprocessing.connection import PipeConnection as ConnectionType -else: - from multiprocessing.connection import Connection as ConnectionType - -from pathlib import Path -from tempfile import NamedTemporaryFile - -import soundfile -from fastapi import Request - -from .core.core_initializer import initialize_cores -from .metas.Metas import StyleId -from .model import AudioQuery -from .tts_pipeline.tts_engine import LatestVersion, make_tts_engines_from_cores - - -class CancellableEngineInternalError(Exception): - """キャンセル可能エンジンの内部エラー""" - - pass - - -class CancellableEngine: - """ - 音声合成のキャンセル機能に関するクラス - 初期化後は、synthesis関数で音声合成できる - (オリジナルと比べ引数が増えているので注意) - - パラメータ use_gpu, voicelib_dirs, voicevox_dir, - runtime_dirs, cpu_num_threads, enable_mock は、 core_initializer を参照 - - Attributes - ---------- - watch_con_list: list[tuple[Request, Process]] - Requestは接続の監視に使用され、Processは通信切断時のプロセスキルに使用される - クライアントから接続があるとlistにtupleが追加される - 接続が切断、もしくは音声合成が終了すると削除される - procs_and_cons: queue.Queue[tuple[Process, ConnectionType]] - 音声合成の準備が終わっているプロセスのList - (音声合成中のプロセスは入っていない) - """ - - def __init__( - self, - init_processes: int, - use_gpu: bool, - voicelib_dirs: list[Path] | None, - voicevox_dir: Path | None, - runtime_dirs: list[Path] | None, - cpu_num_threads: int | None, - enable_mock: bool, - ) -> None: - """ - 変数の初期化を行う - また、init_processesの数だけプロセスを起動し、procs_and_consに格納する - """ - - self.use_gpu = use_gpu - self.voicelib_dirs = voicelib_dirs - self.voicevox_dir = voicevox_dir - self.runtime_dirs = runtime_dirs - self.cpu_num_threads = cpu_num_threads - self.enable_mock = enable_mock - - self.watch_con_list: list[tuple[Request, Process]] = [] - - procs_and_cons: queue.Queue[tuple[Process, ConnectionType]] = queue.Queue() - for _ in range(init_processes): - procs_and_cons.put(self.start_new_proc()) - self.procs_and_cons = procs_and_cons - - def start_new_proc( - self, - ) -> tuple[Process, ConnectionType]: - """ - 新しく開始したプロセスを返す関数 - - Returns - ------- - ret_proc: Process - 新規のプロセス - sub_proc_con1: ConnectionType - ret_procのプロセスと通信するためのPipe - """ - sub_proc_con1, sub_proc_con2 = Pipe(True) - ret_proc = Process( - target=start_synthesis_subprocess, - kwargs={ - "use_gpu": self.use_gpu, - "voicelib_dirs": self.voicelib_dirs, - "voicevox_dir": self.voicevox_dir, - "runtime_dirs": self.runtime_dirs, - "cpu_num_threads": self.cpu_num_threads, - "enable_mock": self.enable_mock, - "sub_proc_con": sub_proc_con2, - }, - daemon=True, - ) - ret_proc.start() - return ret_proc, sub_proc_con1 - - def finalize_con( - self, - req: Request, - proc: Process, - sub_proc_con: ConnectionType | None, - ) -> None: - """ - 接続が切断された時の処理を行う関数 - watch_con_listからの削除、プロセスの後処理を行う - プロセスが生きている場合はそのままprocs_and_consに加える - 死んでいる場合は新しく生成したものをprocs_and_consに加える - - Parameters - ---------- - req: fastapi.Request - 接続確立時に受け取ったものをそのまま渡せばよい - https://fastapi.tiangolo.com/advanced/using-request-directly/ - proc: Process - 音声合成を行っていたプロセス - sub_proc_con: ConnectionType, optional - 音声合成を行っていたプロセスとのPipe - 指定されていない場合、プロセスは再利用されず終了される - """ - try: - self.watch_con_list.remove((req, proc)) - except ValueError: - pass - try: - if not proc.is_alive() or sub_proc_con is None: - proc.close() - raise ValueError - # プロセスが死んでいない場合は再利用する - self.procs_and_cons.put((proc, sub_proc_con)) - except ValueError: - # プロセスが死んでいるので新しく作り直す - self.procs_and_cons.put(self.start_new_proc()) - - def _synthesis_impl( - self, - query: AudioQuery, - style_id: StyleId, - request: Request, - version: str | LatestVersion, - ) -> str: - """ - 音声合成を行う関数 - 通常エンジンの引数に比べ、requestが必要になっている - また、返り値がファイル名になっている - - Parameters - ---------- - query: AudioQuery - style_id: StyleId - request: fastapi.Request - 接続確立時に受け取ったものをそのまま渡せばよい - https://fastapi.tiangolo.com/advanced/using-request-directly/ - version - - Returns - ------- - f_name: str - 生成された音声ファイルの名前 - """ - proc, sub_proc_con1 = self.procs_and_cons.get() - self.watch_con_list.append((request, proc)) - try: - sub_proc_con1.send((query, style_id, version)) - f_name = sub_proc_con1.recv() - if isinstance(f_name, str): - audio_file_name = f_name - else: - # ここには来ないはず - raise CancellableEngineInternalError("不正な値が生成されました") - except EOFError: - raise CancellableEngineInternalError("既にサブプロセスは終了されています") - except Exception: - self.finalize_con(request, proc, sub_proc_con1) - raise - - self.finalize_con(request, proc, sub_proc_con1) - return audio_file_name - - async def catch_disconnection(self) -> None: - """ - 接続監視を行うコルーチン - """ - while True: - await asyncio.sleep(1) - for con in self.watch_con_list: - req, proc = con - if await req.is_disconnected(): - try: - if proc.is_alive(): - proc.terminate() - proc.join() - proc.close() - except ValueError: - pass - finally: - self.finalize_con(req, proc, None) - - -def start_synthesis_subprocess( - use_gpu: bool, - voicelib_dirs: list[Path] | None, - voicevox_dir: Path | None, - runtime_dirs: list[Path] | None, - cpu_num_threads: int | None, - enable_mock: bool, - sub_proc_con: ConnectionType, -) -> None: - """ - 音声合成を行うサブプロセスで行うための関数 - pickle化の関係でグローバルに書いている - - 引数 use_gpu, voicelib_dirs, voicevox_dir, - runtime_dirs, cpu_num_threads, enable_mock は、 core_initializer を参照 - - Parameters - ---------- - sub_proc_con: ConnectionType - メインプロセスと通信するためのPipe - """ - - core_manager = initialize_cores( - use_gpu=use_gpu, - voicelib_dirs=voicelib_dirs, - voicevox_dir=voicevox_dir, - runtime_dirs=runtime_dirs, - cpu_num_threads=cpu_num_threads, - enable_mock=enable_mock, - ) - tts_engines = make_tts_engines_from_cores(core_manager) - - assert len(tts_engines.versions()) != 0, "音声合成エンジンがありません。" - while True: - try: - query, style_id, version = sub_proc_con.recv() - try: - _engine = tts_engines.get_engine(version) - except Exception: - # バージョンが見つからないエラー - sub_proc_con.send("") - continue - # FIXME: enable_interrogative_upspeakフラグをWebAPIから受け渡してくる - wave = _engine.synthesize_wave( - query, style_id, enable_interrogative_upspeak=False - ) - with NamedTemporaryFile(delete=False) as f: - soundfile.write( - file=f, data=wave, samplerate=query.outputSamplingRate, format="WAV" - ) - sub_proc_con.send(f.name) - except Exception: - sub_proc_con.close() - raise diff --git a/voicevox_engine/voicevox_engine/core/__init__.py b/voicevox_engine/voicevox_engine/core/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/voicevox_engine/core/core_adapter.py b/voicevox_engine/voicevox_engine/core/core_adapter.py deleted file mode 100644 index 7a2bf4d4810312b3a3a5606592b7192c8f87482f..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/core/core_adapter.py +++ /dev/null @@ -1,273 +0,0 @@ -"""VOICEVOX CORE のアダプター""" - -import json -import threading -from dataclasses import dataclass -from typing import Any, Literal, NewType - -import numpy as np -from numpy.typing import NDArray -from pydantic import TypeAdapter - -from ..metas.Metas import StyleId -from .core_wrapper import CoreWrapper, OldCoreError - -CoreStyleId = NewType("CoreStyleId", int) -CoreStyleType = Literal["talk", "singing_teacher", "frame_decode", "sing"] - - -@dataclass(frozen=True) -class CoreCharacterStyle: - """コアに含まれるキャラクターのスタイル情報""" - - name: str - id: CoreStyleId - type: CoreStyleType | None = "talk" - - -@dataclass(frozen=True) -class CoreCharacter: - """コアに含まれるキャラクター情報""" - - name: str - speaker_uuid: str - styles: list[CoreCharacterStyle] - version: str # キャラクターのバージョン - - -_core_character_adapter = TypeAdapter(CoreCharacter) - - -@dataclass(frozen=True) -class DeviceSupport: - """音声ライブラリのデバイス利用可否""" - - cpu: bool - cuda: bool # CUDA (Nvidia GPU) - dml: bool # DirectML (Nvidia GPU/Radeon GPU等) - - -class CoreAdapter: - """ - コアのアダプター。 - ついでにコア内部で推論している処理をプロセスセーフにする。 - """ - - def __init__(self, core: CoreWrapper): - super().__init__() - self.core = core - self.mutex = threading.Lock() - - @property - def default_sampling_rate(self) -> int: - return self.core.default_sampling_rate - - @property - def characters(self) -> list[CoreCharacter]: - """キャラクター情報""" - metas: list[Any] = json.loads(self.core.metas()) - return list(map(_core_character_adapter.validate_python, metas)) - - @property - def supported_devices(self) -> DeviceSupport | None: - """デバイスサポート情報(None: 情報無し)""" - try: - supported_devices = json.loads(self.core.supported_devices()) - assert isinstance(supported_devices, dict) - device_support = DeviceSupport( - cpu=supported_devices["cpu"], - cuda=supported_devices["cuda"], - dml=supported_devices["dml"], - ) - except OldCoreError: - device_support = None - return device_support - - def initialize_style_id_synthesis( - self, style_id: StyleId, skip_reinit: bool - ) -> None: - """ - 指定したスタイルでの音声合成を初期化する。 - 何度も実行可能。未実装の場合は何もしない。 - Parameters - ---------- - style_id : StyleId - スタイルID - skip_reinit : bool - True の場合, 既に初期化済みのキャラクターの再初期化をスキップします - """ - try: - with self.mutex: - # 以下の条件のいずれかを満たす場合, 初期化を実行する - # 1. 引数 skip_reinit が False の場合 - # 2. キャラクターが初期化されていない場合 - if (not skip_reinit) or (not self.core.is_model_loaded(style_id)): - self.core.load_model(style_id) - except OldCoreError: - pass # コアが古い場合はどうしようもないので何もしない - - def is_initialized_style_id_synthesis(self, style_id: StyleId) -> bool: - """指定したスタイルでの音声合成が初期化されているかどうかを返す""" - try: - return self.core.is_model_loaded(style_id) - except OldCoreError: - return True # コアが古い場合はどうしようもないのでTrueを返す - - def safe_yukarin_s_forward( - self, phoneme_list_s: NDArray[np.int64], style_id: StyleId - ) -> NDArray[np.float32]: - # 「指定スタイルを初期化」「mutexによる安全性」「コア仕様に従う無音付加」「系列長・データ型に関するアダプター」を提供する - self.initialize_style_id_synthesis(style_id, skip_reinit=True) - - # 前後無音を付加する(詳細: voicevox_engine#924) - phoneme_list_s = np.r_[0, phoneme_list_s, 0] - - with self.mutex: - phoneme_length = self.core.yukarin_s_forward( - length=len(phoneme_list_s), - phoneme_list=phoneme_list_s, - style_id=np.array(style_id, dtype=np.int64).reshape(-1), - ) - - # 前後無音に相当する領域を破棄する - phoneme_length = phoneme_length[1:-1] - - return phoneme_length - - def safe_yukarin_sa_forward( - self, - vowel_phoneme_list: NDArray[np.int64], - consonant_phoneme_list: NDArray[np.int64], - start_accent_list: NDArray[np.int64], - end_accent_list: NDArray[np.int64], - start_accent_phrase_list: NDArray[np.int64], - end_accent_phrase_list: NDArray[np.int64], - style_id: StyleId, - ) -> NDArray[np.float32]: - # 「指定スタイルを初期化」「mutexによる安全性」「コア仕様に従う無音付加」「系列長・データ型に関するアダプター」を提供する - self.initialize_style_id_synthesis(style_id, skip_reinit=True) - - # 前後無音を付加する(詳細: voicevox_engine#924) - vowel_phoneme_list = np.r_[0, vowel_phoneme_list, 0] - consonant_phoneme_list = np.r_[-1, consonant_phoneme_list, -1] - start_accent_list = np.r_[0, start_accent_list, 0] - end_accent_list = np.r_[0, end_accent_list, 0] - start_accent_phrase_list = np.r_[0, start_accent_phrase_list, 0] - end_accent_phrase_list = np.r_[0, end_accent_phrase_list, 0] - - with self.mutex: - f0_list: NDArray[np.float32] = self.core.yukarin_sa_forward( - length=vowel_phoneme_list.shape[0], - vowel_phoneme_list=vowel_phoneme_list[np.newaxis], - consonant_phoneme_list=consonant_phoneme_list[np.newaxis], - start_accent_list=start_accent_list[np.newaxis], - end_accent_list=end_accent_list[np.newaxis], - start_accent_phrase_list=start_accent_phrase_list[np.newaxis], - end_accent_phrase_list=end_accent_phrase_list[np.newaxis], - style_id=np.array(style_id, dtype=np.int64).reshape(-1), - )[0] - - # 前後無音に相当する領域を破棄する - f0_list = f0_list[1:-1] - - return f0_list - - def safe_decode_forward( - self, - phoneme: NDArray[np.float32], - f0: NDArray[np.float32], - style_id: StyleId, - ) -> tuple[NDArray[np.float32], int]: - # 「指定スタイルを初期化」「mutexによる安全性」「系列長・データ型に関するアダプター」を提供する - self.initialize_style_id_synthesis(style_id, skip_reinit=True) - with self.mutex: - wave = self.core.decode_forward( - length=phoneme.shape[0], - phoneme_size=phoneme.shape[1], - f0=f0[:, np.newaxis], - phoneme=phoneme, - style_id=np.array(style_id, dtype=np.int64).reshape(-1), - ) - sr_wave = self.default_sampling_rate - return wave, sr_wave - - def safe_predict_sing_consonant_length_forward( - self, - consonant: NDArray[np.int64], - vowel: NDArray[np.int64], - note_duration: NDArray[np.int64], - style_id: StyleId, - ) -> NDArray[np.int64]: - # 「指定スタイルを初期化」「mutexによる安全性」「コア仕様に従う無音付加」「系列長・データ型に関するアダプター」を提供する - self.initialize_style_id_synthesis(style_id, skip_reinit=True) - - with self.mutex: - consonant_length = self.core.predict_sing_consonant_length_forward( - length=consonant.shape[0], - consonant=consonant[np.newaxis], - vowel=vowel[np.newaxis], - note_duration=note_duration[np.newaxis], - style_id=np.array(style_id, dtype=np.int64).reshape(-1), - ) - - return consonant_length - - def safe_predict_sing_f0_forward( - self, - phoneme: NDArray[np.int64], - note: NDArray[np.int64], - style_id: StyleId, - ) -> NDArray[np.float32]: - # 「指定スタイルを初期化」「mutexによる安全性」「コア仕様に従う無音付加」「系列長・データ型に関するアダプター」を提供する - self.initialize_style_id_synthesis(style_id, skip_reinit=True) - - with self.mutex: - f0 = self.core.predict_sing_f0_forward( - length=phoneme.shape[0], - phoneme=phoneme[np.newaxis], - note=note[np.newaxis], - style_id=np.array(style_id, dtype=np.int64).reshape(-1), - ) - - return f0 - - def safe_predict_sing_volume_forward( - self, - phoneme: NDArray[np.int64], - note: NDArray[np.int64], - f0: NDArray[np.float32], - style_id: StyleId, - ) -> NDArray[np.float32]: - # 「指定スタイルを初期化」「mutexによる安全性」「コア仕様に従う無音付加」「系列長・データ型に関するアダプター」を提供する - self.initialize_style_id_synthesis(style_id, skip_reinit=True) - - with self.mutex: - volume = self.core.predict_sing_volume_forward( - length=phoneme.shape[0], - phoneme=phoneme[np.newaxis], - note=note[np.newaxis], - f0=f0[np.newaxis], - style_id=np.array(style_id, dtype=np.int64).reshape(-1), - ) - - return volume - - def safe_sf_decode_forward( - self, - phoneme: NDArray[np.int64], - f0: NDArray[np.float32], - volume: NDArray[np.float32], - style_id: StyleId, - ) -> tuple[NDArray[np.float32], int]: - # 「指定スタイルを初期化」「mutexによる安全性」「系列長・データ型に関するアダプター」を提供する - self.initialize_style_id_synthesis(style_id, skip_reinit=True) - with self.mutex: - wave = self.core.sf_decode_forward( - length=phoneme.shape[0], - phoneme=phoneme[np.newaxis], - f0=f0[np.newaxis], - volume=volume[np.newaxis], - style_id=np.array(style_id, dtype=np.int64).reshape(-1), - ) - sr_wave = self.default_sampling_rate - return wave, sr_wave diff --git a/voicevox_engine/voicevox_engine/core/core_initializer.py b/voicevox_engine/voicevox_engine/core/core_initializer.py deleted file mode 100644 index 5e645dfb1e2a05f1f27355a795105b46a7cf7a0a..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/core/core_initializer.py +++ /dev/null @@ -1,179 +0,0 @@ -"""VOICEVOX CORE インスタンスの生成""" - -import json -import os -import sys -from pathlib import Path - -from ..utility.core_version_utility import get_latest_version -from ..utility.path_utility import engine_root, get_save_dir -from .core_adapter import CoreAdapter -from .core_wrapper import CoreWrapper, load_runtime_lib - -MOCK_VER = "0.0.0" - - -def get_half_logical_cores() -> int: - logical_cores = os.cpu_count() - if logical_cores is None: - return 0 - return logical_cores // 2 - - -class CoreNotFound(Exception): - """コアが見つからないエラー""" - - pass - - -class CoreManager: - """コアの集まりを一括管理するマネージャー""" - - def __init__(self) -> None: - self._cores: dict[str, CoreAdapter] = {} - - def versions(self) -> list[str]: - """登録されたコアのバージョン一覧を取得する。""" - return list(self._cores.keys()) - - def latest_version(self) -> str: - """登録された最新版コアのバージョンを取得する。""" - return get_latest_version(self.versions()) - - def register_core(self, core: CoreAdapter, version: str) -> None: - """コアを登録する。""" - self._cores[version] = core - - def get_core(self, version: str) -> CoreAdapter: - """指定バージョンのコアを取得する。""" - if version in self._cores: - return self._cores[version] - raise CoreNotFound(f"バージョン {version} のコアが見つかりません") - - def has_core(self, version: str) -> bool: - """指定バージョンのコアが登録されているか否かを返す。""" - return version in self._cores - - def items(self) -> list[tuple[str, CoreAdapter]]: - """登録されたコアとそのバージョンのリストを取得する。""" - return list(self._cores.items()) - - -def initialize_cores( - use_gpu: bool, - voicelib_dirs: list[Path] | None = None, - voicevox_dir: Path | None = None, - runtime_dirs: list[Path] | None = None, - cpu_num_threads: int | None = None, - enable_mock: bool = True, - load_all_models: bool = False, -) -> CoreManager: - """ - 音声ライブラリをロードしてコアを生成 - - Parameters - ---------- - use_gpu: bool - 音声ライブラリに GPU を使わせるか否か - voicelib_dirs: - 音声ライブラリ自体があるディレクトリのリスト - voicevox_dir: - コンパイル済みのvoicevox、またはvoicevox_engineがあるディレクトリ - runtime_dirs: - コアで使用するライブラリのあるディレクトリのリスト - None のとき、voicevox_dir、カレントディレクトリになる - cpu_num_threads: - 音声ライブラリが、推論に用いるCPUスレッド数を設定する - Noneのとき、論理コア数の半分が指定される - enable_mock: - コア読み込みに失敗したとき、代わりにmockを使用するかどうか - load_all_models: - 起動時に全てのモデルを読み込むかどうか - """ - if cpu_num_threads == 0 or cpu_num_threads is None: - print( - "Warning: cpu_num_threads is set to 0. " - + "Setting it to half of the logical cores.", - file=sys.stderr, - ) - cpu_num_threads = get_half_logical_cores() - - root_dir = engine_root() - - # 引数による指定を反映し、無ければ `root_dir` とする - runtime_dirs = runtime_dirs or [] - runtime_dirs += [voicevox_dir] if voicevox_dir else [] - runtime_dirs = runtime_dirs or [root_dir] - runtime_dirs = [p.expanduser() for p in runtime_dirs] - # ランタイムをロードする - load_runtime_lib(runtime_dirs) - - # コアをロードし `core_manager` へ登録する - core_manager = CoreManager() - - # 引数による指定を反映し、無ければ `root_dir` とする - voicelib_dirs = voicelib_dirs or [] - voicelib_dirs += [voicevox_dir] if voicevox_dir else [] - voicelib_dirs = voicelib_dirs or [root_dir] - voicelib_dirs = [p.expanduser() for p in voicelib_dirs] - - if not enable_mock: - - def load_core_library(core_dir: Path, suppress_error: bool = False) -> None: - """ - 指定されたコアをロードし `core_manager` へ登録する。 - Parameters - ---------- - core_dir : Path - 直下にコア(共有ライブラリ)が存在するディレクトリ、あるいはその候補 - suppress_error: bool - エラーを抑制する。`core_dir` がコア候補であることを想定。 - """ - # 指定されたコアをロードし登録する - try: - # コアをロードする - core = CoreWrapper(use_gpu, core_dir, cpu_num_threads, load_all_models) - # コアを登録する - metas = json.loads(core.metas()) - core_version: str = metas[0]["version"] - print(f"Info: Loading core {core_version}.") - if core_manager.has_core(core_version): - print( - "Warning: Core loading is skipped because of version duplication.", - file=sys.stderr, - ) - else: - core_manager.register_core(CoreAdapter(core), core_version) - except Exception: - # コアでなかった場合のエラーを抑制する - if not suppress_error: - raise - - # `voicelib_dirs` 下のコアをロードし登録する - for core_dir in voicelib_dirs: - load_core_library(core_dir) - - # ユーザーディレクトリ下のコアをロードし登録する - # コア候補を列挙する - user_voicelib_dirs = [] - core_libraries_dir = get_save_dir() / "core_libraries" - core_libraries_dir.mkdir(exist_ok=True) - user_voicelib_dirs.append(core_libraries_dir) - for path in core_libraries_dir.glob("*"): - if not path.is_dir(): - continue - user_voicelib_dirs.append(path) - # コア候補をロードし登録する。候補がコアで無かった場合のエラーを抑制する。 - for core_dir in user_voicelib_dirs: - load_core_library(core_dir, suppress_error=True) - - else: - # モック追加 - from ..dev.core.mock import MockCoreWrapper - - if not core_manager.has_core(MOCK_VER): - print("Info: Loading mock.") - core = MockCoreWrapper() - core_manager.register_core(CoreAdapter(core), MOCK_VER) - - return core_manager diff --git a/voicevox_engine/voicevox_engine/core/core_wrapper.py b/voicevox_engine/voicevox_engine/core/core_wrapper.py deleted file mode 100644 index 7a6e1ae7794a5e6d2f3998c9a3b6ea426f736bdb..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/core/core_wrapper.py +++ /dev/null @@ -1,928 +0,0 @@ -"""VOICEVOX CORE の Python ラッパー""" - -import os -import platform -from ctypes import _Pointer # noqa: F401 -from ctypes import CDLL, POINTER, c_bool, c_char_p, c_float, c_int, c_long -from ctypes.util import find_library -from dataclasses import dataclass -from enum import Enum, auto -from pathlib import Path -from typing import Literal - -import numpy as np -from numpy.typing import NDArray - - -class OldCoreError(Exception): - """古いコアが使用されている場合に発生するエラー""" - - -class CoreError(Exception): - """コア呼び出しで発生したエラー""" - - -def load_runtime_lib(runtime_dirs: list[Path]) -> None: - """ - コアの実行に必要な依存 DLL をロードする。検索対象ディレクトリは引数 `runtime_dirs` およびシステム検索対象ディレクトリ。 - - Args: - runtime_dirs - 直下に DLL が存在するディレクトリの一覧 - """ - # `lib_file_names`は「ENGINE が利用可能な DLL のファイル名一覧」である - # `lib_names` は「ENGINE が利用可能な DLL のライブラリ名一覧」である(ライブラリ名は `libtorch.so.1.0` の `torch` 部分) - if platform.system() == "Windows": - # DirectML.dllはonnxruntimeと互換性のないWindows標準搭載のものを優先して読み込むことがあるため、明示的に読み込む - # 参考 1. https://github.com/microsoft/onnxruntime/issues/3360 - # 参考 2. https://tadaoyamaoka.hatenablog.com/entry/2020/06/07/113616 - lib_file_names = [ - "torch_cpu.dll", - "torch_cuda.dll", - "DirectML.dll", - "onnxruntime.dll", - ] - lib_names = ["torch_cpu", "torch_cuda", "onnxruntime"] - elif platform.system() == "Linux": - lib_file_names = ["libtorch.so", "libonnxruntime.so"] - lib_names = ["torch", "onnxruntime"] - elif platform.system() == "Darwin": - lib_file_names = ["libonnxruntime.dylib"] - lib_names = ["onnxruntime"] - else: - raise RuntimeError("不明なOSです") - - # 引数指定ディレクトリ直下の DLL をロードする - for runtime_dir in runtime_dirs: - for lib_file_name in lib_file_names: - try: - CDLL(str((runtime_dir / lib_file_name).resolve(strict=True))) - except OSError: - pass - - # システム検索ディレクトリ直下の DLL をロードする - for lib_name in lib_names: - try: - CDLL(find_library(lib_name)) - except (OSError, TypeError): - pass - - -class GPUType(Enum): - # NONEはCPUしか対応していないことを示す - NONE = auto() - CUDA = auto() - DIRECT_ML = auto() - - -@dataclass(frozen=True) -class _CoreInfo: - name: str # Coreファイル名 - platform: Literal["Windows", "Linux", "Darwin"] # 対応システム/OS - arch: Literal["x64", "x86", "armv7l", "aarch64", "universal"] # 対応アーキテクチャ - core_type: Literal["libtorch", "onnxruntime"] # `model_type` - gpu_type: GPUType # NONE | CUDA | DIRECT_ML - - -# version 0.12 より前のコアの情報 -_CORE_INFOS = [ - # Windows - _CoreInfo( - name="core.dll", - platform="Windows", - arch="x64", - core_type="libtorch", - gpu_type=GPUType.CUDA, - ), - _CoreInfo( - name="core_cpu.dll", - platform="Windows", - arch="x64", - core_type="libtorch", - gpu_type=GPUType.NONE, - ), - _CoreInfo( - name="core_gpu_x64_nvidia.dll", - platform="Windows", - arch="x64", - core_type="onnxruntime", - gpu_type=GPUType.CUDA, - ), - _CoreInfo( - name="core_gpu_x64_directml.dll", - platform="Windows", - arch="x64", - core_type="onnxruntime", - gpu_type=GPUType.DIRECT_ML, - ), - _CoreInfo( - name="core_cpu_x64.dll", - platform="Windows", - arch="x64", - core_type="onnxruntime", - gpu_type=GPUType.NONE, - ), - _CoreInfo( - name="core_cpu_x86.dll", - platform="Windows", - arch="x86", - core_type="onnxruntime", - gpu_type=GPUType.NONE, - ), - _CoreInfo( - name="core_gpu_x86_directml.dll", - platform="Windows", - arch="x86", - core_type="onnxruntime", - gpu_type=GPUType.DIRECT_ML, - ), - _CoreInfo( - name="core_cpu_arm.dll", - platform="Windows", - arch="armv7l", - core_type="onnxruntime", - gpu_type=GPUType.NONE, - ), - _CoreInfo( - name="core_gpu_arm_directml.dll", - platform="Windows", - arch="armv7l", - core_type="onnxruntime", - gpu_type=GPUType.DIRECT_ML, - ), - _CoreInfo( - name="core_cpu_arm64.dll", - platform="Windows", - arch="aarch64", - core_type="onnxruntime", - gpu_type=GPUType.NONE, - ), - _CoreInfo( - name="core_gpu_arm64_directml.dll", - platform="Windows", - arch="aarch64", - core_type="onnxruntime", - gpu_type=GPUType.DIRECT_ML, - ), - # Linux - _CoreInfo( - name="libcore.so", - platform="Linux", - arch="x64", - core_type="libtorch", - gpu_type=GPUType.CUDA, - ), - _CoreInfo( - name="libcore_cpu.so", - platform="Linux", - arch="x64", - core_type="libtorch", - gpu_type=GPUType.NONE, - ), - _CoreInfo( - name="libcore_gpu_x64_nvidia.so", - platform="Linux", - arch="x64", - core_type="onnxruntime", - gpu_type=GPUType.CUDA, - ), - _CoreInfo( - name="libcore_cpu_x64.so", - platform="Linux", - arch="x64", - core_type="onnxruntime", - gpu_type=GPUType.NONE, - ), - _CoreInfo( - name="libcore_cpu_armhf.so", - platform="Linux", - arch="armv7l", - core_type="onnxruntime", - gpu_type=GPUType.NONE, - ), - _CoreInfo( - name="libcore_cpu_arm64.so", - platform="Linux", - arch="aarch64", - core_type="onnxruntime", - gpu_type=GPUType.NONE, - ), - # macOS - _CoreInfo( - name="libcore_cpu_universal2.dylib", - platform="Darwin", - arch="universal", - core_type="onnxruntime", - gpu_type=GPUType.NONE, - ), -] - - -# version 0.12 以降のコアの名前の辞書 -# - version 0.12, 0.13 のコアの名前: core -# - version 0.14 からのコアの名前: voicevox_core -_CORENAME_DICT = { - "Windows": ("voicevox_core.dll", "core.dll"), - "Linux": ("libvoicevox_core.so", "libcore.so"), - "Darwin": ("libvoicevox_core.dylib", "libcore.dylib"), -} - - -def _find_version_0_12_core_or_later(core_dir: Path) -> str | None: - """ - `core_dir`直下に存在する コア Version 0.12 以降の共有ライブラリ名(None: 不在) - - Version 0.12 以降と判定する条件は、 - - - core_dir に metas.json が存在しない - - コアライブラリの名前が CORENAME_DICT の定義に従っている - - の両方が真のときである。 - cf. https://github.com/VOICEVOX/voicevox_engine/issues/385 - """ - if (core_dir / "metas.json").exists(): - return None - - for core_name in _CORENAME_DICT[platform.system()]: - if (core_dir / core_name).is_file(): - return core_name - - return None - - -def _get_arch_name() -> Literal["x64", "x86", "aarch64", "armv7l"] | None: - """ - 実行中マシンのアーキテクチャ(None: サポート外アーキテクチャ) - """ - machine = platform.machine() - # 特定のアーキテクチャ上で複数パターンの文字列を返し得るので一意に変換 - if machine == "x86_64" or machine == "x64" or machine == "AMD64": - return "x64" - elif machine == "i386" or machine == "x86": - return "x86" - elif machine == "arm64": - return "aarch64" - elif machine == "aarch64": - return "aarch64" - elif machine == "armv7l": - return "armv7l" - else: - return None - - -def _get_core_name( - arch_name: Literal["x64", "x86", "aarch64", "armv7l", "universal"], - platform_name: str, - model_type: Literal["libtorch", "onnxruntime"], - gpu_type: GPUType, -) -> str | None: - """ - 設定値を満たすCoreの名前(None: サポート外)。 - macOSの場合はarch_nameをuniversalにする。 - Parameters - ---------- - arch_name : Literal["x64", "x86", "aarch64", "armv7l", "universal"] - 実行中マシンのアーキテクチャ - platform_name : str - 実行中マシンのシステム名 - model_type: Literal["libtorch", "onnxruntime"] - gpu_type: GPUType - Returns - ------- - name : str | None - Core名(None: サポート外) - """ - if platform_name == "Darwin": - if gpu_type == GPUType.NONE and (arch_name == "x64" or arch_name == "aarch64"): - arch_name = "universal" - else: - return None - for core_info in _CORE_INFOS: - if ( - core_info.platform == platform_name - and core_info.arch == arch_name - and core_info.core_type == model_type - and core_info.gpu_type == gpu_type - ): - return core_info.name - return None - - -def _get_suitable_core_name( - model_type: Literal["libtorch", "onnxruntime"], - gpu_type: GPUType, -) -> str | None: - """実行中マシン・引数設定値でサポートされるコアのファイル名(None: サポート外)""" - # 実行中マシンのアーキテクチャ・システム名 - arch_name = _get_arch_name() - platform_name = platform.system() - if arch_name is None: - return None - return _get_core_name(arch_name, platform_name, model_type, gpu_type) - - -def _check_core_type(core_dir: Path) -> Literal["libtorch", "onnxruntime"] | None: - """`core_dir`直下に存在し実行中マシンで利用可能な Core の model_type(None: 利用可能 Core 無し)""" - libtorch_core_names = [ - _get_suitable_core_name("libtorch", gpu_type=GPUType.CUDA), - _get_suitable_core_name("libtorch", gpu_type=GPUType.NONE), - # ("libtorch", GPUType.DIRECT_ML): libtorch版はDirectML未対応 - ] - onnxruntime_core_names = [ - _get_suitable_core_name("onnxruntime", gpu_type=GPUType.CUDA), - _get_suitable_core_name("onnxruntime", gpu_type=GPUType.DIRECT_ML), - _get_suitable_core_name("onnxruntime", gpu_type=GPUType.NONE), - ] - if any([(core_dir / name).is_file() for name in libtorch_core_names if name]): - return "libtorch" - elif any([(core_dir / name).is_file() for name in onnxruntime_core_names if name]): - return "onnxruntime" - else: - return None - - -def load_core(core_dir: Path, use_gpu: bool) -> CDLL: - """ - `core_dir` 直下に存在し実行中マシンでサポートされるコアDLLのロード - Parameters - ---------- - core_dir : Path - 直下にコア(共有ライブラリ)が存在するディレクトリ - use_gpu - Returns - ------- - core : CDLL - コアDLL - """ - # Core>=0.12 - core_name = _find_version_0_12_core_or_later(core_dir) - if core_name: - try: - # NOTE: CDLL クラスのコンストラクタの引数 name には文字列を渡す必要がある。 - # Windows 環境では PathLike オブジェクトを引数として渡すと初期化に失敗する。 - return CDLL(str((core_dir / core_name).resolve(strict=True))) - except OSError as err: - raise RuntimeError(f"コアの読み込みに失敗しました:{err}") - - # Core<0.12 - model_type = _check_core_type(core_dir) - if model_type is None: - raise RuntimeError("コアが見つかりません") - if use_gpu or model_type == "onnxruntime": - core_name = _get_suitable_core_name(model_type, gpu_type=GPUType.CUDA) - if core_name: - try: - return CDLL(str((core_dir / core_name).resolve(strict=True))) - except OSError: - pass - core_name = _get_suitable_core_name(model_type, gpu_type=GPUType.DIRECT_ML) - if core_name: - try: - return CDLL(str((core_dir / core_name).resolve(strict=True))) - except OSError: - pass - core_name = _get_suitable_core_name(model_type, gpu_type=GPUType.NONE) - if core_name: - try: - return CDLL(str((core_dir / core_name).resolve(strict=True))) - except OSError as err: - if model_type == "libtorch": - core_name = _get_suitable_core_name(model_type, gpu_type=GPUType.CUDA) - if core_name: - try: - return CDLL(str((core_dir / core_name).resolve(strict=True))) - except OSError as err_: - err = err_ - raise RuntimeError(f"コアの読み込みに失敗しました:{err}") - else: - raise RuntimeError( - f"このコンピュータのアーキテクチャ {platform.machine()} で利用可能なコアがありません" - ) - - -_C_TYPE = ( - type[c_bool] - | type[c_int] - | type[c_long] - | type[c_float] - | type[c_char_p] - | type["_Pointer[c_long]"] - | type["_Pointer[c_float]"] -) - - -@dataclass(frozen=True) -class _CoreApiType: - argtypes: tuple[_C_TYPE, ...] - restype: _C_TYPE | None - - -# コアAPIの型情報 -_CORE_API_TYPES = { - # NOTE: initialize 関数には実際には引数があるが、コアのバージョンによって引数が異なるため、意図的に引数の型付けをしない - "initialize": _CoreApiType( - argtypes=(), - restype=c_bool, - ), - "metas": _CoreApiType( - argtypes=(), - restype=c_char_p, - ), - "yukarin_s_forward": _CoreApiType( - argtypes=(c_int, POINTER(c_long), POINTER(c_long), POINTER(c_float)), - restype=c_bool, - ), - "yukarin_sa_forward": _CoreApiType( - argtypes=( - c_int, - POINTER(c_long), - POINTER(c_long), - POINTER(c_long), - POINTER(c_long), - POINTER(c_long), - POINTER(c_long), - POINTER(c_long), - POINTER(c_float), - ), - restype=c_bool, - ), - "decode_forward": _CoreApiType( - argtypes=( - c_int, - c_int, - POINTER(c_float), - POINTER(c_float), - POINTER(c_long), - POINTER(c_float), - ), - restype=c_bool, - ), - "predict_sing_consonant_length_forward": _CoreApiType( - argtypes=( - c_int, - POINTER(c_long), - POINTER(c_long), - POINTER(c_long), - POINTER(c_long), - POINTER(c_long), - ), - restype=c_bool, - ), - "predict_sing_f0_forward": _CoreApiType( - argtypes=( - c_int, - POINTER(c_long), - POINTER(c_long), - POINTER(c_long), - POINTER(c_float), - ), - restype=c_bool, - ), - "predict_sing_volume_forward": _CoreApiType( - argtypes=( - c_int, - POINTER(c_long), - POINTER(c_long), - POINTER(c_float), - POINTER(c_long), - POINTER(c_float), - ), - restype=c_bool, - ), - "sf_decode_forward": _CoreApiType( - argtypes=( - c_int, - POINTER(c_long), - POINTER(c_float), - POINTER(c_float), - POINTER(c_long), - POINTER(c_float), - ), - restype=c_bool, - ), - "last_error_message": _CoreApiType( - argtypes=(), - restype=c_char_p, - ), - "load_model": _CoreApiType( - argtypes=(c_long,), - restype=c_bool, - ), - "is_model_loaded": _CoreApiType( - argtypes=(c_long,), - restype=c_bool, - ), - "supported_devices": _CoreApiType( - argtypes=(), - restype=c_char_p, - ), - "finalize": _CoreApiType( - argtypes=(), - restype=None, - ), -} - - -def _check_and_type_apis(core_cdll: CDLL) -> dict[str, bool]: - """ - コアDLLの各関数を(その関数があれば)型付けする。APIの有無の情報を辞書として返す - Parameters - ---------- - core_cdll : CDLL - コアDLL - Returns - ------- - api_exists : dict[str, bool] - key: API名, value: APIの有無 - """ - api_exists = {} - - for api_name, api_type in _CORE_API_TYPES.items(): - if hasattr(core_cdll, api_name): - api = getattr(core_cdll, api_name) - - if len(api_type.argtypes) > 0: - api.argtypes = api_type.argtypes - api.restype = api_type.restype - - api_exists[api_name] = True - else: - api_exists[api_name] = False - - return api_exists - - -class CoreWrapper: - def __init__( - self, - use_gpu: bool, - core_dir: Path, - cpu_num_threads: int = 0, - load_all_models: bool = False, - ) -> None: - self.default_sampling_rate = 24000 - - self.core = load_core(core_dir, use_gpu) - - self.api_exists = _check_and_type_apis(self.core) - - exist_cpu_num_threads = False - - is_version_0_12_core_or_later = ( - _find_version_0_12_core_or_later(core_dir) is not None - ) - model_type: Literal["libtorch", "onnxruntime"] | None - if is_version_0_12_core_or_later: - model_type = "onnxruntime" - else: - model_type = _check_core_type(core_dir) - assert model_type is not None - - if model_type == "onnxruntime": - exist_cpu_num_threads = True - - cwd = os.getcwd() - os.chdir(core_dir) - try: - if is_version_0_12_core_or_later: - self.assert_core_success( - self.core.initialize(use_gpu, cpu_num_threads, load_all_models) - ) - elif exist_cpu_num_threads: - self.assert_core_success( - self.core.initialize(".", use_gpu, cpu_num_threads) - ) - else: - self.assert_core_success(self.core.initialize(".", use_gpu)) - finally: - os.chdir(cwd) - - def metas(self) -> str: - metas_bytes: bytes = self.core.metas() - return metas_bytes.decode("utf-8") - - def yukarin_s_forward( - self, - length: int, - phoneme_list: NDArray[np.int64], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """ - 音素列から、音素ごとの長さを求める関数 - Parameters - ---------- - length : int - 音素列の長さ - phoneme_list : NDArray[np.int64] - 音素列 - style_id : NDArray[np.int64] - スタイル番号 - Returns - ------- - output : NDArray[np.float32] - 音素ごとの長さ - """ - output = np.zeros((length,), dtype=np.float32) - self.assert_core_success( - self.core.yukarin_s_forward( - c_int(length), - phoneme_list.ctypes.data_as(POINTER(c_long)), - style_id.ctypes.data_as(POINTER(c_long)), - output.ctypes.data_as(POINTER(c_float)), - ) - ) - return output - - def yukarin_sa_forward( - self, - length: int, - vowel_phoneme_list: NDArray[np.int64], - consonant_phoneme_list: NDArray[np.int64], - start_accent_list: NDArray[np.int64], - end_accent_list: NDArray[np.int64], - start_accent_phrase_list: NDArray[np.int64], - end_accent_phrase_list: NDArray[np.int64], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """ - モーラごとの音素列とアクセント情報から、モーラごとの音高を求める関数 - Parameters - ---------- - length : int - モーラ列の長さ - vowel_phoneme_list : NDArray[np.int64] - 母音の音素列 - consonant_phoneme_list : NDArray[np.int64] - 子音の音素列 - start_accent_list : NDArray[np.int64] - アクセントの開始位置 - end_accent_list : NDArray[np.int64] - アクセントの終了位置 - start_accent_phrase_list : NDArray[np.int64] - アクセント句の開始位置 - end_accent_phrase_list : NDArray[np.int64] - アクセント句の終了位置 - style_id : NDArray[np.int64] - スタイル番号 - Returns - ------- - output : NDArray[np.float32] - モーラごとの音高 - """ - output = np.empty( - ( - len(style_id), - length, - ), - dtype=np.float32, - ) - self.assert_core_success( - self.core.yukarin_sa_forward( - c_int(length), - vowel_phoneme_list.ctypes.data_as(POINTER(c_long)), - consonant_phoneme_list.ctypes.data_as(POINTER(c_long)), - start_accent_list.ctypes.data_as(POINTER(c_long)), - end_accent_list.ctypes.data_as(POINTER(c_long)), - start_accent_phrase_list.ctypes.data_as(POINTER(c_long)), - end_accent_phrase_list.ctypes.data_as(POINTER(c_long)), - style_id.ctypes.data_as(POINTER(c_long)), - output.ctypes.data_as(POINTER(c_float)), - ) - ) - return output - - def decode_forward( - self, - length: int, - phoneme_size: int, - f0: NDArray[np.float32], - phoneme: NDArray[np.float32], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """ - フレームごとの音素と音高から波形を求める関数 - Parameters - ---------- - length : int - フレームの長さ - phoneme_size : int - 音素の種類数 - f0 : NDArray[np.float32] - フレームごとの音高 - phoneme : NDArray[np.float32] - フレームごとの音素 - style_id : NDArray[np.int64] - スタイル番号 - Returns - ------- - output : NDArray[np.float32] - 音声波形 - """ - - output = np.empty((length * 256,), dtype=np.float32) - self.assert_core_success( - self.core.decode_forward( - c_int(length), - c_int(phoneme_size), - f0.ctypes.data_as(POINTER(c_float)), - phoneme.ctypes.data_as(POINTER(c_float)), - style_id.ctypes.data_as(POINTER(c_long)), - output.ctypes.data_as(POINTER(c_float)), - ) - ) - return output - - def predict_sing_consonant_length_forward( - self, - length: int, - consonant: NDArray[np.int64], - vowel: NDArray[np.int64], - note_duration: NDArray[np.int64], - style_id: NDArray[np.int64], - ) -> NDArray[np.int64]: - """ - 子音・母音列から、音素ごとの長さを求める関数 - Parameters - ---------- - length : int - 音素列の長さ - consonant : NDArray[np.int64] - 子音列 - vowel : NDArray[np.int64] - 母音列 - note_duration : NDArray[np.int64] - ノート列 - style_id : NDArray[np.int64] - スタイル番号 - Returns - ------- - output : NDArray[np.int64] - 子音長 - """ - if self.api_exists["predict_sing_consonant_length_forward"]: - output = np.zeros((length,), dtype=np.int64) - self.assert_core_success( - self.core.predict_sing_consonant_length_forward( - c_int(length), - consonant.ctypes.data_as(POINTER(c_long)), - vowel.ctypes.data_as(POINTER(c_long)), - note_duration.ctypes.data_as(POINTER(c_long)), - style_id.ctypes.data_as(POINTER(c_long)), - output.ctypes.data_as(POINTER(c_long)), - ) - ) - return output - raise OldCoreError - - def predict_sing_f0_forward( - self, - length: int, - phoneme: NDArray[np.int64], - note: NDArray[np.int64], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """ - フレームごとの音素列とノート列から、フレームごとのF0を求める関数 - Parameters - ---------- - length : int - フレームの長さ - phoneme : NDArray[np.int64] - フレームごとの音素 - note : NDArray[np.int64] - フレームごとのノート - style_id : NDArray[np.int64] - スタイル番号 - Returns - ------- - output : NDArray[np.float32] - フレームごとの音高 - """ - if self.api_exists["predict_sing_f0_forward"]: - output = np.zeros((length,), dtype=np.float32) - self.assert_core_success( - self.core.predict_sing_f0_forward( - c_int(length), - phoneme.ctypes.data_as(POINTER(c_long)), - note.ctypes.data_as(POINTER(c_long)), - style_id.ctypes.data_as(POINTER(c_long)), - output.ctypes.data_as(POINTER(c_float)), - ) - ) - return output - raise OldCoreError - - def predict_sing_volume_forward( - self, - length: int, - phoneme: NDArray[np.int64], - note: NDArray[np.int64], - f0: NDArray[np.float32], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """ - フレームごとの音素列とノート列から、フレームごとのvolumeを求める関数 - Parameters - ---------- - length : int - フレームの長さ - phoneme : NDArray[np.int64] - フレームごとの音素 - note : NDArray[np.int64] - フレームごとのノート - f0 : NDArray[np.float32] - フレームごとの音高 - style_id : NDArray[np.int64] - スタイル番号 - Returns - ------- - output : NDArray[np.float32] - フレームごとの音量 - """ - if self.api_exists["predict_sing_volume_forward"]: - output = np.zeros((length,), dtype=np.float32) - self.assert_core_success( - self.core.predict_sing_volume_forward( - c_int(length), - phoneme.ctypes.data_as(POINTER(c_long)), - note.ctypes.data_as(POINTER(c_long)), - f0.ctypes.data_as(POINTER(c_float)), - style_id.ctypes.data_as(POINTER(c_long)), - output.ctypes.data_as(POINTER(c_float)), - ) - ) - return output - raise OldCoreError - - def sf_decode_forward( - self, - length: int, - phoneme: NDArray[np.int64], - f0: NDArray[np.float32], - volume: NDArray[np.float32], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """ - フレームごとの音素と音高から波形を求める関数 - Parameters - ---------- - length : int - フレームの長さ - phoneme : NDArray[np.int64] - フレームごとの音素 - f0 : NDArray[np.float32] - フレームごとの音高 - volume : NDArray[np.float32] - フレームごとの音量 - style_id : NDArray[np.int64] - スタイル番号 - Returns - ------- - output : NDArray[np.float32] - 音声波形 - """ - if self.api_exists["sf_decode_forward"]: - output = np.zeros((length * 256,), dtype=np.float32) - self.assert_core_success( - self.core.sf_decode_forward( - c_int(length), - phoneme.ctypes.data_as(POINTER(c_long)), - f0.ctypes.data_as(POINTER(c_float)), - volume.ctypes.data_as(POINTER(c_float)), - style_id.ctypes.data_as(POINTER(c_long)), - output.ctypes.data_as(POINTER(c_float)), - ) - ) - return output - raise OldCoreError - - def supported_devices(self) -> str: - """ - coreから取得した対応デバイスに関するjsonデータの文字列 - """ - if self.api_exists["supported_devices"]: - supported_devices_byte: bytes = self.core.supported_devices() - return supported_devices_byte.decode("utf-8") - raise OldCoreError - - def finalize(self) -> None: - if self.api_exists["finalize"]: - self.core.finalize() - return - raise OldCoreError - - def load_model(self, style_id: int) -> None: - if self.api_exists["load_model"]: - self.assert_core_success(self.core.load_model(c_long(style_id))) - raise OldCoreError - - def is_model_loaded(self, style_id: int) -> bool: - if self.api_exists["is_model_loaded"]: - loaded_bool: bool = self.core.is_model_loaded(c_long(style_id)) - return loaded_bool - raise OldCoreError - - def assert_core_success(self, result: bool) -> None: - if not result: - raise CoreError( - self.core.last_error_message().decode("utf-8", "backslashreplace") - ) diff --git a/voicevox_engine/voicevox_engine/dev/__init__.py b/voicevox_engine/voicevox_engine/dev/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/voicevox_engine/dev/core/__init__.py b/voicevox_engine/voicevox_engine/dev/core/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/voicevox_engine/dev/core/mock.py b/voicevox_engine/voicevox_engine/dev/core/mock.py deleted file mode 100644 index 70ac50f896b1c943662bc8c69996a62203732090..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/dev/core/mock.py +++ /dev/null @@ -1,246 +0,0 @@ -"""CoreWrapper のモック""" - -import json -from pathlib import Path - -import numpy as np -from numpy.typing import NDArray - -from ...core.core_wrapper import CoreWrapper - - -class MockCoreWrapper(CoreWrapper): - """`CoreWrapper` Mock""" - - def __init__( - self, - use_gpu: bool = False, - core_dir: Path | None = None, - cpu_num_threads: int = 0, - load_all_models: bool = False, - ) -> None: - self.default_sampling_rate = 24000 - - def metas(self) -> str: - return json.dumps( - [ - # トーク2つ・ハミング2つ - { - "name": "dummy1", - "styles": [ - {"name": "style0", "id": 0}, - {"name": "style1", "id": 2}, - {"name": "style2", "id": 4, "type": "frame_decode"}, - {"name": "style3", "id": 6, "type": "frame_decode"}, - ], - "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", - "version": "mock", - }, - # トーク2つ・ハミング1つ・ソング1つ - { - "name": "dummy2", - "styles": [ - {"name": "style0", "id": 1}, - {"name": "style1", "id": 3}, - {"name": "style2", "id": 5, "type": "frame_decode"}, - {"name": "style3", "id": 7, "type": "sing"}, - ], - "speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9", - "version": "mock", - }, - # トーク1つ - { - "name": "dummy3", - "styles": [ - {"name": "style0", "id": 8}, - ], - "speaker_uuid": "35b2c544-660e-401e-b503-0e14c635303a", - "version": "mock", - }, - # ソング1つ - { - "name": "dummy4", - "styles": [ - {"name": "style0", "id": 9, "type": "sing"}, - ], - "speaker_uuid": "b1a81618-b27b-40d2-b0ea-27a9ad408c4b", - "version": "mock", - }, - ] - ) - - def yukarin_s_forward( - self, length: int, phoneme_list: NDArray[np.int64], style_id: NDArray[np.int64] - ) -> NDArray[np.float32]: - """音素系列サイズ・音素ID系列・スタイルIDから音素長系列を生成する""" - # TODO: トークスタイル以外はエラーにする - - result = [] - # mockとしての適当な処理、特に意味はない - for i in range(length): - result.append(round((phoneme_list[i] * 0.0625 + style_id).item(), 2)) - return np.array(result, dtype=np.float32) - - def yukarin_sa_forward( - self, - length: int, - vowel_phoneme_list: NDArray[np.int64], - consonant_phoneme_list: NDArray[np.int64], - start_accent_list: NDArray[np.int64], - end_accent_list: NDArray[np.int64], - start_accent_phrase_list: NDArray[np.int64], - end_accent_phrase_list: NDArray[np.int64], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """モーラ系列サイズ・母音系列・子音系列・アクセント位置・アクセント句区切り・スタイルIDからモーラ音高系列を生成する""" - assert length > 1, "前後無音を必ず付与しなければならない" - - # TODO: トークスタイル以外はエラーにする - - result = [] - # mockとしての適当な処理、特に意味はない - for i in range(length): - result.append( - round( - ( - ( - vowel_phoneme_list[0][i] - + consonant_phoneme_list[0][i] - + start_accent_list[0][i] - + end_accent_list[0][i] - + start_accent_phrase_list[0][i] - + end_accent_phrase_list[0][i] - ) - * 0.0625 - + style_id - ).item(), - 2, - ) - ) - return np.array(result, dtype=np.float32)[np.newaxis] - - def decode_forward( - self, - length: int, - phoneme_size: int, - f0: NDArray[np.float32], - phoneme: NDArray[np.float32], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """フレーム長・音素種類数・フレーム音高・フレーム音素onehot・スタイルIDからダミー音声波形を生成する""" - # TODO: トークスタイル以外はエラーにする - - # 入力値を反映し、長さが 256 倍であるダミー配列を出力する - result: list[NDArray[np.float32]] = [] - for i in range(length): - result += [ - (f0[i, 0] * (np.where(phoneme[i] == 1)[0] / phoneme_size) + style_id) - ] * 256 - return np.array(result, dtype=np.float32) - - def predict_sing_consonant_length_forward( - self, - length: int, - consonant: NDArray[np.int64], - vowel: NDArray[np.int64], - note_duration: NDArray[np.int64], - style_id: NDArray[np.int64], - ) -> NDArray[np.int64]: - """母音系列・子音系列・ノート列・スタイルIDから子音長系列を生成する""" - result = [] - # mockとしての適当な処理、特に意味はない - for i in range(length): - # 子音が無い場合は長さ0 - if consonant[0, i] == -1: - result.append(0) - continue - - result.append( - ( - consonant[0, i] % 3 - + vowel[0, i] % 5 - + note_duration[0, i] % 7 - + style_id % 11 - ).item() - ) - return np.array(result, dtype=np.int64) - - def predict_sing_f0_forward( - self, - length: int, - phoneme: NDArray[np.int64], - note: NDArray[np.int64], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """音素系列・ノート系列・スタイルIDから音高系列を生成する""" - result = [] - # mockとしての適当な処理。大体MIDIノートに従う周波数になるように調整 - for i in range(length): - if note[0, i] == -1: - result.append(0) - continue - result.append( - ( - 2 ** ((note[0, i] - 69) / 12) - * (440 + phoneme[0, i] / 10 + style_id) - ).item() - ) - return np.array(result, dtype=np.float32) - - def predict_sing_volume_forward( - self, - length: int, - phoneme: NDArray[np.int64], - note: NDArray[np.int64], - f0: NDArray[np.float32], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """音素系列・ノート系列・音高系列・スタイルIDから音量系列を生成する""" - result = [] - # mockとしての適当な処理。大体0~10の範囲になるように調整 - for i in range(length): - if note[0, i] == -1: - result.append(0) - continue - result.append( - ( - (phoneme[0, i] / 40) - * (note[0, i] / 88) - * (f0[0, i] / 440) - * ((1 / 2) ** style_id) - * 10 - ).item() - ) - return np.array(result, dtype=np.float32) - - def sf_decode_forward( - self, - length: int, - phoneme: NDArray[np.int64], - f0: NDArray[np.float32], - volume: NDArray[np.float32], - style_id: NDArray[np.int64], - ) -> NDArray[np.float32]: - """入力からダミー音声波形を生成する""" - # 入力値を反映し、長さが 256 倍であるダミー配列を出力する - result: list[NDArray[np.float32]] = [] - for i in range(length): - result += [ - (f0[0, i] / 440) * volume[0, i] * (phoneme[0, i] / 40) + style_id - ] * 256 - return np.array(result, dtype=np.float32) - - def supported_devices(self) -> str: - return json.dumps({"cpu": True, "cuda": False, "dml": False}) - - def finalize(self) -> None: - pass - - def load_model(self, style_id: int) -> None: - pass - - def is_model_loaded(self, style_id: int) -> bool: - return True - - def assert_core_success(self, result: bool) -> None: - pass diff --git a/voicevox_engine/voicevox_engine/dev/tts_engine/__init__.py b/voicevox_engine/voicevox_engine/dev/tts_engine/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/voicevox_engine/dev/tts_engine/mock.py b/voicevox_engine/voicevox_engine/dev/tts_engine/mock.py deleted file mode 100644 index f8a2b90ed21de823fd6ef674f1a1273b58f285a7..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/dev/tts_engine/mock.py +++ /dev/null @@ -1,50 +0,0 @@ -"""TTSEngine のモック""" - -import copy -from typing import Final - -import numpy as np -from numpy.typing import NDArray -from pyopenjtalk import tts - -from ...metas.Metas import StyleId -from ...model import AudioQuery -from ...tts_pipeline.tts_engine import ( - TTSEngine, - raw_wave_to_output_wave, - to_flatten_moras, -) -from ..core.mock import MockCoreWrapper - - -class MockTTSEngine(TTSEngine): - """製品版コア無しに音声合成が可能なモック版TTSEngine""" - - def __init__(self) -> None: - super().__init__(MockCoreWrapper()) - - def synthesize_wave( - self, - query: AudioQuery, - style_id: StyleId, - enable_interrogative_upspeak: bool = True, - ) -> NDArray[np.float32]: - """音声合成用のクエリに含まれる読み仮名に基づいてOpenJTalkで音声波形を生成する。モーラごとの調整は反映されない。""" - # モーフィング時などに同一参照のqueryで複数回呼ばれる可能性があるので、元の引数のqueryに破壊的変更を行わない - query = copy.deepcopy(query) - - # recall text in katakana - flatten_moras = to_flatten_moras(query.accent_phrases) - kana_text = "".join([mora.text for mora in flatten_moras]) - - raw_wave, sr_raw_wave = self.forward(kana_text) - wave = raw_wave_to_output_wave(query, raw_wave, sr_raw_wave) - return wave - - def forward(self, text: str) -> tuple[NDArray[np.float32], int]: - """文字列から pyopenjtalk を用いて音声を合成する。""" - OJT_SAMPLING_RATE: Final = 48000 - OJT_AMPLITUDE_MAX: Final = 2 ** (16 - 1) - raw_wave: NDArray[np.float64] = tts(text)[0] - raw_wave /= OJT_AMPLITUDE_MAX - return raw_wave.astype(np.float32), OJT_SAMPLING_RATE diff --git a/voicevox_engine/voicevox_engine/engine_manifest.py b/voicevox_engine/voicevox_engine/engine_manifest.py deleted file mode 100644 index f3a298a9d336f1f6172661e226415e6c19348686..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/engine_manifest.py +++ /dev/null @@ -1,183 +0,0 @@ -"""エンジンマニフェスト関連の処理""" - -# マルチエンジン環境下においては、エンジンのバージョンがエディタのバージョンより -# 古くなる可能性が十分に考えられる。その場合、エディタ側がEngineManifestの情報不足によって -# エラーを吐いて表示が崩壊する可能性がある。これを防止するため、EngineManifest関連の定義を -# 変更する際は、Optionalにする必要があることに留意しなければならない。 - -import json -from base64 import b64encode -from dataclasses import asdict, dataclass -from pathlib import Path -from typing import TypeAlias - -from pydantic import BaseModel, Field, TypeAdapter -from pydantic.json_schema import SkipJsonSchema - - -@dataclass(frozen=True) -class FeatureSupportJson: - """`engine_manifest.json` の機能サポート状況""" - - type: str - value: bool - name: str - - -@dataclass(frozen=True) -class SupportedFeaturesJson: - """`engine_manifest.json` のサポート機能一覧""" - - adjust_mora_pitch: FeatureSupportJson - adjust_phoneme_length: FeatureSupportJson - adjust_speed_scale: FeatureSupportJson - adjust_pitch_scale: FeatureSupportJson - adjust_intonation_scale: FeatureSupportJson - adjust_volume_scale: FeatureSupportJson - adjust_pause_length: FeatureSupportJson - interrogative_upspeak: FeatureSupportJson - synthesis_morphing: FeatureSupportJson - sing: FeatureSupportJson - manage_library: FeatureSupportJson - return_resource_url: FeatureSupportJson - - -@dataclass(frozen=True) -class EngineManifestJson: - """`engine_manifest.json` のコンテンツ""" - - manifest_version: str - name: str - brand_name: str - uuid: str - version: str - url: str - command: str - port: int - icon: str - default_sampling_rate: int - frame_rate: float - terms_of_service: str - update_infos: str - dependency_licenses: str - supported_features: SupportedFeaturesJson - - -_manifest_json_adapter = TypeAdapter(EngineManifestJson) - - -class UpdateInfo(BaseModel): - """ - エンジンのアップデート情報 - """ - - version: str = Field(description="エンジンのバージョン名") - descriptions: list[str] = Field(description="アップデートの詳細についての説明") - contributors: list[str] | SkipJsonSchema[None] = Field( - default=None, description="貢献者名" - ) - - -class LicenseInfo(BaseModel): - """ - 依存ライブラリのライセンス情報 - """ - - name: str = Field(description="依存ライブラリ名") - version: str | SkipJsonSchema[None] = Field( - default=None, description="依存ライブラリのバージョン" - ) - license: str | SkipJsonSchema[None] = Field( - default=None, description="依存ライブラリのライセンス名" - ) - text: str = Field(description="依存ライブラリのライセンス本文") - - -class SupportedFeatures(BaseModel): - """ - エンジンが持つ機能の一覧 - """ - - adjust_mora_pitch: bool = Field(description="モーラごとの音高の調整") - adjust_phoneme_length: bool = Field(description="音素ごとの長さの調整") - adjust_speed_scale: bool = Field(description="全体の話速の調整") - adjust_pitch_scale: bool = Field(description="全体の音高の調整") - adjust_intonation_scale: bool = Field(description="全体の抑揚の調整") - adjust_volume_scale: bool = Field(description="全体の音量の調整") - adjust_pause_length: bool | SkipJsonSchema[None] = Field( - default=None, description="句読点などの無音時間の調整" - ) - interrogative_upspeak: bool = Field(description="疑問文の自動調整") - synthesis_morphing: bool = Field( - description="2種類のスタイルでモーフィングした音声を合成" - ) - sing: bool | SkipJsonSchema[None] = Field(default=None, description="歌唱音声合成") - manage_library: bool | SkipJsonSchema[None] = Field( - default=None, description="音声ライブラリのインストール・アンインストール" - ) - return_resource_url: bool | SkipJsonSchema[None] = Field( - default=None, description="speaker_info・singer_infoのリソースをURLで返送" - ) - - -EngineName: TypeAlias = str -BrandName: TypeAlias = str - - -class EngineManifest(BaseModel): - """ - エンジン自体に関する情報 - """ - - manifest_version: str = Field(description="マニフェストのバージョン") - name: EngineName = Field(description="エンジン名") - brand_name: BrandName = Field(description="ブランド名") - uuid: str = Field(description="エンジンのUUID") - url: str = Field(description="エンジンのURL") - icon: str = Field(description="エンジンのアイコンをBASE64エンコードしたもの") - default_sampling_rate: int = Field(description="デフォルトのサンプリング周波数") - frame_rate: float = Field(description="エンジンのフレームレート") - terms_of_service: str = Field(description="エンジンの利用規約") - update_infos: list[UpdateInfo] = Field(description="エンジンのアップデート情報") - dependency_licenses: list[LicenseInfo] = Field( - description="依存関係のライセンス情報" - ) - supported_vvlib_manifest_version: str | SkipJsonSchema[None] = Field( - default=None, description="エンジンが対応するvvlibのバージョン" - ) - supported_features: SupportedFeatures = Field(description="エンジンが持つ機能") - - -def load_manifest(manifest_path: Path) -> EngineManifest: - """エンジンマニフェストを指定ファイルから読み込む。""" - - root_dir = manifest_path.parent - manifest = _manifest_json_adapter.validate_json(manifest_path.read_bytes()) - return EngineManifest( - manifest_version=manifest.manifest_version, - name=manifest.name, - brand_name=manifest.brand_name, - uuid=manifest.uuid, - url=manifest.url, - default_sampling_rate=manifest.default_sampling_rate, - frame_rate=manifest.frame_rate, - icon=b64encode((root_dir / manifest.icon).read_bytes()).decode("utf-8"), - terms_of_service=(root_dir / manifest.terms_of_service).read_text("utf-8"), - update_infos=[ - UpdateInfo(**update_info) - for update_info in json.loads( - (root_dir / manifest.update_infos).read_text("utf-8") - ) - ], - supported_vvlib_manifest_version=None, - dependency_licenses=[ - LicenseInfo(**license_info) - for license_info in json.loads( - (root_dir / manifest.dependency_licenses).read_text("utf-8") - ) - ], - supported_features={ - key: item["value"] - for key, item in asdict(manifest.supported_features).items() - }, - ) diff --git a/voicevox_engine/voicevox_engine/library/library_manager.py b/voicevox_engine/voicevox_engine/library/library_manager.py deleted file mode 100644 index 5e7015f96ecbb4b3f10bc2f0185608843744b013..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/library/library_manager.py +++ /dev/null @@ -1,230 +0,0 @@ -"""音声ライブラリの管理""" - -import base64 -import json -import os -import shutil -import zipfile -from pathlib import Path -from typing import BinaryIO - -from pydantic import ValidationError -from semver.version import Version - -from voicevox_engine.library.model import ( - DownloadableLibraryInfo, - InstalledLibraryInfo, - VvlibManifest, -) - -__all__ = ["LibraryManager"] - -INFO_FILE = "metas.json" - - -class LibraryNotFoundError(Exception): - pass - - -class LibraryFormatInvalidError(Exception): - pass - - -class LibraryUnsupportedError(Exception): - pass - - -class LibraryOperationUnauthorizedError(Exception): - pass - - -class LibraryInternalError(Exception): - pass - - -class LibraryManager: - """音声ライブラリ (`.vvlib`) の管理""" - - def __init__( - self, - library_root_dir: Path, - supported_vvlib_version: str | None, - brand_name: str, - engine_name: str, - engine_uuid: str, - ): - self.library_root_dir = library_root_dir - self.library_root_dir.mkdir(exist_ok=True) - if supported_vvlib_version is not None: - self.supported_vvlib_version = Version.parse(supported_vvlib_version) - else: - # supported_vvlib_versionがNoneの時は0.0.0として扱う - self.supported_vvlib_version = Version.parse("0.0.0") - self.engine_brand_name = brand_name - self.engine_name = engine_name - self.engine_uuid = engine_uuid - - def downloadable_libraries(self) -> list[DownloadableLibraryInfo]: - """ダウンロード可能音声ライブラリ情報の一覧を取得する。""" - # == ダウンロード情報をネットワーク上から取得する場合 - # url = "https://example.com/downloadable_libraries.json" - # response = requests.get(url) - # return list(map(DownloadableLibrary.parse_obj, response.json())) - - # == ダウンロード情報をjsonファイルから取得する場合 - # with open( - # self.root_dir / "resources" / "engine_manifest_assets" / "downloadable_libraries.json", # noqa: B950 - # encoding="utf-8", - # ) as f: - # return list(map(DownloadableLibrary.parse_obj, json.load(f))) - - # ダミーとして、speaker_infoのアセットを読み込む - with open( - "./resources/engine_manifest_assets/downloadable_libraries.json", - encoding="utf-8", - ) as f: - libraries = json.load(f) - speaker_info = libraries[0]["speakers"][0]["speaker_info"] - mock_root_dir = Path( - "./resources/character_info/7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff" - ) - speaker_info["policy"] = (mock_root_dir / "policy.md").read_text() - speaker_info["portrait"] = base64.b64encode( - (mock_root_dir / "portrait.png").read_bytes() - ) - for style_info in speaker_info["style_infos"]: - style_id = style_info["id"] - style_info["icon"] = base64.b64encode( - (mock_root_dir / "icons" / f"{style_id}.png").read_bytes() - ) - style_info["voice_samples"] = [ - base64.b64encode( - ( - mock_root_dir / "voice_samples" / f"{style_id}_{i:0>3}.wav" - ).read_bytes() - ) - for i in range(1, 4) - ] - return list(map(DownloadableLibraryInfo.model_validate, libraries)) - - def installed_libraries(self) -> dict[str, InstalledLibraryInfo]: - """インストール済み音声ライブラリ情報の一覧を取得する。""" - library: dict[str, InstalledLibraryInfo] = {} - for library_dir in self.library_root_dir.iterdir(): - if library_dir.is_dir(): - # ライブラリ情報の取得 from `library_root_dir / f"{library_uuid}" / "metas.json"` - library_uuid = os.path.basename(library_dir) - with open(library_dir / INFO_FILE, encoding="utf-8") as f: - info = json.load(f) - # アンインストール出来ないライブラリを作る場合、何かしらの条件でFalseを設定する - library[library_uuid] = InstalledLibraryInfo(**info, uninstallable=True) - return library - - def install_library(self, library_id: str, file: BinaryIO) -> Path: - """ - 音声ライブラリ (`.vvlib`) をインストールする。 - Parameters - ---------- - library_id : str - インストール対象ライブラリID - file : BytesIO - ライブラリファイルBlob - Returns - ------- - library_dir : Path - インストール済みライブラリの情報 - """ - for downloadable_library in self.downloadable_libraries(): - if downloadable_library.uuid == library_id: - library_info = downloadable_library.model_dump_json(indent=4) - break - else: - msg = f"音声ライブラリ {library_id} が見つかりません。" - raise LibraryNotFoundError(msg) - - # ライブラリディレクトリを生成する - library_dir = self.library_root_dir / library_id - library_dir.mkdir(exist_ok=True) - - # metas.jsonを生成する - with open(library_dir / INFO_FILE, "w", encoding="utf-8") as f: - f.write(library_info) - - # ZIP 形式ではないファイルはライブラリでないためインストールを拒否する - if not zipfile.is_zipfile(file): - msg = f"音声ライブラリ {library_id} は不正なファイル形式です。" - raise LibraryFormatInvalidError(msg) - - with zipfile.ZipFile(file) as zf: - if zf.testzip() is not None: - msg = f"音声ライブラリ {library_id} は不正なファイルです。" - raise LibraryFormatInvalidError(msg) - - vvlib_manifest = None - try: - vvlib_manifest = json.loads( - zf.read("vvlib_manifest.json").decode("utf-8") - ) - # マニフェストファイルをもたないライブラリはインストールを拒否する - except KeyError: - msg = ( - f"音声ライブラリ {library_id} にvvlib_manifest.jsonが存在しません。" - ) - raise LibraryFormatInvalidError(msg) - except Exception: - msg = f"音声ライブラリ {library_id} のvvlib_manifest.jsonは不正です。" - raise LibraryFormatInvalidError(msg) - - # 不正な形式のマニフェストファイルをもつライブラリはインストールを拒否する - try: - VvlibManifest.model_validate(vvlib_manifest) - except ValidationError: - msg = f"音声ライブラリ {library_id} のvvlib_manifest.jsonが不正な形式です。" - raise LibraryFormatInvalidError(msg) - - # 不正な `version` 形式のマニフェストファイルもつライブラリはインストールを拒否する - if not Version.is_valid(vvlib_manifest["version"]): - msg = f"音声ライブラリ {library_id} のversion形式が不正です。" - raise LibraryFormatInvalidError(msg) - - # 不正な形式あるいは対応範囲外のマニフェストバージョンをもつライブラリはインストールを拒否する - try: - manifest_version = Version.parse(vvlib_manifest["manifest_version"]) - except ValueError: - msg = f"音声ライブラリ {library_id} のmanifest_version形式が不正です。" - raise LibraryFormatInvalidError(msg) - if manifest_version > self.supported_vvlib_version: - msg = f"音声ライブラリ {library_id} は未対応です。" - raise LibraryUnsupportedError(msg) - - # このエンジン向けでないライブラリはインストールを拒否する - if vvlib_manifest["engine_uuid"] != self.engine_uuid: - msg = f"音声ライブラリ {library_id} は{self.engine_name}向けではありません。" - raise LibraryUnsupportedError(msg) - - # インストールする - # NOTE: 当該ライブラリ用のディレクトリ下へ展開してインストールする - zf.extractall(library_dir) - - return library_dir - - def uninstall_library(self, library_id: str) -> None: - """ID で指定されたインストール済み音声ライブラリをアンインストールする。""" - - # 未インストールライブラリのアンインストールは不可能なので拒否する - if library_id not in self.installed_libraries().keys(): - msg = f"音声ライブラリ {library_id} はインストールされていません。" - raise LibraryNotFoundError(msg) - - # アンインストール不許可ライブラリはアンインストールを拒否する - if not self.installed_libraries()[library_id].uninstallable: - msg = f"音声ライブラリ {library_id} はアンインストールが禁止されています。" - raise LibraryOperationUnauthorizedError(msg) - - # アンインストールする - try: - # NOTE: 当該ライブラリのディレクトリを削除してアンインストールする - shutil.rmtree(self.library_root_dir / library_id) - except Exception: - msg = f"音声ライブラリ {library_id} の削除に失敗しました。" - raise LibraryInternalError(msg) diff --git a/voicevox_engine/voicevox_engine/library/model.py b/voicevox_engine/voicevox_engine/library/model.py deleted file mode 100644 index e931b507c5fb1ec6855b7682cdb4e1140f9673f2..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/library/model.py +++ /dev/null @@ -1,64 +0,0 @@ -""" -ライブラリ機能に関して API と ENGINE 内部実装が共有するモデル(データ構造) - -モデルの注意点は `voicevox_engine/model.py` の module docstring を確認すること。 -""" - -from pydantic import BaseModel, Field, StrictStr - -from voicevox_engine.metas.Metas import Speaker, SpeakerInfo - - -class LibrarySpeaker(BaseModel): - """ - 音声ライブラリに含まれるキャラクターの情報 - """ - - speaker: Speaker = Field(description="キャラクター情報") - speaker_info: SpeakerInfo = Field(description="キャラクターの追加情報") - - -class BaseLibraryInfo(BaseModel): - """ - 音声ライブラリの情報 - """ - - name: str = Field(description="音声ライブラリの名前") - uuid: str = Field(description="音声ライブラリのUUID") - version: str = Field(description="音声ライブラリのバージョン") - download_url: str = Field(description="音声ライブラリのダウンロードURL") - bytes: int = Field(description="音声ライブラリのバイト数") - speakers: list[LibrarySpeaker] = Field( - description="音声ライブラリに含まれるキャラクターのリスト" - ) - - -# 今後InstalledLibraryInfo同様に拡張する可能性を考え、モデルを分けている -class DownloadableLibraryInfo(BaseLibraryInfo): - """ - ダウンロード可能な音声ライブラリの情報 - """ - - pass - - -class InstalledLibraryInfo(BaseLibraryInfo): - """ - インストール済み音声ライブラリの情報 - """ - - uninstallable: bool = Field(description="アンインストール可能かどうか") - - -class VvlibManifest(BaseModel): - """ - vvlib(VOICEVOX Library)に関する情報 - """ - - manifest_version: StrictStr = Field(description="マニフェストバージョン") - name: StrictStr = Field(description="音声ライブラリ名") - version: StrictStr = Field(description="音声ライブラリバージョン") - uuid: StrictStr = Field(description="音声ライブラリのUUID") - brand_name: StrictStr = Field(description="エンジンのブランド名") - engine_name: StrictStr = Field(description="エンジン名") - engine_uuid: StrictStr = Field(description="エンジンのUUID") diff --git a/voicevox_engine/voicevox_engine/metas/Metas.py b/voicevox_engine/voicevox_engine/metas/Metas.py deleted file mode 100644 index 47a84d05af36d8db441e81dd785641e7e0572301..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/metas/Metas.py +++ /dev/null @@ -1,78 +0,0 @@ -"""キャラクター情報とキャラクターメタ情報""" - -from typing import Literal, NewType - -from pydantic import BaseModel, Field -from pydantic.json_schema import SkipJsonSchema - -# NOTE: 循環importを防ぐためにとりあえずここに書いている -# FIXME: 他のmodelに依存せず、全modelから参照できる場所に配置する -StyleId = NewType("StyleId", int) -StyleType = Literal["talk", "singing_teacher", "frame_decode", "sing"] - - -class SpeakerStyle(BaseModel): - """キャラクターのスタイル情報""" - - name: str = Field(description="スタイル名") - id: StyleId = Field(description="スタイルID") - type: StyleType = Field( - default="talk", - description=( - "スタイルの種類。" - "talk:音声合成クエリの作成と音声合成が可能。" - "singing_teacher:歌唱音声合成用のクエリの作成が可能。" - "frame_decode:歌唱音声合成が可能。" - "sing:歌唱音声合成用のクエリの作成と歌唱音声合成が可能。" - ), - ) - - -class SpeakerSupportedFeatures(BaseModel): - """キャラクターの対応機能の情報""" - - permitted_synthesis_morphing: Literal["ALL", "SELF_ONLY", "NOTHING"] = Field( - description=( - "モーフィング機能への対応。" - "'ALL' は「全て許可」、'SELF_ONLY' は「同じキャラクター内でのみ許可」、'NOTHING' は「全て禁止」" - ), - default="ALL", - ) - - -class Speaker(BaseModel): - """キャラクター情報""" - - name: str = Field(description="名前") - speaker_uuid: str = Field(description="キャラクターのUUID") - styles: list[SpeakerStyle] = Field(description="スタイルの一覧") - version: str = Field(description="キャラクターのバージョン") - supported_features: SpeakerSupportedFeatures = Field( - description="キャラクターの対応機能", default_factory=SpeakerSupportedFeatures - ) - - -class StyleInfo(BaseModel): - """スタイルの追加情報""" - - id: StyleId = Field(description="スタイルID") - icon: str = Field( - description="このスタイルのアイコンをbase64エンコードしたもの、あるいはURL" - ) - portrait: str | SkipJsonSchema[None] = Field( - default=None, - description="このスタイルの立ち絵画像をbase64エンコードしたもの、あるいはURL", - ) - voice_samples: list[str] = Field( - description="サンプル音声をbase64エンコードしたもの、あるいはURL" - ) - - -class SpeakerInfo(BaseModel): - """キャラクターの追加情報""" - - policy: str = Field(description="policy.md") - portrait: str = Field( - description="立ち絵画像をbase64エンコードしたもの、あるいはURL" - ) - style_infos: list[StyleInfo] = Field(description="スタイルの追加情報") diff --git a/voicevox_engine/voicevox_engine/metas/MetasStore.py b/voicevox_engine/voicevox_engine/metas/MetasStore.py deleted file mode 100644 index b8bd3567825e86b900633d3fbabd1474e1d3454f..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/metas/MetasStore.py +++ /dev/null @@ -1,251 +0,0 @@ -"""キャラクター情報とキャラクターメタ情報の管理""" - -from dataclasses import dataclass -from pathlib import Path -from typing import Callable, Final, Literal, TypeAlias - -from fastapi import HTTPException -from pydantic import BaseModel, Field - -from voicevox_engine.core.core_adapter import CoreCharacter, CoreCharacterStyle -from voicevox_engine.metas.Metas import ( - SpeakerInfo, - SpeakerStyle, - SpeakerSupportedFeatures, - StyleId, -) -from voicevox_engine.resource_manager import ResourceManager, ResourceManagerError - -ResourceFormat: TypeAlias = Literal["base64", "url"] - - -def cast_styles(cores: list[CoreCharacterStyle]) -> list[SpeakerStyle]: - """コアから取得したスタイル情報をエンジン形式へキャストする。""" - return [ - SpeakerStyle(name=core.name, id=StyleId(core.id), type=core.type) - for core in cores - ] - - -@dataclass -class Character: - """キャラクター""" - - name: str - uuid: str - talk_styles: list[SpeakerStyle] - sing_styles: list[SpeakerStyle] - version: str - supported_features: SpeakerSupportedFeatures - - -_TALK_STYLE_TYPES: Final = ["talk"] -_SING_STYLE_TYPES: Final = ["singing_teacher", "frame_decode", "sing"] - - -class _EngineCharacter(BaseModel): - """ - エンジンに含まれるキャラクター情報 - """ - - supported_features: SpeakerSupportedFeatures = Field( - default_factory=SpeakerSupportedFeatures - ) - - -GetCoreCharacters: TypeAlias = Callable[[str | None], list[CoreCharacter]] - - -class MetasStore: - """キャラクターやスタイルのメタ情報を管理する""" - - def __init__( - self, - engine_characters_path: Path, - get_core_characters: GetCoreCharacters, - resource_manager: ResourceManager, - ) -> None: - """ - インスタンスを生成する。 - - Parameters - ---------- - engine_characters_path : Path - エンジンに含まれるキャラクターメタ情報ディレクトリのパス。 - get_core_characters: - コアに含まれるキャラクター情報を返す関数 - """ - self._characters_path = engine_characters_path - self._get_core_characters = get_core_characters - self._resource_manager = resource_manager - # エンジンに含まれる各キャラクターのメタ情報 - self._loaded_metas: dict[str, _EngineCharacter] = { - folder.name: _EngineCharacter.model_validate_json( - (folder / "metas.json").read_text(encoding="utf-8") - ) - for folder in engine_characters_path.iterdir() - if folder.is_dir() - } - - def characters(self, core_version: str | None) -> list[Character]: - """キャラクターの情報の一覧を取得する。""" - - # エンジンとコアのキャラクター情報を統合する - characters: list[Character] = [] - for core_character in self._get_core_characters(core_version): - character_uuid = core_character.speaker_uuid - engine_character = self._loaded_metas[character_uuid] - styles = cast_styles(core_character.styles) - talk_styles = list( - filter(lambda style: style.type in _TALK_STYLE_TYPES, styles) - ) - sing_styles = list( - filter(lambda style: style.type in _SING_STYLE_TYPES, styles) - ) - characters.append( - Character( - name=core_character.name, - uuid=character_uuid, - talk_styles=talk_styles, - sing_styles=sing_styles, - version=core_character.version, - supported_features=engine_character.supported_features, - ) - ) - return characters - - def character_info( - self, - character_uuid: str, - talk_or_sing: Literal["talk", "sing"], - core_version: str | None, - resource_baseurl: str, - resource_format: ResourceFormat, - ) -> SpeakerInfo: - # キャラクター情報は以下のディレクトリ構造に従わなければならない。 - # {engine_characters_path}/ - # {character_uuid_0}/ - # policy.md - # portrait.png - # icons/ - # {id_0}.png - # {id_1}.png - # ... - # portraits/ - # {id_0}.png - # {id_1}.png - # ... - # voice_samples/ - # {id_0}_001.wav - # {id_0}_002.wav - # {id_0}_003.wav - # {id_1}_001.wav - # ... - # {character_uuid_1}/ - # ... - - # 該当キャラクターを検索する - characters = self.characters(core_version) - characters = filter_characters_and_styles(characters, talk_or_sing) - character = next( - filter(lambda character: character.uuid == character_uuid, characters), None - ) - if character is None: - # FIXME: HTTPExceptionはこのファイルとドメインが合わないので辞める - msg = "該当するキャラクターが見つかりません" - raise HTTPException(status_code=404, detail=msg) - - # キャラクター情報を取得する - try: - character_path = self._characters_path / character_uuid - - # character policy - policy_path = character_path / "policy.md" - policy = policy_path.read_text("utf-8") - - def _resource_str(path: Path) -> str: - resource_str = self._resource_manager.resource_str( - path, "hash" if resource_format == "url" else "base64" - ) - if resource_format == "base64": - return resource_str - return f"{resource_baseurl}/{resource_str}" - - # character portrait - portrait_path = character_path / "portrait.png" - portrait = _resource_str(portrait_path) - - # スタイル情報を取得する - style_infos = [] - for style in character.talk_styles + character.sing_styles: - id = style.id - - # style icon - style_icon_path = character_path / "icons" / f"{id}.png" - icon = _resource_str(style_icon_path) - - # style portrait - style_portrait_path = character_path / "portraits" / f"{id}.png" - style_portrait = None - if style_portrait_path.exists(): - style_portrait = _resource_str(style_portrait_path) - - # voice samples - voice_samples: list[str] = [] - for j in range(3): - num = str(j + 1).zfill(3) - voice_path = character_path / "voice_samples" / f"{id}_{num}.wav" - voice_samples.append(_resource_str(voice_path)) - - style_infos.append( - { - "id": id, - "icon": icon, - "portrait": style_portrait, - "voice_samples": voice_samples, - } - ) - except (FileNotFoundError, ResourceManagerError): - # FIXME: HTTPExceptionはこのファイルとドメインが合わないので辞める - msg = "追加情報が見つかりませんでした" - raise HTTPException(status_code=500, detail=msg) - - character_info = SpeakerInfo( - policy=policy, portrait=portrait, style_infos=style_infos - ) - return character_info - - def talk_characters(self, core_version: str | None) -> list[Character]: - """話せるキャラクターの情報の一覧を取得する。""" - return filter_characters_and_styles(self.characters(core_version), "talk") - - def sing_characters(self, core_version: str | None) -> list[Character]: - """歌えるキャラクターの情報の一覧を取得する。""" - return filter_characters_and_styles(self.characters(core_version), "sing") - - -def filter_characters_and_styles( - characters: list[Character], - talk_or_sing: Literal["talk", "sing"], -) -> list[Character]: - """キャラクター内のスタイルをtalk系・sing系のみにする。スタイル数が0になったキャラクターは除外する。""" - if talk_or_sing == "talk": - # talk 系スタイルを持たないキャラクターを除外する - talk_characters = list( - filter(lambda character: len(character.talk_styles) > 0, characters) - ) - # sing 系スタイルを除外する - for talk_character in talk_characters: - talk_character.sing_styles = [] - return talk_characters - elif talk_or_sing == "sing": - # sing 系スタイルを持たないキャラクターを除外する - sing_characters = list( - filter(lambda character: len(character.sing_styles) > 0, characters) - ) - # talk 系スタイルを除外する - for sing_character in sing_characters: - sing_character.talk_styles = [] - return sing_characters - else: - raise Exception(f"'{talk_or_sing}' は不正な style_type です") diff --git a/voicevox_engine/voicevox_engine/metas/__init__.py b/voicevox_engine/voicevox_engine/metas/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/voicevox_engine/model.py b/voicevox_engine/voicevox_engine/model.py deleted file mode 100644 index ffbd45a86ab8f3984ae8e5171774c21d6be23061..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/model.py +++ /dev/null @@ -1,47 +0,0 @@ -""" -API と ENGINE 内部実装が共有するモデル - -このモジュールで定義されるモデル(データ構造)は API と ENGINE の 2 箇所から使われる。そのため -- モデルの変更は API 変更となるため慎重に検討する。 -- モデルの docstring や Field は API スキーマとして使われるため、ユーザー向けに丁寧に書く。 -- モデルクラスは FastAPI の制約から `BaseModel` を継承しなければならない。 -""" - -from pydantic import BaseModel, Field -from pydantic.json_schema import SkipJsonSchema - -from voicevox_engine.tts_pipeline.model import AccentPhrase - - -class AudioQuery(BaseModel): - """ - 音声合成用のクエリ - """ - - accent_phrases: list[AccentPhrase] = Field(description="アクセント句のリスト") - speedScale: float = Field(description="全体の話速") - pitchScale: float = Field(description="全体の音高") - intonationScale: float = Field(description="全体の抑揚") - volumeScale: float = Field(description="全体の音量") - prePhonemeLength: float = Field(description="音声の前の無音時間") - postPhonemeLength: float = Field(description="音声の後の無音時間") - pauseLength: float | None = Field( - default=None, - description="句読点などの無音時間。nullのときは無視される。デフォルト値はnull", - ) - pauseLengthScale: float = Field( - default=1, description="句読点などの無音時間(倍率)。デフォルト値は1" - ) - outputSamplingRate: int = Field(description="音声データの出力サンプリングレート") - outputStereo: bool = Field(description="音声データをステレオ出力するか否か") - kana: str | SkipJsonSchema[None] = Field( - default=None, - description="[読み取り専用]AquesTalk 風記法によるテキスト。音声合成用のクエリとしては無視される", - ) - - def __hash__(self) -> int: - items = [ - (k, tuple(v)) if isinstance(v, list) else (k, v) - for k, v in self.__dict__.items() - ] - return hash(tuple(sorted(items))) diff --git a/voicevox_engine/voicevox_engine/morphing/model.py b/voicevox_engine/voicevox_engine/morphing/model.py deleted file mode 100644 index e4c20e7bf9301ce3154979f289f1a71db9ddde8f..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/morphing/model.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -モーフィング機能に関して API と ENGINE 内部実装が共有するモデル(データ構造) - -モデルの注意点は `voicevox_engine/model.py` の module docstring を確認すること。 -""" - -from pydantic import BaseModel, Field - - -class MorphableTargetInfo(BaseModel): - is_morphable: bool = Field( - description="指定したキャラクターに対してモーフィングの可否" - ) - # FIXME: add reason property - # reason: str | None = Field(description="is_morphableがfalseである場合、その理由") diff --git a/voicevox_engine/voicevox_engine/morphing/morphing.py b/voicevox_engine/voicevox_engine/morphing/morphing.py deleted file mode 100644 index f643cb23e94e867fdbda0a332b35102493a0b1b9..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/morphing/morphing.py +++ /dev/null @@ -1,191 +0,0 @@ -""" -WORLDを使ってモーフィングするためのモジュール。 -pyworldの入出力はnp.doubleやnp.float64なので注意。 -""" - -from copy import deepcopy -from dataclasses import dataclass -from itertools import chain - -import numpy as np -import pyworld as pw -from numpy.typing import NDArray -from soxr import resample - -from voicevox_engine.metas.MetasStore import Character -from voicevox_engine.morphing.model import MorphableTargetInfo - -from ..metas.Metas import StyleId -from ..model import AudioQuery -from ..tts_pipeline.tts_engine import TTSEngine - - -class StyleIdNotFoundError(LookupError): - def __init__(self, style_id: int, *args: object, **kywrds: object) -> None: - self.style_id = style_id - super().__init__(f"style_id {style_id} is not found.", *args, **kywrds) - - -@dataclass(frozen=True) -class _MorphingParameter: - fs: int - frame_period: float - base_f0: NDArray[np.float64] - base_aperiodicity: NDArray[np.float64] - base_spectrogram: NDArray[np.float64] - target_spectrogram: NDArray[np.float64] - - -def get_morphable_targets( - characters: list[Character], - base_style_ids: list[StyleId], -) -> list[dict[StyleId, MorphableTargetInfo]]: - """ - キャラクターごとにモーフィングできるスタイルの一覧を生成する。 - 指定されたベースキャラクターそれぞれに対し、引数のキャラクターリスト全体をチェックする。 - """ - morphable_targets_arr = [] - for base_style_id in base_style_ids: - morphable_targets: dict[StyleId, MorphableTargetInfo] = {} - for style in chain.from_iterable( - character.talk_styles + character.sing_styles for character in characters - ): - morphable_targets[style.id] = MorphableTargetInfo( - is_morphable=is_morphable(characters, base_style_id, style.id) - ) - morphable_targets_arr.append(morphable_targets) - - return morphable_targets_arr - - -def is_morphable( - characters: list[Character], style_id_1: StyleId, style_id_2: StyleId -) -> bool: - """指定された2つのスタイル ID がモーフィング可能か判定する。""" - - # スタイル ID にキャラクターを紐付ける対応表を生成する。 - style_id_to_character: dict[StyleId, Character] = {} - for character in characters: - for style in character.talk_styles + character.sing_styles: - style_id_to_character[style.id] = character - - try: - character_1 = style_id_to_character[style_id_1] - except KeyError: - raise StyleIdNotFoundError(style_id_1) - try: - character_2 = style_id_to_character[style_id_2] - except KeyError: - raise StyleIdNotFoundError(style_id_2) - - uuid_1 = character_1.uuid - uuid_2 = character_2.uuid - morphable_1 = character_1.supported_features.permitted_synthesis_morphing - morphable_2 = character_2.supported_features.permitted_synthesis_morphing - - # 禁止されている場合はFalse - if morphable_1 == "NOTHING": - return False - elif morphable_2 == "NOTHING": - return False - # 同一キャラクターのみの場合は同一キャラクター判定 - elif morphable_1 == "SELF_ONLY": - return uuid_1 == uuid_2 - elif morphable_2 == "SELF_ONLY": - return uuid_1 == uuid_2 - - # 念のため許可されているかチェック - return morphable_1 == "ALL" and morphable_2 == "ALL" - - -def synthesis_morphing_parameter( - engine: TTSEngine, - query: AudioQuery, - base_style_id: StyleId, - target_style_id: StyleId, -) -> _MorphingParameter: - query = deepcopy(query) - - # 不具合回避のためデフォルトのサンプリングレートでWORLDに掛けた後に指定のサンプリングレートに変換する - query.outputSamplingRate = engine.default_sampling_rate - - # WORLDに掛けるため合成はモノラルで行う - query.outputStereo = False - - base_wave = engine.synthesize_wave(query, base_style_id).astype(np.double) - target_wave = engine.synthesize_wave(query, target_style_id).astype(np.double) - - fs = query.outputSamplingRate - frame_period = 1.0 - base_f0, base_time_axis = pw.harvest(base_wave, fs, frame_period=frame_period) - base_spectrogram = pw.cheaptrick(base_wave, base_f0, base_time_axis, fs) - base_aperiodicity = pw.d4c(base_wave, base_f0, base_time_axis, fs) - - target_f0, morph_time_axis = pw.harvest(target_wave, fs, frame_period=frame_period) - target_spectrogram = pw.cheaptrick(target_wave, target_f0, morph_time_axis, fs) - target_spectrogram.resize(base_spectrogram.shape) - - return _MorphingParameter( - fs=fs, - frame_period=frame_period, - base_f0=base_f0, - base_aperiodicity=base_aperiodicity, - base_spectrogram=base_spectrogram, - target_spectrogram=target_spectrogram, - ) - - -def synthesize_morphed_wave( - morph_param: _MorphingParameter, - morph_rate: float, - output_fs: int, - output_stereo: bool = False, -) -> NDArray[np.float32]: - """ - 指定した割合で、パラメータをもとにモーフィングした音声を生成します。 - - Parameters - ---------- - morph_param : MorphingParameter - `synthesis_morphing_parameter`で作成したパラメータ - - morph_rate : float - モーフィングの割合 - 0.0でベースの音声、1.0でターゲットの音声に近づきます。 - - Returns - ------- - generated : NDArray[np.float32] - モーフィングした音声 - - Raises - ------- - ValueError - morph_rate ∈ [0, 1] - """ - - if morph_rate < 0.0 or morph_rate > 1.0: - raise ValueError("morph_rateは0.0から1.0の範囲で指定してください") - - morph_spectrogram = ( - morph_param.base_spectrogram * (1.0 - morph_rate) - + morph_param.target_spectrogram * morph_rate - ) - - _y_h: NDArray[np.float64] = pw.synthesize( - morph_param.base_f0, - morph_spectrogram, - morph_param.base_aperiodicity, - morph_param.fs, - morph_param.frame_period, - ) - y_h = _y_h.astype(np.float32) - - # TODO: tts_engine.py でのリサンプル処理と共通化する - if output_fs != morph_param.fs: - y_h = resample(y_h, morph_param.fs, output_fs) - - if output_stereo: - y_h = np.array([y_h, y_h]).T - - return y_h diff --git a/voicevox_engine/voicevox_engine/preset/__init__.py b/voicevox_engine/voicevox_engine/preset/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/voicevox_engine/preset/model.py b/voicevox_engine/voicevox_engine/preset/model.py deleted file mode 100644 index 0239359c56c4ca63af2f6371e509f979af3501dc..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/preset/model.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -プリセット機能に関して API と ENGINE 内部実装が共有するモデル(データ構造) - -モデルの注意点は `voicevox_engine/model.py` の module docstring を確認すること。 -""" - -from pydantic import BaseModel, Field -from pydantic.json_schema import SkipJsonSchema - -from voicevox_engine.metas.Metas import StyleId - - -class Preset(BaseModel): - """ - プリセット情報 - """ - - id: int = Field(description="プリセットID") - name: str = Field(description="プリセット名") - speaker_uuid: str = Field(description="キャラクターのUUID") - style_id: StyleId = Field(description="スタイルID") - speedScale: float = Field(description="全体の話速") - pitchScale: float = Field(description="全体の音高") - intonationScale: float = Field(description="全体の抑揚") - volumeScale: float = Field(description="全体の音量") - prePhonemeLength: float = Field(description="音声の前の無音時間") - postPhonemeLength: float = Field(description="音声の後の無音時間") - pauseLength: float | SkipJsonSchema[None] = Field( - default=None, description="句読点などの無音時間" - ) - pauseLengthScale: float = Field( - default=1, description="句読点などの無音時間(倍率)" - ) diff --git a/voicevox_engine/voicevox_engine/preset/preset_manager.py b/voicevox_engine/voicevox_engine/preset/preset_manager.py deleted file mode 100644 index 32453441fb146dfb99a3a3f9e04be4836be2457c..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/preset/preset_manager.py +++ /dev/null @@ -1,164 +0,0 @@ -"""プリセット関連の処理""" - -from pathlib import Path - -import yaml -from pydantic import TypeAdapter, ValidationError - -from .model import Preset - - -class PresetInputError(Exception): - """受け入れ不可能な入力値に起因するエラー""" - - pass - - -class PresetInternalError(Exception): - """プリセットマネージャーに起因するエラー""" - - pass - - -class PresetManager: - """ - プリセットの管理 - - プリセットはAudioQuery全体パラメータ(話速・音高・抑揚・音量・無音長)のデフォルト値セットである。 - YAMLファイルをSSoTとする簡易データベース方式により、プリセットの管理をおこなう。 - """ - - def __init__(self, preset_path: Path): - """プリセットの設定ファイルへのパスからプリセットマネージャーを生成する""" - self.presets: list[Preset] = [] # 全プリセットのキャッシュ - self.last_modified_time = 0.0 - self.preset_path = preset_path - - def _refresh_cache(self) -> None: - """プリセットの設定ファイルの最新状態をキャッシュへ反映する""" - - # データベース更新の確認(タイムスタンプベース) - try: - _last_modified_time = self.preset_path.stat().st_mtime - if _last_modified_time == self.last_modified_time: - # 更新無し - return - except OSError: - raise PresetInternalError("プリセットの設定ファイルが見つかりません") - - # データベースの読み込み - with open(self.preset_path, mode="r", encoding="utf-8") as f: - obj = yaml.safe_load(f) - if obj is None: - raise PresetInternalError("プリセットの設定ファイルが空の内容です") - try: - preset_list_adapter = TypeAdapter(list[Preset]) - _presets = preset_list_adapter.validate_python(obj) - except ValidationError: - raise PresetInternalError("プリセットの設定ファイルにミスがあります") - - # 全idの一意性をバリデーション - if len([preset.id for preset in _presets]) != len( - {preset.id for preset in _presets} - ): - raise PresetInternalError("プリセットのidに重複があります") - - # キャッシュを更新する - self.presets = _presets - self.last_modified_time = _last_modified_time - - def add_preset(self, preset: Preset) -> int: - """新規プリセットを追加し、その ID を取得する。""" - - # データベース更新の反映 - self._refresh_cache() - - # 新規プリセットID の発行。IDが0未満、または存在するIDなら新規IDを発行 - if preset.id < 0 or preset.id in {preset.id for preset in self.presets}: - preset.id = max([preset.id for preset in self.presets]) + 1 - # 新規プリセットの追加 - self.presets.append(preset) - - # 変更の反映。失敗時はリバート。 - try: - self._write_on_file() - except Exception as err: - self.presets.pop() - if isinstance(err, FileNotFoundError): - raise PresetInternalError("プリセットの設定ファイルが見つかりません") - else: - raise err - - return preset.id - - def load_presets(self) -> list[Preset]: - """全てのプリセットを取得する""" - - # データベース更新の反映 - self._refresh_cache() - - return self.presets - - def update_preset(self, preset: Preset) -> int: - """指定されたプリセットを更新し、その ID を取得する。""" - - # データベース更新の反映 - self._refresh_cache() - - # 対象プリセットの検索 - prev_preset: tuple[int, Preset | None] = (-1, None) - for i in range(len(self.presets)): - if self.presets[i].id == preset.id: - prev_preset = (i, self.presets[i]) - self.presets[i] = preset - break - else: - raise PresetInputError("更新先のプリセットが存在しません") - - # 変更の反映。失敗時はリバート。 - try: - self._write_on_file() - except Exception as err: - self.presets[prev_preset[0]] = prev_preset[1] - if isinstance(err, FileNotFoundError): - raise PresetInternalError("プリセットの設定ファイルが見つかりません") - else: - raise err - - return preset.id - - def delete_preset(self, id: int) -> int: - """ID で指定されたプリセットを削除し、その ID を取得する。""" - - # データベース更新の反映 - self._refresh_cache() - - # 対象プリセットの検索 - buf = None - buf_index = -1 - for i in range(len(self.presets)): - if self.presets[i].id == id: - buf = self.presets.pop(i) - buf_index = i - break - else: - raise PresetInputError("削除対象のプリセットが存在しません") - - # 変更の反映。失敗時はリバート。 - try: - self._write_on_file() - except FileNotFoundError: - self.presets.insert(buf_index, buf) - raise PresetInternalError("プリセットの設定ファイルが見つかりません") - - return id - - def _write_on_file(self) -> None: - """プリセット情報のファイル(簡易データベース)書き込み""" - with open(self.preset_path, mode="w", encoding="utf-8") as f: - yaml.safe_dump( - [preset.model_dump() for preset in self.presets], - f, - allow_unicode=True, - sort_keys=False, - ) diff --git a/voicevox_engine/voicevox_engine/resource_manager.py b/voicevox_engine/voicevox_engine/resource_manager.py deleted file mode 100644 index b94e5443b1575388ffb8486538733a3a7f6b5894..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/resource_manager.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -リソースファイルを管理する。 -""" - -import base64 -import json -from hashlib import sha256 -from pathlib import Path -from typing import Literal - - -class ResourceManagerError(Exception): - def __init__(self, message: str): - self.message = message - - -def b64encode_str(s: bytes) -> str: - return base64.b64encode(s).decode("utf-8") - - -class ResourceManager: - """ - リソースファイルのパスと、一意なハッシュ値の対応(filemap)を管理する。 - - APIでリソースファイルを一意なURLとして返すときに使う。 - ついでにファイルをbase64文字列に変換することもできる。 - """ - - def __init__(self, create_filemap_if_not_exist: bool) -> None: - """ - Parameters - ---------- - create_filemap_if_not_exist : bool - `filemap.json`がない場合でも登録時にfilemapを生成するか(開発時を想定) - """ - self._create_filemap_if_not_exist = create_filemap_if_not_exist - self._path_to_hash: dict[Path, str] = {} - self._hash_to_path: dict[str, Path] = {} - - def register_dir(self, resource_dir: Path) -> None: - """ディレクトリをfilemapに登録する""" - filemap_json = resource_dir / "filemap.json" - if filemap_json.exists(): - data: dict[str, str] = json.loads(filemap_json.read_bytes()) - self._path_to_hash |= {resource_dir / k: v for k, v in data.items()} - elif self._create_filemap_if_not_exist: - self._path_to_hash |= { - i: sha256(i.read_bytes()).digest().hex() - for i in resource_dir.rglob("*") - if i.is_file() - } - else: - raise ResourceManagerError(f"{filemap_json}が見つかりません") - - self._hash_to_path |= {v: k for k, v in self._path_to_hash.items()} - - def resource_str( - self, - resource_path: Path, - resource_format: Literal["base64", "hash"], - ) -> str: - """指定したリソースファイルのbase64文字列やハッシュ値を返す。""" - # NOTE: 意図しないパスのファイルの結果を返さないようにする - filehash = self._path_to_hash.get(resource_path) - if filehash is None: - raise ResourceManagerError(f"{resource_path}がfilemapに登録されていません") - - if resource_format == "base64": - return b64encode_str(resource_path.read_bytes()) - return filehash - - def resource_path(self, filehash: str) -> Path: - """指定したハッシュ値を持つリソースファイルのパスを返す。""" - resource_path = self._hash_to_path.get(filehash) - - if resource_path is None: - raise ResourceManagerError(f"'{filehash}'に対応するリソースがありません") - return resource_path diff --git a/voicevox_engine/voicevox_engine/setting/__init__.py b/voicevox_engine/voicevox_engine/setting/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/voicevox_engine/setting/model.py b/voicevox_engine/voicevox_engine/setting/model.py deleted file mode 100644 index b35656c50c345f538bc992f0fcf5b61237ec4433..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/setting/model.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -エンジン設定機能に関して API と ENGINE 内部実装が共有するモデル(データ構造) - -モデルの注意点は `voicevox_engine/model.py` の module docstring を確認すること。 -""" - -from enum import Enum - - -class CorsPolicyMode(str, Enum): - """ - CORSの許可モード - """ - - all = "all" # 全てのオリジンからのリクエストを許可 - localapps = "localapps" # ローカルアプリケーションからのリクエストを許可 diff --git a/voicevox_engine/voicevox_engine/setting/setting_manager.py b/voicevox_engine/voicevox_engine/setting/setting_manager.py deleted file mode 100644 index 1b0df2ecd172796892007969fbcf3c47ffaabde9..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/setting/setting_manager.py +++ /dev/null @@ -1,60 +0,0 @@ -"""エンジン設定関連の処理""" - -from dataclasses import dataclass -from enum import Enum -from pathlib import Path -from typing import Any - -import yaml -from pydantic import TypeAdapter - -from ..utility.path_utility import get_save_dir -from .model import CorsPolicyMode - - -@dataclass(frozen=True) -class Setting: - """エンジンの設定情報""" - - cors_policy_mode: CorsPolicyMode # リソース共有ポリシー - allow_origin: str | None = None # 許可するオリジン - - -_setting_adapter = TypeAdapter(Setting) - - -USER_SETTING_PATH: Path = get_save_dir() / "setting.yml" - - -class SettingHandler: - def __init__(self, setting_file_path: Path) -> None: - """ - 設定ファイルの管理 - Parameters - ---------- - setting_file_path : Path - 設定ファイルのパス。存在しない場合はデフォルト値を設定。 - """ - self.setting_file_path = setting_file_path - - def load(self) -> Setting: - """設定値をファイルから読み込む。""" - if not self.setting_file_path.is_file(): - # 設定ファイルが存在しないためデフォルト値を取得 - setting = {"allow_origin": None, "cors_policy_mode": "localapps"} - else: - # 指定された設定ファイルから値を取得 - # FIXME: 例外処理を追加する - setting = yaml.safe_load(self.setting_file_path.read_text(encoding="utf-8")) - - return _setting_adapter.validate_python(setting) - - def save(self, settings: Setting) -> None: - """設定値をファイルへ書き込む。""" - settings_dict: dict[str, Any] = _setting_adapter.dump_python(settings) - - if isinstance(settings_dict["cors_policy_mode"], Enum): - settings_dict["cors_policy_mode"] = settings_dict["cors_policy_mode"].value - - with open(self.setting_file_path, mode="w", encoding="utf-8") as f: - yaml.safe_dump(settings_dict, f) diff --git a/voicevox_engine/voicevox_engine/tts_pipeline/__init__.py b/voicevox_engine/voicevox_engine/tts_pipeline/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/voicevox_engine/voicevox_engine/tts_pipeline/connect_base64_waves.py b/voicevox_engine/voicevox_engine/tts_pipeline/connect_base64_waves.py deleted file mode 100644 index d6753db8c83f4f1fa6ed28a9de17163a5ee39d58..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/tts_pipeline/connect_base64_waves.py +++ /dev/null @@ -1,62 +0,0 @@ -"""音声データの結合""" - -import base64 -import io - -import numpy as np -import soundfile -from numpy.typing import NDArray -from soxr import resample - - -class ConnectBase64WavesException(Exception): - def __init__(self, message: str): - self.message = message - - -def decode_base64_waves(waves: list[str]) -> list[tuple[NDArray[np.float64], int]]: - """ - base64エンコードされた複数のwavデータをデコードする - Parameters - ---------- - waves: list[str] - base64エンコードされたwavデータのリスト - Returns - ------- - waves_nparray_sr: list[tuple[NDArray[np.float64], int]] - (NumPy配列の音声波形データ, サンプリングレート) 形式のタプルのリスト - """ - if len(waves) == 0: - raise ConnectBase64WavesException("wavファイルが含まれていません") - - waves_nparray_sr = [] - for wave in waves: - try: - wav_bin = base64.standard_b64decode(wave) - except ValueError: - raise ConnectBase64WavesException("base64デコードに失敗しました") - try: - _data = soundfile.read(io.BytesIO(wav_bin)) - except Exception: - raise ConnectBase64WavesException("wavファイルを読み込めませんでした") - waves_nparray_sr.append(_data) - - return waves_nparray_sr - - -def connect_base64_waves(waves: list[str]) -> tuple[NDArray[np.float64], int]: - waves_nparray_sr = decode_base64_waves(waves) - - max_sampling_rate = max([sr for _, sr in waves_nparray_sr]) - max_channels = max([x.ndim for x, _ in waves_nparray_sr]) - assert 0 < max_channels <= 2 - - waves_nparray_list = [] - for nparray, sr in waves_nparray_sr: - if sr != max_sampling_rate: - nparray = resample(nparray, sr, max_sampling_rate) - if nparray.ndim < max_channels: - nparray = np.array([nparray, nparray]).T - waves_nparray_list.append(nparray) - - return np.concatenate(waves_nparray_list), max_sampling_rate diff --git a/voicevox_engine/voicevox_engine/tts_pipeline/kana_converter.py b/voicevox_engine/voicevox_engine/tts_pipeline/kana_converter.py deleted file mode 100644 index df55afcd0e98e14599936f3a3cc6e52cb5af4fe9..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/tts_pipeline/kana_converter.py +++ /dev/null @@ -1,224 +0,0 @@ -""" -「AquesTalk 風記法」を実装した AquesTalk 風記法テキスト <-> アクセント句系列 変換。 - -記法の規則は以下の通り。 - -- 読みはカタカナのみ -- `/` で区切り -- `、` で無音付き区切り -- `_` で無声化 -- `'` でアクセント位置 -- `?` で疑問文 -- アクセント位置はちょうど1つ - -NOTE: ユーザー向け案内 `https://github.com/VOICEVOX/voicevox_engine/blob/master/README.md#aquestalk-風記法` # noqa -""" - -from typing import Any - -from .model import AccentPhrase, Mora, ParseKanaErrorCode -from .mora_mapping import mora_kana_to_mora_phonemes -from .phoneme import Vowel - -_LOOP_LIMIT = 300 - -# AquesTalk 風記法特殊文字 -_UNVOICE_SYMBOL = "_" # 無声化 -_ACCENT_SYMBOL = "'" # アクセント位置 -_NOPAUSE_DELIMITER = "/" # ポーズ無しアクセント句境界 -_PAUSE_DELIMITER = "、" # ポーズ有りアクセント句境界 -_WIDE_INTERROGATION_MARK = "?" # 疑問形 - -# AquesTalk 風記法とモーラの対応。無声母音も含む。(音素長・音高 0 初期化) -_kana2mora: dict[str, Mora] = {} -for kana, (consonant, vowel) in mora_kana_to_mora_phonemes.items(): - _kana2mora[kana] = Mora( - text=kana, - consonant=consonant, - consonant_length=0 if consonant else None, - vowel=vowel, - vowel_length=0, - pitch=0, - ) - if vowel in ["a", "i", "u", "e", "o"]: - # 「`_` で無声化」の実装。例: "_ホ" -> "hO" - # NOTE: 現行の型システムは Conditional Literal + upper に非対応. - # FIXME: バリデーションする - upper_vowel: Vowel = vowel.upper() # type: ignore - _kana2mora[_UNVOICE_SYMBOL + kana] = Mora( - text=kana, - consonant=consonant, - consonant_length=0 if consonant else None, - vowel=upper_vowel, - vowel_length=0, - pitch=0, - ) - - -class ParseKanaError(Exception): - def __init__(self, errcode: ParseKanaErrorCode, **kwargs: Any) -> None: - self.errcode = errcode - self.errname = errcode.name - self.kwargs = kwargs - err_fmt: str = errcode.value - self.text = err_fmt.format(**kwargs) - - -def _text_to_accent_phrase(phrase: str) -> AccentPhrase: - """ - 単一アクセント句に相当するAquesTalk 風記法テキストからアクセント句オブジェクトを生成 - longest matchによりモーラ化。入力長Nに対し計算量O(N^2)。 - Parameters - ---------- - phrase : str - 単一アクセント句に相当するAquesTalk 風記法テキスト - Returns - ------- - accent_phrase : AccentPhrase - アクセント句 - """ - # NOTE: ポーズと疑問形はこの関数内で処理しない - - accent_index: int | None = None - moras: list[Mora] = [] - - base_index = 0 # パース開始位置。ここから右の文字列をstackに詰めていく。 - stack = "" # 保留中の文字列 - matched_text: str | None = None # 保留中の文字列内で最後にマッチした仮名 - - outer_loop = 0 - while base_index < len(phrase): - outer_loop += 1 - - # 「`'` でアクセント位置」の実装 - if phrase[base_index] == _ACCENT_SYMBOL: - # 「アクセント位置はちょうど1つ」の実装 - if len(moras) == 0: - raise ParseKanaError(ParseKanaErrorCode.ACCENT_TOP, text=phrase) - if accent_index is not None: - raise ParseKanaError(ParseKanaErrorCode.ACCENT_TWICE, text=phrase) - - accent_index = len(moras) - base_index += 1 - continue - - # モーラ探索 - # より長い要素からなるモーラが見つかれば上書き(longest match) - # 例: phrase "キャ" -> "キ" 検出 -> "キャ" 検出/上書き -> Mora("キャ") - for watch_index in range(base_index, len(phrase)): - # アクセント位置特殊文字が来たら探索打ち切り - if phrase[watch_index] == _ACCENT_SYMBOL: - break - stack += phrase[watch_index] - if stack in _kana2mora: - matched_text = stack - if matched_text is None: - raise ParseKanaError(ParseKanaErrorCode.UNKNOWN_TEXT, text=stack) - # push mora - else: - moras.append(_kana2mora[matched_text].model_copy(deep=True)) - base_index += len(matched_text) - stack = "" - matched_text = None - if outer_loop > _LOOP_LIMIT: - raise ParseKanaError(ParseKanaErrorCode.INFINITE_LOOP) - if accent_index is None: - raise ParseKanaError(ParseKanaErrorCode.ACCENT_NOTFOUND, text=phrase) - else: - return AccentPhrase(moras=moras, accent=accent_index, pause_mora=None) - - -def parse_kana(text: str) -> list[AccentPhrase]: - """ - AquesTalk 風記法テキストからアクセント句系列を生成 - Parameters - ---------- - text : str - AquesTalk 風記法テキスト - Returns - ------- - parsed_results : list[AccentPhrase] - アクセント句(音素・モーラ音高 0初期化)系列を生成 - """ - - parsed_results: list[AccentPhrase] = [] - phrase_base = 0 - if len(text) == 0: - raise ParseKanaError(ParseKanaErrorCode.EMPTY_PHRASE, position=1) - - for i in range(len(text) + 1): - # アクセント句境界(`/`か`、`)の出現までインデックス進展 - if i == len(text) or text[i] in [_PAUSE_DELIMITER, _NOPAUSE_DELIMITER]: - phrase = text[phrase_base:i] - if len(phrase) == 0: - raise ParseKanaError( - ParseKanaErrorCode.EMPTY_PHRASE, - position=str(len(parsed_results) + 1), - ) - phrase_base = i + 1 - - # 「`?` で疑問文」の実装 - is_interrogative = _WIDE_INTERROGATION_MARK in phrase - if is_interrogative: - if _WIDE_INTERROGATION_MARK in phrase[:-1]: - raise ParseKanaError( - ParseKanaErrorCode.INTERROGATION_MARK_NOT_AT_END, text=phrase - ) - # 疑問形はモーラでなくアクセント句属性で表現 - phrase = phrase.replace(_WIDE_INTERROGATION_MARK, "") - - accent_phrase: AccentPhrase = _text_to_accent_phrase(phrase) - - # 「`、` で無音付き区切り」の実装 - if i < len(text) and text[i] == _PAUSE_DELIMITER: - accent_phrase.pause_mora = Mora( - text="、", - consonant=None, - consonant_length=None, - vowel="pau", - vowel_length=0, - pitch=0, - ) - accent_phrase.is_interrogative = is_interrogative - - parsed_results.append(accent_phrase) - - return parsed_results - - -def create_kana(accent_phrases: list[AccentPhrase]) -> str: - """ - アクセント句系列からAquesTalk 風記法テキストを生成 - Parameters - ---------- - accent_phrases : list[AccentPhrase] - アクセント句系列 - Returns - ------- - text : str - AquesTalk 風記法テキスト - """ - text = "" - # アクセント句を先頭から逐次パースし、`text`末尾にAquesTalk 風記法の文字を都度追加(ループ) - for i, phrase in enumerate(accent_phrases): - for j, mora in enumerate(phrase.moras): - # 「`_` で無声化」の実装 - if mora.vowel in ["A", "I", "U", "E", "O"]: - text += _UNVOICE_SYMBOL - text += mora.text - # 「`'` でアクセント位置」の実装 - if j + 1 == phrase.accent: - text += _ACCENT_SYMBOL - - # 「`?` で疑問文」の実装 - if phrase.is_interrogative: - text += _WIDE_INTERROGATION_MARK - - if i < len(accent_phrases) - 1: - # 「`/` で区切り」の実装 - if phrase.pause_mora is None: - text += _NOPAUSE_DELIMITER - # 「`、` で無音付き区切り」の実装 - else: - text += _PAUSE_DELIMITER - return text diff --git a/voicevox_engine/voicevox_engine/tts_pipeline/model.py b/voicevox_engine/voicevox_engine/tts_pipeline/model.py deleted file mode 100644 index dde8b76312ee7b188505b0cbb09d6a47ba48ad5e..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/tts_pipeline/model.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -音声合成機能に関して API と ENGINE 内部実装が共有するモデル(データ構造) - -モデルの注意点は `voicevox_engine/model.py` の module docstring を確認すること。 -""" - -from enum import Enum - -from pydantic import BaseModel, ConfigDict, Field -from pydantic.json_schema import SkipJsonSchema - - -class Mora(BaseModel): - """ - モーラ(子音+母音)ごとの情報 - """ - - model_config = ConfigDict(validate_assignment=True) - - text: str = Field(description="文字") - consonant: str | SkipJsonSchema[None] = Field( - default=None, description="子音の音素" - ) - consonant_length: float | SkipJsonSchema[None] = Field( - default=None, description="子音の音長" - ) - vowel: str = Field(description="母音の音素") - vowel_length: float = Field(description="母音の音長") - pitch: float = Field( - description="音高" - ) # デフォルト値をつけるとts側のOpenAPIで生成されたコードの型がOptionalになる - - def __hash__(self) -> int: - items = [ - (k, tuple(v)) if isinstance(v, list) else (k, v) - for k, v in self.__dict__.items() - ] - return hash(tuple(sorted(items))) - - -class AccentPhrase(BaseModel): - """ - アクセント句ごとの情報 - """ - - moras: list[Mora] = Field(description="モーラのリスト") - accent: int = Field(description="アクセント箇所") - pause_mora: Mora | SkipJsonSchema[None] = Field( - default=None, description="後ろに無音を付けるかどうか" - ) - is_interrogative: bool = Field(default=False, description="疑問系かどうか") - - def __hash__(self) -> int: - items = [ - (k, tuple(v)) if isinstance(v, list) else (k, v) - for k, v in self.__dict__.items() - ] - return hash(tuple(sorted(items))) - - -class Note(BaseModel): - """ - 音符ごとの情報 - """ - - key: int | SkipJsonSchema[None] = Field(default=None, description="音階") - frame_length: int = Field(description="音符のフレーム長") - lyric: str = Field(description="音符の歌詞") - - -class Score(BaseModel): - """ - 楽譜情報 - """ - - notes: list[Note] = Field(description="音符のリスト") - - -class FramePhoneme(BaseModel): - """ - 音素の情報 - """ - - phoneme: str = Field(description="音素") - frame_length: int = Field(description="音素のフレーム長") - - -class FrameAudioQuery(BaseModel): - """ - フレームごとの音声合成用のクエリ - """ - - f0: list[float] = Field(description="フレームごとの基本周波数") - volume: list[float] = Field(description="フレームごとの音量") - phonemes: list[FramePhoneme] = Field(description="音素のリスト") - volumeScale: float = Field(description="全体の音量") - outputSamplingRate: int = Field(description="音声データの出力サンプリングレート") - outputStereo: bool = Field(description="音声データをステレオ出力するか否か") - - -class ParseKanaErrorCode(Enum): - UNKNOWN_TEXT = "判別できない読み仮名があります: {text}" - ACCENT_TOP = "句頭にアクセントは置けません: {text}" - ACCENT_TWICE = "1つのアクセント句に二つ以上のアクセントは置けません: {text}" - ACCENT_NOTFOUND = "アクセントを指定していないアクセント句があります: {text}" - EMPTY_PHRASE = "{position}番目のアクセント句が空白です" - INTERROGATION_MARK_NOT_AT_END = "アクセント句末以外に「?」は置けません: {text}" - INFINITE_LOOP = "処理時に無限ループになってしまいました...バグ報告をお願いします。" diff --git a/voicevox_engine/voicevox_engine/tts_pipeline/mora_mapping.py b/voicevox_engine/voicevox_engine/tts_pipeline/mora_mapping.py deleted file mode 100644 index bd7df524b9716c101ff906d5d581d8f15786c3c3..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/tts_pipeline/mora_mapping.py +++ /dev/null @@ -1,392 +0,0 @@ -""" -以下のモーラ対応表はOpenJTalkのソースコードから取得し、 -カタカナ表記とモーラが一対一対応するように改造した。 -ライセンス表記: ------------------------------------------------------------------ - The Japanese TTS System "Open JTalk" - developed by HTS Working Group - http://open-jtalk.sourceforge.net/ ------------------------------------------------------------------ - - Copyright (c) 2008-2014 Nagoya Institute of Technology - Department of Computer Science - -All rights reserved. - -Redistribution and use in source and binary forms, with or -without modification, are permitted provided that the following -conditions are met: - -- Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. -- Neither the name of the HTS working group nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -""" - -from typing import Literal - -from .phoneme import BaseVowel, Consonant - -# AquesTalk 風記法で記述されるモーラ(無声化 `_` を除く) -_MoraKana = Literal[ - "ァ", - "ア", - "ィ", - "イ", - "イェ", - "ゥ", - "ウ", - "ウィ", - "ウェ", - "ウォ", - "ェ", - "エ", - "ォ", - "オ", - "カ", - "ガ", - "キ", - "キェ", - "キャ", - "キュ", - "キョ", - "ギ", - "ギェ", - "ギャ", - "ギュ", - "ギョ", - "ク", - "クヮ", - "グ", - "グヮ", - "ケ", - "ゲ", - "コ", - "ゴ", - "サ", - "ザ", - "シ", - "シェ", - "シャ", - "シュ", - "ショ", - "ジ", - "ジェ", - "ジャ", - "ジュ", - "ジョ", - "ス", - "スィ", - "ズ", - "ズィ", - "セ", - "ゼ", - "ソ", - "ゾ", - "タ", - "ダ", - "チ", - "チェ", - "チャ", - "チュ", - "チョ", - "ヂ", - "ッ", - "ツ", - "ツァ", - "ツィ", - "ツェ", - "ツォ", - "ヅ", - "テ", - "ティ", - "テャ", - "テュ", - "テョ", - "デ", - "ディ", - "デェ", - "デャ", - "デュ", - "デョ", - "ト", - "トゥ", - "ド", - "ドゥ", - "ナ", - "ニ", - "ニェ", - "ニャ", - "ニュ", - "ニョ", - "ヌ", - "ネ", - "ノ", - "ハ", - "バ", - "パ", - "ヒ", - "ヒェ", - "ヒャ", - "ヒュ", - "ヒョ", - "ビ", - "ビェ", - "ビャ", - "ビュ", - "ビョ", - "ピ", - "ピェ", - "ピャ", - "ピュ", - "ピョ", - "フ", - "ファ", - "フィ", - "フェ", - "フォ", - "ブ", - "プ", - "ヘ", - "ベ", - "ペ", - "ホ", - "ボ", - "ポ", - "マ", - "ミ", - "ミェ", - "ミャ", - "ミュ", - "ミョ", - "ム", - "メ", - "モ", - "ャ", - "ヤ", - "ュ", - "ユ", - "ョ", - "ヨ", - "ラ", - "リ", - "リェ", - "リャ", - "リュ", - "リョ", - "ル", - "レ", - "ロ", - "ヮ", - "ワ", - "ヰ", - "ヱ", - "ヲ", - "ン", - "ヴ", - "ヴァ", - "ヴィ", - "ヴェ", - "ヴォ", - "ヴャ", - "ヴュ", - "ヴョ", - "ヶ", -] - -_mora_list_minimum: list[tuple[_MoraKana, Consonant | None, BaseVowel]] = [ - ("ヴォ", "v", "o"), - ("ヴェ", "v", "e"), - ("ヴィ", "v", "i"), - ("ヴァ", "v", "a"), - ("ヴ", "v", "u"), - ("ン", None, "N"), - ("ワ", "w", "a"), - ("ロ", "r", "o"), - ("レ", "r", "e"), - ("ル", "r", "u"), - ("リョ", "ry", "o"), - ("リュ", "ry", "u"), - ("リャ", "ry", "a"), - ("リェ", "ry", "e"), - ("リ", "r", "i"), - ("ラ", "r", "a"), - ("ヨ", "y", "o"), - ("ユ", "y", "u"), - ("ヤ", "y", "a"), - ("モ", "m", "o"), - ("メ", "m", "e"), - ("ム", "m", "u"), - ("ミョ", "my", "o"), - ("ミュ", "my", "u"), - ("ミャ", "my", "a"), - ("ミェ", "my", "e"), - ("ミ", "m", "i"), - ("マ", "m", "a"), - ("ポ", "p", "o"), - ("ボ", "b", "o"), - ("ホ", "h", "o"), - ("ペ", "p", "e"), - ("ベ", "b", "e"), - ("ヘ", "h", "e"), - ("プ", "p", "u"), - ("ブ", "b", "u"), - ("フォ", "f", "o"), - ("フェ", "f", "e"), - ("フィ", "f", "i"), - ("ファ", "f", "a"), - ("フ", "f", "u"), - ("ピョ", "py", "o"), - ("ピュ", "py", "u"), - ("ピャ", "py", "a"), - ("ピェ", "py", "e"), - ("ピ", "p", "i"), - ("ビョ", "by", "o"), - ("ビュ", "by", "u"), - ("ビャ", "by", "a"), - ("ビェ", "by", "e"), - ("ビ", "b", "i"), - ("ヒョ", "hy", "o"), - ("ヒュ", "hy", "u"), - ("ヒャ", "hy", "a"), - ("ヒェ", "hy", "e"), - ("ヒ", "h", "i"), - ("パ", "p", "a"), - ("バ", "b", "a"), - ("ハ", "h", "a"), - ("ノ", "n", "o"), - ("ネ", "n", "e"), - ("ヌ", "n", "u"), - ("ニョ", "ny", "o"), - ("ニュ", "ny", "u"), - ("ニャ", "ny", "a"), - ("ニェ", "ny", "e"), - ("ニ", "n", "i"), - ("ナ", "n", "a"), - ("ドゥ", "d", "u"), - ("ド", "d", "o"), - ("トゥ", "t", "u"), - ("ト", "t", "o"), - ("デョ", "dy", "o"), - ("デュ", "dy", "u"), - ("デャ", "dy", "a"), - ("デェ", "dy", "e"), - ("ディ", "d", "i"), - ("デ", "d", "e"), - ("テョ", "ty", "o"), - ("テュ", "ty", "u"), - ("テャ", "ty", "a"), - ("ティ", "t", "i"), - ("テ", "t", "e"), - ("ツォ", "ts", "o"), - ("ツェ", "ts", "e"), - ("ツィ", "ts", "i"), - ("ツァ", "ts", "a"), - ("ツ", "ts", "u"), - ("ッ", None, "cl"), - ("チョ", "ch", "o"), - ("チュ", "ch", "u"), - ("チャ", "ch", "a"), - ("チェ", "ch", "e"), - ("チ", "ch", "i"), - ("ダ", "d", "a"), - ("タ", "t", "a"), - ("ゾ", "z", "o"), - ("ソ", "s", "o"), - ("ゼ", "z", "e"), - ("セ", "s", "e"), - ("ズィ", "z", "i"), - ("ズ", "z", "u"), - ("スィ", "s", "i"), - ("ス", "s", "u"), - ("ジョ", "j", "o"), - ("ジュ", "j", "u"), - ("ジャ", "j", "a"), - ("ジェ", "j", "e"), - ("ジ", "j", "i"), - ("ショ", "sh", "o"), - ("シュ", "sh", "u"), - ("シャ", "sh", "a"), - ("シェ", "sh", "e"), - ("シ", "sh", "i"), - ("ザ", "z", "a"), - ("サ", "s", "a"), - ("ゴ", "g", "o"), - ("コ", "k", "o"), - ("ゲ", "g", "e"), - ("ケ", "k", "e"), - ("グヮ", "gw", "a"), - ("グ", "g", "u"), - ("クヮ", "kw", "a"), - ("ク", "k", "u"), - ("ギョ", "gy", "o"), - ("ギュ", "gy", "u"), - ("ギャ", "gy", "a"), - ("ギェ", "gy", "e"), - ("ギ", "g", "i"), - ("キョ", "ky", "o"), - ("キュ", "ky", "u"), - ("キャ", "ky", "a"), - ("キェ", "ky", "e"), - ("キ", "k", "i"), - ("ガ", "g", "a"), - ("カ", "k", "a"), - ("オ", None, "o"), - ("エ", None, "e"), - ("ウォ", "w", "o"), - ("ウェ", "w", "e"), - ("ウィ", "w", "i"), - ("ウ", None, "u"), - ("イェ", "y", "e"), - ("イ", None, "i"), - ("ア", None, "a"), -] -_mora_list_additional: list[tuple[_MoraKana, Consonant | None, BaseVowel]] = [ - ("ヴョ", "by", "o"), - ("ヴュ", "by", "u"), - ("ヴャ", "by", "a"), - ("ヲ", None, "o"), - ("ヱ", None, "e"), - ("ヰ", None, "i"), - ("ヮ", "w", "a"), - ("ョ", "y", "o"), - ("ュ", "y", "u"), - ("ヅ", "z", "u"), - ("ヂ", "j", "i"), - ("ヶ", "k", "e"), - ("ャ", "y", "a"), - ("ォ", None, "o"), - ("ェ", None, "e"), - ("ゥ", None, "u"), - ("ィ", None, "i"), - ("ァ", None, "a"), -] - -# 「hi」→「ヒ」 -mora_phonemes_to_mora_kana: dict[str, _MoraKana] = { - (consonant or "") + vowel: kana for [kana, consonant, vowel] in _mora_list_minimum -} -# 「ヒ」→「hi」 -mora_kana_to_mora_phonemes: dict[_MoraKana, tuple[Consonant | None, BaseVowel]] = { - kana: (consonant, vowel) # noqa B035 キー(kana)が一意であれば無視できる - for [kana, consonant, vowel] in _mora_list_minimum + _mora_list_additional -} diff --git a/voicevox_engine/voicevox_engine/tts_pipeline/phoneme.py b/voicevox_engine/voicevox_engine/tts_pipeline/phoneme.py deleted file mode 100644 index 87cae6a8daebca0cbb1413624e70e16b7198a55c..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/tts_pipeline/phoneme.py +++ /dev/null @@ -1,96 +0,0 @@ -"""音素""" - -from typing import Literal - -import numpy as np -from numpy.typing import NDArray - -# NOTE: `Vowel` は母音 (a/i/u/e/o の有声・無声) + 無音 pau + 撥音 N ("ん") + 促音 cl ("っ") -# NOTE: 型の名称は暫定的 -BaseVowel = Literal["pau", "N", "a", "cl", "e", "i", "o", "u"] -Vowel = BaseVowel | Literal["A", "E", "I", "O", "U"] - -Consonant = Literal[ - "b", - "by", - "ch", - "d", - "dy", - "f", - "g", - "gw", - "gy", - "h", - "hy", - "j", - "k", - "kw", - "ky", - "m", - "my", - "n", - "ny", - "p", - "py", - "r", - "ry", - "s", - "sh", - "t", - "ts", - "ty", - "v", - "w", - "y", - "z", -] - -# 音素のリスト -_PHONEME_LIST: tuple[Vowel | Consonant, ...] = () -_PHONEME_LIST += ("pau", "A", "E", "I", "N", "O", "U", "a", "b", "by") -_PHONEME_LIST += ("ch", "cl", "d", "dy", "e", "f", "g", "gw", "gy", "h") -_PHONEME_LIST += ("hy", "i", "j", "k", "kw", "ky", "m", "my", "n", "ny") -_PHONEME_LIST += ("o", "p", "py", "r", "ry", "s", "sh", "t", "ts", "ty") -_PHONEME_LIST += ("u", "v", "w", "y", "z") - -# 音素リストの要素数 -_NUM_PHONEME = len(_PHONEME_LIST) - -_UNVOICED_MORA_TAIL_PHONEMES = ["A", "I", "U", "E", "O", "cl", "pau"] -_MORA_TAIL_PHONEMES = ["a", "i", "u", "e", "o", "N"] + _UNVOICED_MORA_TAIL_PHONEMES - - -class Phoneme: - """音素""" - - _PHONEME_LIST = _PHONEME_LIST - _NUM_PHONEME = _NUM_PHONEME - - def __init__(self, phoneme: str): - # 無音をポーズに変換 - if "sil" in phoneme: - phoneme = "pau" - - self._phoneme = phoneme - # TODO: `phoneme` で受け入れ可能な文字列を型で保証 - # self.phoneme: Vowel | Consonant = phoneme - - @property - def id(self) -> int: - """音素ID (音素リスト内でのindex) を取得する""" - return self._PHONEME_LIST.index(self._phoneme) - - @property - def onehot(self) -> NDArray[np.float32]: - """音素onehotベクトルを取得する""" - vec = np.zeros(self._NUM_PHONEME, dtype=np.float32) - vec[self.id] = 1.0 - return vec - - def is_mora_tail(self) -> bool: - """この音素はモーラ末尾音素(母音・撥音・促音・無音)である""" - return self._phoneme in _MORA_TAIL_PHONEMES - - def is_unvoiced_mora_tail(self) -> bool: - """この音素は無声のモーラ末尾音素(無声母音・促音・無音)である""" - return self._phoneme in _UNVOICED_MORA_TAIL_PHONEMES diff --git a/voicevox_engine/voicevox_engine/tts_pipeline/text_analyzer.py b/voicevox_engine/voicevox_engine/tts_pipeline/text_analyzer.py deleted file mode 100644 index 904c2de0b0dd24ff83877e420631b2b3aed8bcd9..0000000000000000000000000000000000000000 --- a/voicevox_engine/voicevox_engine/tts_pipeline/text_analyzer.py +++ /dev/null @@ -1,376 +0,0 @@ -"""テキスト解析""" - -import re -from dataclasses import dataclass -from itertools import chain -from typing import Callable, Literal, Self - -import pyopenjtalk - -from .model import AccentPhrase, Mora -from .mora_mapping import mora_phonemes_to_mora_kana - -OjtVowel = Literal[ - "A", "E", "I", "N", "O", "U", "a", "cl", "e", "i", "o", "pau", "sil", "u" -] -OjtConsonant = Literal[ - "b", - "by", - "ch", - "d", - "dy", - "f", - "g", - "gw", - "gy", - "h", - "hy", - "j", - "k", - "kw", - "ky", - "m", - "my", - "n", - "ny", - "p", - "py", - "r", - "ry", - "s", - "sh", - "t", - "ts", - "ty", - "v", - "w", - "y", - "z", -] -OjtUnknown = Literal["xx"] -OjtPhoneme = OjtVowel | OjtConsonant | OjtUnknown - - -@dataclass -class Label: - """OpenJTalkラベル""" - - contexts: dict[str, str] # ラベルの属性 - - @classmethod - def from_feature(cls, feature: str) -> Self: - """OpenJTalk feature から Label インスタンスを生成する""" - # フルコンテキストラベルの仕様は、http://hts.sp.nitech.ac.jp/?Download の HTS-2.3のJapanese tar.bz2 (126 MB)をダウンロードして、data/lab_format.pdfを見るとリストが見つかります。 # noqa - # VOICEVOX ENGINE で利用されている属性: p3 phoneme / a2 moraIdx / f1 n_mora / f2 pos_accent / f3 疑問形 / f5 アクセント句Idx / i3 BreathGroupIdx # noqa: B950 - result = re.search( - r"^(?P.+?)\^(?P.+?)\-(?P.+?)\+(?P.+?)\=(?P.+?)" - r"/A\:(?P.+?)\+(?P.+?)\+(?P.+?)" - r"/B\:(?P.+?)\-(?P.+?)\_(?P.+?)" - r"/C\:(?P.+?)\_(?P.+?)\+(?P.+?)" - r"/D\:(?P.+?)\+(?P.+?)\_(?P.+?)" - r"/E\:(?P.+?)\_(?P.+?)\!(?P.+?)\_(?P.+?)\-(?P.+?)" - r"/F\:(?P.+?)\_(?P.+?)\#(?P.+?)\_(?P.+?)\@(?P.+?)\_(?P.+?)\|(?P.+?)\_(?P.+?)" # noqa - r"/G\:(?P.+?)\_(?P.+?)\%(?P.+?)\_(?P.+?)\_(?P.+?)" - r"/H\:(?P

.+?)\_(?P

.+?)" - r"/I\:(?P.+?)\-(?P.+?)\@(?P.+?)\+(?P.+?)\&(?P.+?)\-(?P.+?)\|(?P.+?)\+(?P.+?)" # noqa - r"/J\:(?P.+?)\_(?P.+?)" - r"/K\:(?P.+?)\+(?P.+?)\-(?P.+?)$", - feature, - ) - if result is None: - raise ValueError(feature) - - contexts = result.groupdict() - return cls(contexts=contexts) - - @property - def phoneme(self) -> OjtPhoneme: - """このラベルに含まれる音素。子音 or 母音 (無音含む)。""" - # FIXME: バリデーションする - return self.contexts["p3"] # type: ignore - - @property - def mora_index(self) -> int: - """アクセント句内におけるモーラのインデックス (1 ~ 49)""" - return int(self.contexts["a2"]) - - def is_pause(self) -> bool: - """このラベルが無音 (silent/pause) であれば True、そうでなければ False を返す""" - return self.contexts["f1"] == "xx" - - @property - def accent_position(self) -> int: - """アクセント句内でのアクセント位置 (1 ~ 49)""" - return int(self.contexts["f2"]) - - def is_interrogative(self) -> bool: - """疑問形か否か""" - return self.contexts["f3"] == "1" - - @property - def accent_phrase_index(self) -> str: - """BreathGroup内におけるアクセント句のインデックス""" - return self.contexts["f5"] - - @property - def breath_group_index(self) -> str: - """BreathGroupのインデックス""" - return self.contexts["i3"] - - def __repr__(self) -> str: - return f"