audex 1.0.7a3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. audex/__init__.py +9 -0
  2. audex/__main__.py +7 -0
  3. audex/cli/__init__.py +189 -0
  4. audex/cli/apis/__init__.py +12 -0
  5. audex/cli/apis/init/__init__.py +34 -0
  6. audex/cli/apis/init/gencfg.py +130 -0
  7. audex/cli/apis/init/setup.py +330 -0
  8. audex/cli/apis/init/vprgroup.py +125 -0
  9. audex/cli/apis/serve.py +141 -0
  10. audex/cli/args.py +356 -0
  11. audex/cli/exceptions.py +44 -0
  12. audex/cli/helper/__init__.py +0 -0
  13. audex/cli/helper/ansi.py +193 -0
  14. audex/cli/helper/display.py +288 -0
  15. audex/config/__init__.py +64 -0
  16. audex/config/core/__init__.py +30 -0
  17. audex/config/core/app.py +29 -0
  18. audex/config/core/audio.py +45 -0
  19. audex/config/core/logging.py +163 -0
  20. audex/config/core/session.py +11 -0
  21. audex/config/helper/__init__.py +1 -0
  22. audex/config/helper/client/__init__.py +1 -0
  23. audex/config/helper/client/http.py +28 -0
  24. audex/config/helper/client/websocket.py +21 -0
  25. audex/config/helper/provider/__init__.py +1 -0
  26. audex/config/helper/provider/dashscope.py +13 -0
  27. audex/config/helper/provider/unisound.py +18 -0
  28. audex/config/helper/provider/xfyun.py +23 -0
  29. audex/config/infrastructure/__init__.py +31 -0
  30. audex/config/infrastructure/cache.py +51 -0
  31. audex/config/infrastructure/database.py +48 -0
  32. audex/config/infrastructure/recorder.py +32 -0
  33. audex/config/infrastructure/store.py +19 -0
  34. audex/config/provider/__init__.py +18 -0
  35. audex/config/provider/transcription.py +109 -0
  36. audex/config/provider/vpr.py +99 -0
  37. audex/container.py +40 -0
  38. audex/entity/__init__.py +468 -0
  39. audex/entity/doctor.py +109 -0
  40. audex/entity/doctor.pyi +51 -0
  41. audex/entity/fields.py +401 -0
  42. audex/entity/segment.py +115 -0
  43. audex/entity/segment.pyi +38 -0
  44. audex/entity/session.py +133 -0
  45. audex/entity/session.pyi +47 -0
  46. audex/entity/utterance.py +142 -0
  47. audex/entity/utterance.pyi +48 -0
  48. audex/entity/vp.py +68 -0
  49. audex/entity/vp.pyi +35 -0
  50. audex/exceptions.py +157 -0
  51. audex/filters/__init__.py +692 -0
  52. audex/filters/generated/__init__.py +21 -0
  53. audex/filters/generated/doctor.py +987 -0
  54. audex/filters/generated/segment.py +723 -0
  55. audex/filters/generated/session.py +978 -0
  56. audex/filters/generated/utterance.py +939 -0
  57. audex/filters/generated/vp.py +815 -0
  58. audex/helper/__init__.py +1 -0
  59. audex/helper/hash.py +33 -0
  60. audex/helper/mixin.py +65 -0
  61. audex/helper/net.py +19 -0
  62. audex/helper/settings/__init__.py +830 -0
  63. audex/helper/settings/fields.py +317 -0
  64. audex/helper/stream.py +153 -0
  65. audex/injectors/__init__.py +1 -0
  66. audex/injectors/config.py +12 -0
  67. audex/injectors/lifespan.py +7 -0
  68. audex/lib/__init__.py +1 -0
  69. audex/lib/cache/__init__.py +383 -0
  70. audex/lib/cache/inmemory.py +513 -0
  71. audex/lib/database/__init__.py +83 -0
  72. audex/lib/database/sqlite.py +406 -0
  73. audex/lib/exporter.py +189 -0
  74. audex/lib/injectors/__init__.py +1 -0
  75. audex/lib/injectors/cache.py +25 -0
  76. audex/lib/injectors/container.py +47 -0
  77. audex/lib/injectors/exporter.py +26 -0
  78. audex/lib/injectors/recorder.py +33 -0
  79. audex/lib/injectors/server.py +17 -0
  80. audex/lib/injectors/session.py +18 -0
  81. audex/lib/injectors/sqlite.py +24 -0
  82. audex/lib/injectors/store.py +13 -0
  83. audex/lib/injectors/transcription.py +42 -0
  84. audex/lib/injectors/usb.py +12 -0
  85. audex/lib/injectors/vpr.py +65 -0
  86. audex/lib/injectors/wifi.py +7 -0
  87. audex/lib/recorder.py +844 -0
  88. audex/lib/repos/__init__.py +149 -0
  89. audex/lib/repos/container.py +23 -0
  90. audex/lib/repos/database/__init__.py +1 -0
  91. audex/lib/repos/database/sqlite.py +672 -0
  92. audex/lib/repos/decorators.py +74 -0
  93. audex/lib/repos/doctor.py +286 -0
  94. audex/lib/repos/segment.py +302 -0
  95. audex/lib/repos/session.py +285 -0
  96. audex/lib/repos/tables/__init__.py +70 -0
  97. audex/lib/repos/tables/doctor.py +137 -0
  98. audex/lib/repos/tables/segment.py +113 -0
  99. audex/lib/repos/tables/session.py +140 -0
  100. audex/lib/repos/tables/utterance.py +131 -0
  101. audex/lib/repos/tables/vp.py +102 -0
  102. audex/lib/repos/utterance.py +288 -0
  103. audex/lib/repos/vp.py +286 -0
  104. audex/lib/restful.py +251 -0
  105. audex/lib/server/__init__.py +97 -0
  106. audex/lib/server/auth.py +98 -0
  107. audex/lib/server/handlers.py +248 -0
  108. audex/lib/server/templates/index.html.j2 +226 -0
  109. audex/lib/server/templates/login.html.j2 +111 -0
  110. audex/lib/server/templates/static/script.js +68 -0
  111. audex/lib/server/templates/static/style.css +579 -0
  112. audex/lib/server/types.py +123 -0
  113. audex/lib/session.py +503 -0
  114. audex/lib/store/__init__.py +238 -0
  115. audex/lib/store/localfile.py +411 -0
  116. audex/lib/transcription/__init__.py +33 -0
  117. audex/lib/transcription/dashscope.py +525 -0
  118. audex/lib/transcription/events.py +62 -0
  119. audex/lib/usb.py +554 -0
  120. audex/lib/vpr/__init__.py +38 -0
  121. audex/lib/vpr/unisound/__init__.py +185 -0
  122. audex/lib/vpr/unisound/types.py +469 -0
  123. audex/lib/vpr/xfyun/__init__.py +483 -0
  124. audex/lib/vpr/xfyun/types.py +679 -0
  125. audex/lib/websocket/__init__.py +8 -0
  126. audex/lib/websocket/connection.py +485 -0
  127. audex/lib/websocket/pool.py +991 -0
  128. audex/lib/wifi.py +1146 -0
  129. audex/lifespan.py +75 -0
  130. audex/service/__init__.py +27 -0
  131. audex/service/decorators.py +73 -0
  132. audex/service/doctor/__init__.py +652 -0
  133. audex/service/doctor/const.py +36 -0
  134. audex/service/doctor/exceptions.py +96 -0
  135. audex/service/doctor/types.py +54 -0
  136. audex/service/export/__init__.py +236 -0
  137. audex/service/export/const.py +17 -0
  138. audex/service/export/exceptions.py +34 -0
  139. audex/service/export/types.py +21 -0
  140. audex/service/injectors/__init__.py +1 -0
  141. audex/service/injectors/container.py +53 -0
  142. audex/service/injectors/doctor.py +34 -0
  143. audex/service/injectors/export.py +27 -0
  144. audex/service/injectors/session.py +49 -0
  145. audex/service/session/__init__.py +754 -0
  146. audex/service/session/const.py +34 -0
  147. audex/service/session/exceptions.py +67 -0
  148. audex/service/session/types.py +91 -0
  149. audex/types.py +39 -0
  150. audex/utils.py +287 -0
  151. audex/valueobj/__init__.py +81 -0
  152. audex/valueobj/common/__init__.py +1 -0
  153. audex/valueobj/common/auth.py +84 -0
  154. audex/valueobj/common/email.py +16 -0
  155. audex/valueobj/common/ops.py +22 -0
  156. audex/valueobj/common/phone.py +84 -0
  157. audex/valueobj/common/version.py +72 -0
  158. audex/valueobj/session.py +19 -0
  159. audex/valueobj/utterance.py +15 -0
  160. audex/view/__init__.py +51 -0
  161. audex/view/container.py +17 -0
  162. audex/view/decorators.py +303 -0
  163. audex/view/pages/__init__.py +1 -0
  164. audex/view/pages/dashboard/__init__.py +286 -0
  165. audex/view/pages/dashboard/wifi.py +407 -0
  166. audex/view/pages/login.py +110 -0
  167. audex/view/pages/recording.py +348 -0
  168. audex/view/pages/register.py +202 -0
  169. audex/view/pages/sessions/__init__.py +196 -0
  170. audex/view/pages/sessions/details.py +224 -0
  171. audex/view/pages/sessions/export.py +443 -0
  172. audex/view/pages/settings.py +374 -0
  173. audex/view/pages/voiceprint/__init__.py +1 -0
  174. audex/view/pages/voiceprint/enroll.py +195 -0
  175. audex/view/pages/voiceprint/update.py +195 -0
  176. audex/view/static/css/dashboard.css +452 -0
  177. audex/view/static/css/glass.css +22 -0
  178. audex/view/static/css/global.css +541 -0
  179. audex/view/static/css/login.css +386 -0
  180. audex/view/static/css/recording.css +439 -0
  181. audex/view/static/css/register.css +293 -0
  182. audex/view/static/css/sessions/styles.css +501 -0
  183. audex/view/static/css/settings.css +186 -0
  184. audex/view/static/css/voiceprint/enroll.css +43 -0
  185. audex/view/static/css/voiceprint/styles.css +209 -0
  186. audex/view/static/css/voiceprint/update.css +44 -0
  187. audex/view/static/images/logo.svg +95 -0
  188. audex/view/static/js/recording.js +42 -0
  189. audex-1.0.7a3.dist-info/METADATA +361 -0
  190. audex-1.0.7a3.dist-info/RECORD +192 -0
  191. audex-1.0.7a3.dist-info/WHEEL +4 -0
  192. audex-1.0.7a3.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,679 @@
