Skip to content

Commit 725ac16

Browse files
author
yuhongxiao
committed
暂存
1 parent df3829b commit 725ac16

File tree

4 files changed

+50
-4
lines changed

4 files changed

+50
-4
lines changed

src/zai/api_resource/audio/audio.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
from zai.types.sensitive_word_check import SensitiveWordCheckRequest
2424

2525
from .transcriptions import Transcriptions
26+
from ...core import StreamResponse
27+
from ...types.audio import AudioSpeechChunk
2628

2729
if TYPE_CHECKING:
2830
from zai._client import ZaiClient
@@ -60,7 +62,7 @@ def speech(
6062
speed: float | None = 1.0,
6163
volume: float | None = 1.0,
6264
stream: bool | None = False
63-
) -> HttpxBinaryResponseContent:
65+
) -> HttpxBinaryResponseContent | StreamResponse[AudioSpeechChunk]:
6466
"""
6567
Generate speech audio from text input
6668

src/zai/types/audio/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .audio_customization_param import AudioCustomizationParam
2+
from .audio_speech_chunk import AudioSpeechChunk
23
from .audio_speech_params import AudioSpeechParams
34
from .transcriptions_create_param import TranscriptionsParam
45

5-
__all__ = ['AudioSpeechParams', 'AudioCustomizationParam', 'TranscriptionsParam']
6+
__all__ = ['AudioSpeechParams', 'AudioCustomizationParam', 'TranscriptionsParam', 'AudioSpeechChunk']
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from typing import List, Optional, Dict, Any
2+
3+
from ...core import BaseModel
4+
5+
__all__ = [
6+
"AudioSpeechChunk",
7+
"AudioError",
8+
"AudioSpeechChoice",
9+
"AudioSpeechDelta"
10+
]
11+
12+
13+
class AudioSpeechDelta(BaseModel):
14+
content: Optional[str] = None
15+
role: Optional[str] = None
16+
17+
18+
class AudioSpeechChoice(BaseModel):
19+
delta: AudioSpeechDelta
20+
finish_reason: Optional[str] = None
21+
index: int
22+
23+
class AudioError(BaseModel):
24+
code: Optional[str] = None
25+
message: Optional[str] = None
26+
27+
28+
class AudioSpeechChunk(BaseModel):
29+
choices: List[AudioSpeechChoice]
30+
request_id: Optional[str] = None
31+
created: Optional[int] = None
32+
error: Optional[AudioError] = None

tests/integration_tests/test_audio.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1+
import base64
12
import logging
23
import logging.config
34
from pathlib import Path
45

56
import zai
67
from zai import ZaiClient
78

9+
from src.zai import ZhipuAiClient
10+
811

912
def test_audio_speech(logging_conf):
1013
logging.config.dictConfig(logging_conf) # type: ignore
11-
client = ZaiClient() # Fill in your own API Key
14+
client = ZhipuAiClient(base_url='https://open.bigmodel.cn/api/paas/v4', api_key='adf953faf621426da79103110eb41473.3FCVJZcTaq0Q7i3W') # Fill in your own API Key
1215
try:
1316
speech_file_path = Path(__file__).parent / 'asr1.pcm'
1417
response = client.audio.speech(
@@ -21,7 +24,15 @@ def test_audio_speech(logging_conf):
2124
speed=1.0,
2225
volume=1.0,
2326
)
24-
response.stream_to_file(speech_file_path)
27+
with open("output.pcm", "wb") as f:
28+
for item in response:
29+
choice = item.choices[0]
30+
index = choice.index
31+
finish_reason = choice.finish_reason
32+
audio_delta = choice.delta.content
33+
if finish_reason is not None:
34+
break
35+
f.write(base64.b64decode(audio_delta))
2536

2637
except zai.core._errors.APIRequestFailedError as err:
2738
print(err)

0 commit comments

Comments
 (0)