Skip to content

Commit 8e140d0

Browse files
authored
Merge pull request #20 from Alacadrial/main
2 parents f3e3b38 + 6a68302 commit 8e140d0

File tree

4 files changed

+111
-1
lines changed

4 files changed

+111
-1
lines changed

voicevox/client.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from .audio_query import AudioQuery
99
from .http import HttpClient
1010
from .speakers import Speaker
11-
11+
from .speaker_info import SpeakerInfo
1212

1313
logger = logging.getLogger(__name__)
1414

@@ -128,6 +128,27 @@ async def fetch_speakers(
128128
"""
129129
speakers = await self.http.get_speakers(core_version)
130130
return [Speaker(speaker) for speaker in speakers]
131+
132+
async def fetch_speaker_info(
133+
self, speaker_uuid: str, core_version: Optional[str] = None
134+
) -> SpeakerInfo:
135+
"""Fetch speaker's info by given uuid.
136+
137+
This function retrieves additional information about a specific speaker, including its voice samples, icon, and portrait images.
138+
139+
Parameters
140+
----------
141+
speaker_uuid : str
142+
speaker's uuid
143+
core_version : Optional[str]
144+
voicevox core version
145+
146+
Returns
147+
-------
148+
SpeakerInfo
149+
Contains additional information of the speaker.
150+
"""
151+
return SpeakerInfo(await self.http.get_speaker_info(speaker_uuid, core_version))
131152

132153
async def multi_synthesis(
133154
self, audio_queries: List[AudioQuery], speaker: int,

voicevox/http.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
from httpx import AsyncClient
88

9+
910
from .errors import NotfoundError, HttpException
1011
from .types import AudioQueryType, SpeakerType
12+
from .types.speaker_info import SpeakerInfoType
1113

1214

1315
logger = logging.getLogger(__name__)
@@ -80,6 +82,16 @@ async def get_speakers(
8082
params["core_version"] = core_version
8183
return await self.request("GET", "/speakers", params=params)
8284

85+
async def get_speaker_info(
86+
self, speaker_uuid: str, core_version: Optional[str]
87+
) -> SpeakerInfoType:
88+
params = {
89+
"speaker_uuid": speaker_uuid
90+
}
91+
if core_version is not None:
92+
params["core_version"] = core_version
93+
return await self.request("GET", "/speaker_info", params=params)
94+
8395
async def initialize_speaker(self, params: dict) -> None:
8496
await self.request("POST", "/initialize_speaker", params=params)
8597

voicevox/speaker_info.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# voicevox - speaker_info
2+
3+
from typing import List
4+
5+
from .types.speaker_info import SpeakerInfoType, StyleInfoType
6+
7+
8+
class StyleInfo:
9+
"""Return style info
10+
11+
Attributes
12+
----------
13+
id: int
14+
style id
15+
icon: str
16+
base64 encoded icon
17+
portrait: str
18+
base64 encoded portrait image
19+
voice_samples: list[str]
20+
base64 encoded voice sample
21+
"""
22+
23+
def __init__(self, payload: StyleInfoType):
24+
self.__data = payload
25+
26+
@property
27+
def id(self) -> int:
28+
return self.__data["id"]
29+
30+
@property
31+
def icon(self) -> str:
32+
return self.__data["icon"]
33+
34+
@property
35+
def portrait(self) -> str:
36+
return self.__data["portrait"]
37+
38+
@property
39+
def voice_samples(self) -> list[str]:
40+
return self.__data["voice_samples"]
41+
42+
43+
class SpeakerInfo:
44+
"""Return speaker info
45+
46+
Attributes
47+
----------
48+
policy: str
49+
policy
50+
portrait: str
51+
base64 encoded portrait image
52+
style_infos: list[StyleInfo]
53+
list of Style informations
54+
"""
55+
56+
def __init__(self, payload: SpeakerInfoType):
57+
self.policy: str = payload["policy"]
58+
self.portrait: str = payload["portrait"]
59+
self.style_infos: List[StyleInfo] = [
60+
StyleInfo(style_info) for style_info in payload["style_infos"]
61+
]

voicevox/types/speaker_info.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# voicevox - types/speaker_info
2+
3+
from typing import TypedDict, List
4+
5+
6+
class StyleInfoType(TypedDict):
7+
id: int
8+
icon: str
9+
portrait: str
10+
voice_samples: List[str]
11+
12+
13+
class SpeakerInfoType(TypedDict):
14+
policy: str
15+
portrait: str
16+
style_infos: List[StyleInfoType]

0 commit comments

Comments
 (0)