1
+ from __future__ import annotations
2
+
3
+ import typing as t
4
+
5
+ from pydantic import Field
6
+
7
+ from audex.lib.restful import BaseModel
8
+
9
+
10
+ class RequestHeader(BaseModel):
11
+ app_id: str = Field(
12
+ ...,
13
+ description="Application ID obtained from XFYun platform",
14
+ )
15
+
16
+ status: t.Literal[3] = Field(
17
+ default=3,
18
+ description="Request status, value must be 3 (one-time transmission)",
19
+ )
20
+
21
+
22
+ class XFYunResponseHeader(BaseModel):
23
+ code: int = Field(
24
+ ...,
25
+ description="Response code, 0 indicates success",
26
+ )
27
+
28
+ message: str = Field(
29
+ ...,
30
+ description="Response message description",
31
+ )
32
+
33
+ sid: str = Field(
34
+ ...,
35
+ description="Unique session identifier for this request",
36
+ )
37
+
38
+
39
+ class ResFormat(BaseModel):
40
+ encoding: t.Literal["utf8"] = Field(
41
+ default="utf8",
42
+ description="Encoding format, fixed to utf8",
43
+ )
44
+
45
+ compress: t.Literal["raw"] = Field(
46
+ default="raw",
47
+ description="Compression format, fixed to raw",
48
+ )
49
+
50
+ format: t.Literal["json"] = Field(
51
+ default="json",
52
+ description="Text format, fixed to json",
53
+ )
54
+
55
+
56
+ class AudioResource(BaseModel):
57
+ encoding: t.Literal["lame"] = Field(
58
+ default="lame",
59
+ description="Audio encoding format, fixed to lame (MP3)",
60
+ )
61
+
62
+ sample_rate: int = Field(
63
+ default=16000,
64
+ description="Audio sample rate in Hz, must be 16000",
65
+ )
66
+
67
+ channels: t.Literal[1] = Field(
68
+ default=1,
69
+ description="Audio channel count, fixed to 1 (mono)",
70
+ )
71
+
72
+ bit_depth: t.Literal[16] = Field(
73
+ default=16,
74
+ description="Audio bit depth, fixed to 16",
75
+ )
76
+
77
+ status: t.Literal[3] = Field(
78
+ default=3,
79
+ description="Audio data status, value must be 3 (one-time transmission)",
80
+ )
81
+
82
+ audio: str = Field(
83
+ ...,
84
+ description="Base64 encoded audio data, max size 4M after encoding",
85
+ )
86
+
87
+
88
+ class AudioPayload(BaseModel):
89
+ resource: AudioResource = Field(
90
+ ...,
91
+ description="Audio resource parameters",
92
+ )
93
+
94
+
95
+ PayloadT = t.TypeVar("PayloadT", bound=BaseModel)
96
+
97
+
98
+ class XFYunResponse(BaseModel, t.Generic[PayloadT]):
99
+ header: XFYunResponseHeader = Field(
100
+ ...,
101
+ description="Response header with platform parameters",
102
+ )
103
+
104
+ payload: PayloadT = Field(
105
+ ...,
106
+ description="Response payload data",
107
+ )
108
+
109
+
110
+ class TextResult(BaseModel):
111
+ text: str = Field(
112
+ ...,
113
+ description="Base64 encoded response data",
114
+ )
115
+
116
+
117
+ # Create Group -----------------------------------------------------------------
118
+ class S782b4996CreateGroupParams(BaseModel):
119
+ func: t.Literal["createGroup"] = Field(
120
+ default="createGroup",
121
+ description="Function identifier for creating voiceprint group",
122
+ )
123
+
124
+ group_id: str = Field(
125
+ ...,
126
+ alias="groupId",
127
+ serialization_alias="groupId",
128
+ description="Unique identifier for the group, supports letters, numbers and underscores, max length 32",
129
+ )
130
+
131
+ group_name: str | None = Field(
132
+ default=None,
133
+ alias="groupName",
134
+ serialization_alias="groupName",
135
+ description="Name of the group, optional, length range 0-256",
136
+ )
137
+
138
+ group_info: str | None = Field(
139
+ default=None,
140
+ alias="groupInfo",
141
+ serialization_alias="groupInfo",
142
+ description="Description information for the group, optional, length range 0-256",
143
+ )
144
+
145
+ create_group_res: ResFormat = Field(
146
+ default_factory=ResFormat,
147
+ alias="createGroupRes",
148
+ serialization_alias="createGroupRes",
149
+ description="Expected response format configuration",
150
+ )
151
+
152
+
153
+ class CreateGroupParams(BaseModel):
154
+ s782b4996: S782b4996CreateGroupParams = Field(
155
+ ...,
156
+ description="Service-specific parameters for voiceprint recognition",
157
+ )
158
+
159
+
160
+ class CreateGroupRequest(BaseModel):
161
+ header: RequestHeader = Field(
162
+ ...,
163
+ description="Request header with platform parameters",
164
+ )
165
+
166
+ parameter: CreateGroupParams = Field(
167
+ ...,
168
+ description="Service feature parameters",
169
+ )
170
+
171
+
172
+ class CreateGroupResult(BaseModel):
173
+ group_id: str = Field(
174
+ ...,
175
+ alias="groupId",
176
+ serialization_alias="groupId",
177
+ description="Created group unique identifier",
178
+ )
179
+
180
+ group_name: str | None = Field(
181
+ default=None,
182
+ alias="groupName",
183
+ serialization_alias="groupName",
184
+ description="Created group name",
185
+ )
186
+
187
+ group_info: str | None = Field(
188
+ default=None,
189
+ alias="groupInfo",
190
+ serialization_alias="groupInfo",
191
+ description="Created group description",
192
+ )
193
+
194
+
195
+ class CreateGroupPayload(BaseModel):
196
+ create_group_res: TextResult = Field(
197
+ ...,
198
+ alias="createGroupRes",
199
+ serialization_alias="createGroupRes",
200
+ description="Base64 encoded group creation result",
201
+ )
202
+
203
+
204
+ class CreateGroupResponse(XFYunResponse[CreateGroupPayload]): ...
205
+
206
+
207
+ # Create Feature ---------------------------------------------------------------
208
+ class S782b4996CreateFeatureParams(BaseModel):
209
+ func: t.Literal["createFeature"] = Field(
210
+ default="createFeature",
211
+ description="Function identifier for creating voiceprint feature",
212
+ )
213
+
214
+ group_id: str = Field(
215
+ ...,
216
+ alias="groupId",
217
+ serialization_alias="groupId",
218
+ description="Group ID where the feature will be stored, max length 32",
219
+ )
220
+
221
+ feature_id: str = Field(
222
+ ...,
223
+ alias="featureId",
224
+ serialization_alias="featureId",
225
+ description="Unique identifier for the feature, length range 0-32",
226
+ )
227
+
228
+ feature_info: str | None = Field(
229
+ default=None,
230
+ alias="featureInfo",
231
+ serialization_alias="featureInfo",
232
+ description="Feature description, recommended to include timestamp, length range 0-256",
233
+ )
234
+
235
+ create_feature_res: ResFormat = Field(
236
+ default_factory=ResFormat,
237
+ alias="createFeatureRes",
238
+ serialization_alias="createFeatureRes",
239
+ description="Expected response format configuration",
240
+ )
241
+
242
+
243
+ class CreateFeatureParams(BaseModel):
244
+ s782b4996: S782b4996CreateFeatureParams = Field(
245
+ ...,
246
+ description="Service-specific parameters for voiceprint recognition",
247
+ )
248
+
249
+
250
+ class CreateFeatureRequest(BaseModel):
251
+ header: RequestHeader = Field(
252
+ ...,
253
+ description="Request header with platform parameters",
254
+ )
255
+
256
+ parameter: CreateFeatureParams = Field(
257
+ ...,
258
+ description="Service feature parameters",
259
+ )
260
+
261
+ payload: AudioPayload = Field(
262
+ ...,
263
+ description="Audio data payload",
264
+ )
265
+
266
+
267
+ class CreateFeatureResult(BaseModel):
268
+ feature_id: str = Field(
269
+ ...,
270
+ alias="featureId",
271
+ serialization_alias="featureId",
272
+ description="Created feature unique identifier",
273
+ )
274
+
275
+
276
+ class CreateFeaturePayload(BaseModel):
277
+ create_feature_res: TextResult = Field(
278
+ ...,
279
+ alias="createFeatureRes",
280
+ serialization_alias="createFeatureRes",
281
+ description="Base64 encoded feature creation result",
282
+ )
283
+
284
+
285
+ class CreateFeatureResponse(XFYunResponse[CreateFeaturePayload]): ...
286
+
287
+
288
+ # Update Feature ---------------------------------------------------------------
289
+ class S782b4996UpdateFeatureParams(BaseModel):
290
+ func: t.Literal["updateFeature"] = Field(
291
+ default="updateFeature",
292
+ description="Function identifier for updating voiceprint feature",
293
+ )
294
+
295
+ group_id: str = Field(
296
+ ...,
297
+ alias="groupId",
298
+ serialization_alias="groupId",
299
+ pattern=r"^[a-zA-Z0-9_]+$",
300
+ description="Group ID where the feature is stored, max length 32",
301
+ )
302
+
303
+ feature_id: str | None = Field(
304
+ default=None,
305
+ alias="featureId",
306
+ serialization_alias="featureId",
307
+ description="Feature ID to update, length range 0-32",
308
+ )
309
+
310
+ feature_info: str | None = Field(
311
+ default=None,
312
+ alias="featureInfo",
313
+ serialization_alias="featureInfo",
314
+ description="Updated feature description, recommended to include timestamp, length range 0-256",
315
+ )
316
+
317
+ cover: bool = Field(
318
+ default=True,
319
+ description="Update mode: True to overwrite existing feature, False to merge with existing feature",
320
+ )
321
+
322
+ update_feature_res: ResFormat = Field(
323
+ default_factory=ResFormat,
324
+ alias="updateFeatureRes",
325
+ serialization_alias="updateFeatureRes",
326
+ description="Expected response format configuration",
327
+ )
328
+
329
+
330
+ class UpdateFeatureParams(BaseModel):
331
+ s782b4996: S782b4996UpdateFeatureParams = Field(
332
+ ...,
333
+ description="Service-specific parameters for voiceprint recognition",
334
+ )
335
+
336
+
337
+ class UpdateFeatureRequest(BaseModel):
338
+ header: RequestHeader = Field(
339
+ ...,
340
+ description="Request header with platform parameters",
341
+ )
342
+
343
+ parameter: UpdateFeatureParams = Field(
344
+ ...,
345
+ description="Service feature parameters",
346
+ )
347
+
348
+ payload: AudioPayload = Field(
349
+ ...,
350
+ description="Audio data payload",
351
+ )
352
+
353
+
354
+ class UpdateFeatureResult(BaseModel):
355
+ msg: str = Field(
356
+ ...,
357
+ description="Update result message, 'success' indicates successful update",
358
+ )
359
+
360
+
361
+ class UpdateFeaturePayload(BaseModel):
362
+ update_feature_res: TextResult = Field(
363
+ ...,
364
+ alias="updateFeatureRes",
365
+ serialization_alias="updateFeatureRes",
366
+ description="Base64 encoded feature update result",
367
+ )
368
+
369
+
370
+ class UpdateFeatureResponse(XFYunResponse[UpdateFeaturePayload]): ...
371
+
372
+
373
+ # Search Score Feature (1:1 Verification) --------------------------------------
374
+ class S782b4996SearchScoreFeaParams(BaseModel):
375
+ func: t.Literal["searchScoreFea"] = Field(
376
+ default="searchScoreFea",
377
+ description="Function identifier for 1:1 feature verification",
378
+ )
379
+
380
+ group_id: str = Field(
381
+ ...,
382
+ alias="groupId",
383
+ serialization_alias="groupId",
384
+ description="Group ID where the target feature is stored, max length 32",
385
+ )
386
+
387
+ dst_feature_id: str = Field(
388
+ ...,
389
+ alias="dstFeatureId",
390
+ serialization_alias="dstFeatureId",
391
+ max_length=32,
392
+ description="Target feature ID to compare against, length range 0-32",
393
+ )
394
+
395
+ search_score_fea_res: ResFormat = Field(
396
+ default_factory=ResFormat,
397
+ alias="searchScoreFeaRes",
398
+ serialization_alias="searchScoreFeaRes",
399
+ description="Expected response format configuration",
400
+ )
401
+
402
+
403
+ class SearchScoreFeaParams(BaseModel):
404
+ s782b4996: S782b4996SearchScoreFeaParams = Field(
405
+ ...,
406
+ description="Service-specific parameters for voiceprint recognition",
407
+ )
408
+
409
+
410
+ class SearchScoreFeaRequest(BaseModel):
411
+ header: RequestHeader = Field(
412
+ ...,
413
+ description="Request header with platform parameters",
414
+ )
415
+
416
+ parameter: SearchScoreFeaParams = Field(
417
+ ...,
418
+ description="Service feature parameters",
419
+ )
420
+
421
+ payload: AudioPayload = Field(
422
+ ...,
423
+ description="Audio data payload for comparison",
424
+ )
425
+
426
+
427
+ class SearchScoreFeaResult(BaseModel):
428
+ score: float = Field(
429
+ ...,
430
+ description="Similarity score, normal range 0-1 (precise to 2 decimal places), full range -1 to 1. Score 0.6-1 recommended for verification pass",
431
+ )
432
+
433
+ feature_id: str = Field(
434
+ ...,
435
+ alias="featureId",
436
+ serialization_alias="featureId",
437
+ description="Target feature unique identifier",
438
+ )
439
+
440
+ feature_info: str | None = Field(
441
+ None,
442
+ alias="featureInfo",
443
+ serialization_alias="featureInfo",
444
+ description="Target feature description",
445
+ )
446
+
447
+
448
+ class SearchScoreFeaPayload(BaseModel):
449
+ search_score_fea_res: TextResult = Field(
450
+ ...,
451
+ alias="searchScoreFeaRes",
452
+ serialization_alias="searchScoreFeaRes",
453
+ description="Base64 encoded comparison result",
454
+ )
455
+
456
+
457
+ class SearchScoreFeaResponse(XFYunResponse[SearchScoreFeaPayload]): ...
458
+
459
+
460
+ # Search Feature (1:N Identification) ------------------------------------------
461
+ class S782b4996SearchFeaParams(BaseModel):
462
+ func: t.Literal["searchFea"] = Field(
463
+ default="searchFea",
464
+ description="Function identifier for 1:N feature identification",
465
+ )
466
+
467
+ group_id: str = Field(
468
+ ...,
469
+ alias="groupId",
470
+ serialization_alias="groupId",
471
+ description="Group ID to search features in, max length 32",
472
+ )
473
+
474
+ top_k: int = Field(
475
+ ...,
476
+ alias="topK",
477
+ serialization_alias="topK",
478
+ description="Number of top matching features to return, max 10 (requires sufficient features in the group)",
479
+ )
480
+
481
+ search_fea_res: ResFormat = Field(
482
+ default_factory=ResFormat,
483
+ alias="searchFeaRes",
484
+ serialization_alias="searchFeaRes",
485
+ description="Expected response format configuration",
486
+ )
487
+
488
+
489
+ class SearchFeaParams(BaseModel):
490
+ s782b4996: S782b4996SearchFeaParams = Field(
491
+ ...,
492
+ description="Service-specific parameters for voiceprint recognition",
493
+ )
494
+
495
+
496
+ class SearchFeaRequest(BaseModel):
497
+ header: RequestHeader = Field(
498
+ ...,
499
+ description="Request header with platform parameters",
500
+ )
501
+
502
+ parameter: SearchFeaParams = Field(
503
+ ...,
504
+ description="Service feature parameters",
505
+ )
506
+
507
+ payload: AudioPayload = Field(
508
+ ...,
509
+ description="Audio data payload for identification",
510
+ )
511
+
512
+
513
+ class ScoreItem(BaseModel):
514
+ score: float = Field(
515
+ ...,
516
+ description="Similarity score, normal range 0-1 (precise to 2 decimal places), full range -1 to 1",
517
+ )
518
+
519
+ feature_id: str = Field(
520
+ ...,
521
+ alias="featureId",
522
+ serialization_alias="featureId",
523
+ description="Matched feature unique identifier",
524
+ )
525
+
526
+ feature_info: str | None = Field(
527
+ None,
528
+ alias="featureInfo",
529
+ serialization_alias="featureInfo",
530
+ description="Matched feature description",
531
+ )
532
+
533
+
534
+ class SearchFeaResult(BaseModel):
535
+ score_list: list[ScoreItem] = Field(
536
+ ...,
537
+ alias="scoreList",
538
+ serialization_alias="scoreList",
539
+ description="List of top K matching features ordered by similarity score (descending)",
540
+ )
541
+
542
+
543
+ class SearchFeaPayload(BaseModel):
544
+ search_fea_res: TextResult = Field(
545
+ ...,
546
+ alias="searchFeaRes",
547
+ serialization_alias="searchFeaRes",
548
+ description="Base64 encoded search results",
549
+ )
550
+
551
+
552
+ class SearchFeaResponse(XFYunResponse[SearchFeaPayload]): ...
553
+
554
+
555
+ # Delete Feature ---------------------------------------------------------------
556
+ class S782b4996DeleteFeatureParams(BaseModel):
557
+ func: t.Literal["deleteFeature"] = Field(
558
+ default="deleteFeature",
559
+ description="Function identifier for deleting voiceprint feature",
560
+ )
561
+
562
+ group_id: str = Field(
563
+ ...,
564
+ alias="groupId",
565
+ serialization_alias="groupId",
566
+ description="Group ID where the feature is stored, max length 32",
567
+ )
568
+
569
+ feature_id: str = Field(
570
+ ...,
571
+ alias="featureId",
572
+ serialization_alias="featureId",
573
+ description="Feature ID to delete, length range 1-32",
574
+ )
575
+
576
+ delete_feature_res: ResFormat = Field(
577
+ default_factory=ResFormat,
578
+ alias="deleteFeatureRes",
579
+ serialization_alias="deleteFeatureRes",
580
+ description="Expected response format configuration",
581
+ )
582
+
583
+
584
+ class DeleteFeatureParams(BaseModel):
585
+ s782b4996: S782b4996DeleteFeatureParams = Field(
586
+ ...,
587
+ description="Service-specific parameters for voiceprint recognition",
588
+ )
589
+
590
+
591
+ class DeleteFeatureRequest(BaseModel):
592
+ header: RequestHeader = Field(
593
+ ...,
594
+ description="Request header with platform parameters",
595
+ )
596
+
597
+ parameter: DeleteFeatureParams = Field(
598
+ ...,
599
+ description="Service feature parameters",
600
+ )
601
+
602
+
603
+ class DeleteFeatureResult(BaseModel):
604
+ msg: str = Field(
605
+ ...,
606
+ description="Deletion result message, 'success' indicates successful deletion",
607
+ )
608
+
609
+
610
+ class DeleteFeaturePayload(BaseModel):
611
+ delete_feature_res: TextResult = Field(
612
+ ...,
613
+ alias="deleteFeatureRes",
614
+ serialization_alias="deleteFeatureRes",
615
+ description="Base64 encoded deletion result",
616
+ )
617
+
618
+
619
+ class DeleteFeatureResponse(XFYunResponse[DeleteFeaturePayload]): ...
620
+
621
+
622
+ # Delete Group -----------------------------------------------------------------
623
+ class S782b4996DeleteGroupParams(BaseModel):
624
+ func: t.Literal["deleteGroup"] = Field(
625
+ default="deleteGroup",
626
+ description="Function identifier for deleting voiceprint group",
627
+ )
628
+
629
+ group_id: str = Field(
630
+ ...,
631
+ alias="groupId",
632
+ serialization_alias="groupId",
633
+ description="Group ID to delete, max length 32",
634
+ )
635
+
636
+ delete_group_res: ResFormat = Field(
637
+ default_factory=ResFormat,
638
+ alias="deleteGroupRes",
639
+ serialization_alias="deleteGroupRes",
640
+ description="Expected response format configuration",
641
+ )
642
+
643
+
644
+ class DeleteGroupParams(BaseModel):
645
+ s782b4996: S782b4996DeleteGroupParams = Field(
646
+ ...,
647
+ description="Service-specific parameters for voiceprint recognition",
648
+ )
649
+
650
+
651
+ class DeleteGroupRequest(BaseModel):
652
+ header: RequestHeader = Field(
653
+ ...,
654
+ description="Request header with platform parameters",
655
+ )
656
+
657
+ parameter: DeleteGroupParams = Field(
658
+ ...,
659
+ description="Service feature parameters",
660
+ )
661
+
662
+
663
+ class DeleteGroupResult(BaseModel):
664
+ msg: str = Field(
665
+ ...,
666
+ description="Deletion result message, 'success' indicates successful deletion of voiceprint group",
667
+ )
668
+
669
+
670
+ class DeleteGroupPayload(BaseModel):
671
+ delete_group_res: TextResult = Field(
672
+ ...,
673
+ alias="deleteGroupRes",
674
+ serialization_alias="deleteGroupRes",
675
+ description="Base64 encoded deletion result",
676
+ )
677
+
678
+
679
+ class DeleteGroupResponse(XFYunResponse[DeleteGroupPayload]): ...
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from audex.exceptions import AudexError
4
+
5
+
6
+ class WebsocketError(AudexError, RuntimeError):
7
+ __slots__ = ()
8
+ default_message = "A WebSocket error occurred"