diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 43db87dbb..4c2a22de8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -84,6 +84,10 @@ jobs: - uses: actions/checkout@v4 - name: Set up Rust uses: ./.github/actions/rust-toolchain-from-file + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: "3.10" - uses: Swatinem/rust-cache@v2 with: key: "cargo-unit-test-cache" diff --git a/crates/voicevox_core_python_api/Cargo.toml b/crates/voicevox_core_python_api/Cargo.toml index 567ef685e..e5cbcdda6 100644 --- a/crates/voicevox_core_python_api/Cargo.toml +++ b/crates/voicevox_core_python_api/Cargo.toml @@ -14,7 +14,7 @@ easy-ext.workspace = true futures-lite.workspace = true log.workspace = true once_cell.workspace = true -pyo3 = { workspace = true, features = ["abi3-py38", "extension-module"] } +pyo3 = { workspace = true, features = ["abi3-py310", "extension-module"] } pyo3-asyncio = { workspace = true, features = ["tokio-runtime"] } pyo3-log.workspace = true serde = { workspace = true, features = ["derive"] } diff --git a/crates/voicevox_core_python_api/python/test/conftest.py b/crates/voicevox_core_python_api/python/test/conftest.py index c55fcb4a4..0b7d0cb1c 100644 --- a/crates/voicevox_core_python_api/python/test/conftest.py +++ b/crates/voicevox_core_python_api/python/test/conftest.py @@ -1,7 +1,7 @@ import json import os from pathlib import Path -from typing import List, TypedDict +from typing import TypedDict import pytest import voicevox_core @@ -27,26 +27,26 @@ class DurationExampleData(TypedDict): length: int - phoneme_vector: List[int] - result: List[float] + phoneme_vector: list[int] + result: list[float] class IntonationExampleData(TypedDict): length: int - vowel_phoneme_vector: List[int] - consonant_phoneme_vector: List[int] - start_accent_vector: List[int] - end_accent_vector: List[int] - start_accent_phrase_vector: List[int] - end_accent_phrase_vector: List[int] - result: List[float] + vowel_phoneme_vector: list[int] + consonant_phoneme_vector: list[int] + start_accent_vector: list[int] + end_accent_vector: list[int] + start_accent_phrase_vector: list[int] + end_accent_phrase_vector: list[int] + result: list[float] class DecodeExampleData(TypedDict): f0_length: int phoneme_size: int - f0_vector: List[float] - phoneme_vector: List[float] + f0_vector: list[float] + phoneme_vector: list[float] class ExampleData(TypedDict): diff --git a/crates/voicevox_core_python_api/python/test/test_type_stub_consts.py b/crates/voicevox_core_python_api/python/test/test_type_stub_consts.py index 6a44d2771..b800d019b 100644 --- a/crates/voicevox_core_python_api/python/test/test_type_stub_consts.py +++ b/crates/voicevox_core_python_api/python/test/test_type_stub_consts.py @@ -3,7 +3,6 @@ import ast from ast import AnnAssign, ClassDef, Constant, Name from pathlib import Path -from typing import Tuple import voicevox_core @@ -22,7 +21,7 @@ def test() -> None: assert len({REAL_BLOCKING, REAL_ASYNCIO, stub_blocking, stub_asyncio}) == 1 -def extract(pyi: Path) -> Tuple[str, str]: +def extract(pyi: Path) -> tuple[str, str]: module = ast.parse(pyi.read_text(encoding="utf-8")) class_def = next( stmt diff --git a/crates/voicevox_core_python_api/python/voicevox_core/_models.py b/crates/voicevox_core_python_api/python/voicevox_core/_models.py index 68359bf18..347d2fb77 100644 --- a/crates/voicevox_core_python_api/python/voicevox_core/_models.py +++ b/crates/voicevox_core_python_api/python/voicevox_core/_models.py @@ -1,6 +1,6 @@ import dataclasses from enum import Enum -from typing import List, NewType, Optional +from typing import NewType from uuid import UUID import pydantic @@ -64,7 +64,7 @@ class StyleMeta: type: StyleType = dataclasses.field(default=StyleType.TALK) """スタイルに対応するモデルの種類。""" - order: Optional[int] = None + order: int | None = None """ 話者の順番。 @@ -79,7 +79,7 @@ class SpeakerMeta: name: str """話者名。""" - styles: List[StyleMeta] + styles: list[StyleMeta] """話者に属するスタイル。""" speaker_uuid: str @@ -88,7 +88,7 @@ class SpeakerMeta: version: StyleVersion """話者のUUID。""" - order: Optional[int] = None + order: int | None = None """ 話者の順番。 @@ -162,10 +162,10 @@ class Mora: pitch: float """音高。""" - consonant: Optional[str] = None + consonant: str | None = None """子音の音素。""" - consonant_length: Optional[float] = None + consonant_length: float | None = None """子音の音長。""" @@ -173,13 +173,13 @@ class Mora: class AccentPhrase: """AccentPhrase (アクセント句ごとの情報)。""" - moras: List[Mora] + moras: list[Mora] """モーラの配列。""" accent: int """アクセント箇所。""" - pause_mora: Optional[Mora] = None + pause_mora: Mora | None = None """後ろに無音を付けるかどうか。""" is_interrogative: bool = False @@ -190,7 +190,7 @@ class AccentPhrase: class AudioQuery: """AudioQuery (音声合成用のクエリ)。""" - accent_phrases: List[AccentPhrase] + accent_phrases: list[AccentPhrase] """アクセント句の配列。""" speed_scale: float @@ -223,7 +223,7 @@ class AudioQuery: pause_length_scale: float = 1.0 """読点などの無音時間(倍率)。デフォルト値は ``1.0`` 。""" - kana: Optional[str] = None + kana: str | None = None """ [読み取り専用] AquesTalk風記法。 diff --git a/crates/voicevox_core_python_api/python/voicevox_core/_rust/asyncio.pyi b/crates/voicevox_core_python_api/python/voicevox_core/_rust/asyncio.pyi index b2dd8f707..bdee4e1ee 100644 --- a/crates/voicevox_core_python_api/python/voicevox_core/_rust/asyncio.pyi +++ b/crates/voicevox_core_python_api/python/voicevox_core/_rust/asyncio.pyi @@ -1,5 +1,5 @@ from os import PathLike -from typing import TYPE_CHECKING, Dict, List, Literal, Union +from typing import TYPE_CHECKING, Literal, Union from uuid import UUID if TYPE_CHECKING: @@ -19,7 +19,7 @@ class VoiceModelFile: 音声モデルファイル。""" @staticmethod - async def open(path: Union[str, PathLike[str]]) -> VoiceModelFile: + async def open(path: str | PathLike[str]) -> VoiceModelFile: """ VVMファイルを開く。 @@ -42,7 +42,7 @@ class VoiceModelFile: """ID。""" ... @property - def metas(self) -> List[SpeakerMeta]: + def metas(self) -> list[SpeakerMeta]: """ メタ情報。 @@ -125,7 +125,7 @@ class OpenJtalk: """ @staticmethod - async def new(open_jtalk_dict_dir: Union[str, PathLike[str]]) -> "OpenJtalk": + async def new(open_jtalk_dict_dir: str | PathLike[str]) -> "OpenJtalk": """ ``OpenJTalk`` を生成する。 @@ -169,9 +169,8 @@ class Synthesizer: self, onnxruntime: Onnxruntime, open_jtalk: OpenJtalk, - acceleration_mode: Union[ - AccelerationMode, Literal["AUTO", "CPU", "GPU"] - ] = AccelerationMode.AUTO, + acceleration_mode: AccelerationMode + | Literal["AUTO", "CPU", "GPU"] = AccelerationMode.AUTO, cpu_num_threads: int = 0, ) -> None: ... def __repr__(self) -> str: ... @@ -185,7 +184,7 @@ class Synthesizer: def is_gpu_mode(self) -> bool: """ハードウェアアクセラレーションがGPUモードかどうか。""" ... - def metas(self) -> List[SpeakerMeta]: + def metas(self) -> list[SpeakerMeta]: """メタ情報。""" ... async def load_voice_model(self, model: VoiceModelFile) -> None: @@ -198,7 +197,7 @@ class Synthesizer: 読み込むモデルのスタイルID。 """ ... - def unload_voice_model(self, voice_model_id: Union[VoiceModelId, UUID]) -> None: + def unload_voice_model(self, voice_model_id: VoiceModelId | UUID) -> None: """ 音声モデルの読み込みを解除する。 @@ -208,7 +207,7 @@ class Synthesizer: 音声モデルID。 """ ... - def is_loaded_voice_model(self, voice_model_id: Union[VoiceModelId, UUID]) -> bool: + def is_loaded_voice_model(self, voice_model_id: VoiceModelId | UUID) -> bool: """ 指定したvoice_model_idのモデルが読み込まれているか判定する。 @@ -225,7 +224,7 @@ class Synthesizer: async def create_audio_query_from_kana( self, kana: str, - style_id: Union[StyleId, int], + style_id: StyleId | int, ) -> AudioQuery: """ AquesTalk風記法から :class:`AudioQuery` を生成する。 @@ -245,7 +244,7 @@ class Synthesizer: async def create_audio_query( self, text: str, - style_id: Union[StyleId, int], + style_id: StyleId | int, ) -> AudioQuery: """ 日本語のテキストから :class:`AudioQuery` を生成する。 @@ -265,8 +264,8 @@ class Synthesizer: async def create_accent_phrases_from_kana( self, kana: str, - style_id: Union[StyleId, int], - ) -> List[AccentPhrase]: + style_id: StyleId | int, + ) -> list[AccentPhrase]: """ AquesTalk風記法からAccentPhrase(アクセント句)の配列を生成する。 @@ -285,8 +284,8 @@ class Synthesizer: async def create_accent_phrases( self, text: str, - style_id: Union[StyleId, int], - ) -> List[AccentPhrase]: + style_id: StyleId | int, + ) -> list[AccentPhrase]: """ 日本語のテキストからAccentPhrase(アクセント句)の配列を生成する。 @@ -304,9 +303,9 @@ class Synthesizer: ... async def replace_mora_data( self, - accent_phrases: List[AccentPhrase], - style_id: Union[StyleId, int], - ) -> List[AccentPhrase]: + accent_phrases: list[AccentPhrase], + style_id: StyleId | int, + ) -> list[AccentPhrase]: """ アクセント句の音高・音素長を変更した新しいアクセント句の配列を生成する。 @@ -326,9 +325,9 @@ class Synthesizer: ... async def replace_phoneme_length( self, - accent_phrases: List[AccentPhrase], - style_id: Union[StyleId, int], - ) -> List[AccentPhrase]: + accent_phrases: list[AccentPhrase], + style_id: StyleId | int, + ) -> list[AccentPhrase]: """ アクセント句の音素長を変更した新しいアクセント句の配列を生成する。 @@ -344,9 +343,9 @@ class Synthesizer: ... async def replace_mora_pitch( self, - accent_phrases: List[AccentPhrase], - style_id: Union[StyleId, int], - ) -> List[AccentPhrase]: + accent_phrases: list[AccentPhrase], + style_id: StyleId | int, + ) -> list[AccentPhrase]: """ アクセント句の音高を変更した新しいアクセント句の配列を生成する。 @@ -363,7 +362,7 @@ class Synthesizer: async def synthesis( self, audio_query: AudioQuery, - style_id: Union[StyleId, int], + style_id: StyleId | int, enable_interrogative_upspeak: bool = True, ) -> bytes: """ @@ -386,7 +385,7 @@ class Synthesizer: async def tts_from_kana( self, kana: str, - style_id: Union[StyleId, int], + style_id: StyleId | int, enable_interrogative_upspeak: bool = True, ) -> bytes: """ @@ -405,7 +404,7 @@ class Synthesizer: async def tts( self, text: str, - style_id: Union[StyleId, int], + style_id: StyleId | int, enable_interrogative_upspeak: bool = True, ) -> bytes: """ @@ -430,11 +429,11 @@ class Synthesizer: class UserDict: """ユーザー辞書。""" - def words(self) -> Dict[UUID, UserDictWord]: + def words(self) -> dict[UUID, UserDictWord]: """このオプジェクトの :class:`dict` としての表現。""" ... def __init__(self) -> None: ... - async def load(self, path: Union[str, PathLike[str]]) -> None: + async def load(self, path: str | PathLike[str]) -> None: """ファイルに保存されたユーザー辞書を読み込む。 Parameters @@ -443,7 +442,7 @@ class UserDict: ユーザー辞書のパス。 """ ... - async def save(self, path: Union[str, PathLike[str]]) -> None: + async def save(self, path: str | PathLike[str]) -> None: """ ユーザー辞書をファイルに保存する。 diff --git a/crates/voicevox_core_python_api/python/voicevox_core/_rust/blocking.pyi b/crates/voicevox_core_python_api/python/voicevox_core/_rust/blocking.pyi index eb57f4907..58851e40a 100644 --- a/crates/voicevox_core_python_api/python/voicevox_core/_rust/blocking.pyi +++ b/crates/voicevox_core_python_api/python/voicevox_core/_rust/blocking.pyi @@ -1,5 +1,5 @@ from os import PathLike -from typing import TYPE_CHECKING, Dict, List, Literal, Union +from typing import TYPE_CHECKING, Literal, Union from uuid import UUID if TYPE_CHECKING: @@ -19,7 +19,7 @@ class VoiceModelFile: 音声モデルファイル。""" @staticmethod - def open(path: Union[str, PathLike[str]]) -> VoiceModelFile: + def open(path: str | PathLike[str]) -> VoiceModelFile: """ VVMファイルを開く。 @@ -42,7 +42,7 @@ class VoiceModelFile: """ID。""" ... @property - def metas(self) -> List[SpeakerMeta]: + def metas(self) -> list[SpeakerMeta]: """ メタ情報。 @@ -129,7 +129,7 @@ class OpenJtalk: Open JTalkの辞書ディレクトリ。 """ - def __init__(self, open_jtalk_dict_dir: Union[str, PathLike[str]]) -> None: ... + def __init__(self, open_jtalk_dict_dir: str | PathLike[str]) -> None: ... def use_user_dict(self, user_dict: UserDict) -> None: """ ユーザー辞書を設定する。 @@ -169,9 +169,8 @@ class Synthesizer: self, onnxruntime: Onnxruntime, open_jtalk: OpenJtalk, - acceleration_mode: Union[ - AccelerationMode, Literal["AUTO", "CPU", "GPU"] - ] = AccelerationMode.AUTO, + acceleration_mode: AccelerationMode + | Literal["AUTO", "CPU", "GPU"] = AccelerationMode.AUTO, cpu_num_threads: int = 0, ) -> None: ... def __repr__(self) -> str: ... @@ -185,7 +184,7 @@ class Synthesizer: def is_gpu_mode(self) -> bool: """ハードウェアアクセラレーションがGPUモードかどうか。""" ... - def metas(self) -> List[SpeakerMeta]: + def metas(self) -> list[SpeakerMeta]: """メタ情報。""" ... def load_voice_model(self, model: VoiceModelFile) -> None: @@ -198,7 +197,7 @@ class Synthesizer: 読み込むモデルのスタイルID。 """ ... - def unload_voice_model(self, voice_model_id: Union[VoiceModelId, UUID]) -> None: + def unload_voice_model(self, voice_model_id: VoiceModelId | UUID) -> None: """ 音声モデルの読み込みを解除する。 @@ -208,7 +207,7 @@ class Synthesizer: 音声モデルID。 """ ... - def is_loaded_voice_model(self, voice_model_id: Union[VoiceModelId, UUID]) -> bool: + def is_loaded_voice_model(self, voice_model_id: VoiceModelId | UUID) -> bool: """ 指定したvoice_model_idのモデルが読み込まれているか判定する。 @@ -225,7 +224,7 @@ class Synthesizer: def create_audio_query_from_kana( self, kana: str, - style_id: Union[StyleId, int], + style_id: StyleId | int, ) -> AudioQuery: """ AquesTalk風記法から :class:`AudioQuery` を生成する。 @@ -245,7 +244,7 @@ class Synthesizer: def create_audio_query( self, text: str, - style_id: Union[StyleId, int], + style_id: StyleId | int, ) -> AudioQuery: """ 日本語のテキストから :class:`AudioQuery` を生成する。 @@ -265,8 +264,8 @@ class Synthesizer: def create_accent_phrases_from_kana( self, kana: str, - style_id: Union[StyleId, int], - ) -> List[AccentPhrase]: + style_id: StyleId | int, + ) -> list[AccentPhrase]: """ AquesTalk風記法からAccentPhrase(アクセント句)の配列を生成する。 @@ -285,8 +284,8 @@ class Synthesizer: def create_accent_phrases( self, text: str, - style_id: Union[StyleId, int], - ) -> List[AccentPhrase]: + style_id: StyleId | int, + ) -> list[AccentPhrase]: """ 日本語のテキストからAccentPhrase(アクセント句)の配列を生成する。 @@ -304,9 +303,9 @@ class Synthesizer: ... def replace_mora_data( self, - accent_phrases: List[AccentPhrase], - style_id: Union[StyleId, int], - ) -> List[AccentPhrase]: + accent_phrases: list[AccentPhrase], + style_id: StyleId | int, + ) -> list[AccentPhrase]: """ アクセント句の音高・音素長を変更した新しいアクセント句の配列を生成する。 @@ -326,9 +325,9 @@ class Synthesizer: ... def replace_phoneme_length( self, - accent_phrases: List[AccentPhrase], - style_id: Union[StyleId, int], - ) -> List[AccentPhrase]: + accent_phrases: list[AccentPhrase], + style_id: StyleId | int, + ) -> list[AccentPhrase]: """ アクセント句の音素長を変更した新しいアクセント句の配列を生成する。 @@ -344,9 +343,9 @@ class Synthesizer: ... def replace_mora_pitch( self, - accent_phrases: List[AccentPhrase], - style_id: Union[StyleId, int], - ) -> List[AccentPhrase]: + accent_phrases: list[AccentPhrase], + style_id: StyleId | int, + ) -> list[AccentPhrase]: """ アクセント句の音高を変更した新しいアクセント句の配列を生成する。 @@ -363,7 +362,7 @@ class Synthesizer: def precompute_render( self, audio_query: AudioQuery, - style_id: Union[StyleId, int], + style_id: StyleId | int, enable_interrogative_upspeak: bool = True, ) -> AudioFeature: ... def render( @@ -375,7 +374,7 @@ class Synthesizer: def synthesis( self, audio_query: AudioQuery, - style_id: Union[StyleId, int], + style_id: StyleId | int, enable_interrogative_upspeak: bool = True, ) -> bytes: """ @@ -398,7 +397,7 @@ class Synthesizer: def tts_from_kana( self, kana: str, - style_id: Union[StyleId, int], + style_id: StyleId | int, enable_interrogative_upspeak: bool = True, ) -> bytes: """ @@ -417,7 +416,7 @@ class Synthesizer: def tts( self, text: str, - style_id: Union[StyleId, int], + style_id: StyleId | int, enable_interrogative_upspeak: bool = True, ) -> bytes: """ @@ -442,11 +441,11 @@ class Synthesizer: class UserDict: """ユーザー辞書。""" - def words(self) -> Dict[UUID, UserDictWord]: + def words(self) -> dict[UUID, UserDictWord]: """このオプジェクトの :class:`dict` としての表現。""" ... def __init__(self) -> None: ... - def load(self, path: Union[str, PathLike[str]]) -> None: + def load(self, path: str | PathLike[str]) -> None: """ファイルに保存されたユーザー辞書を読み込む。 Parameters @@ -455,7 +454,7 @@ class UserDict: ユーザー辞書のパス。 """ ... - def save(self, path: Union[str, PathLike[str]]) -> None: + def save(self, path: str | PathLike[str]) -> None: """ ユーザー辞書をファイルに保存する。