@@ -45,6 +45,7 @@ <h1>Source code for speechmatics.batch_client</h1><div class="highlight"><pre>
4545
4646< span class ="kn "> import</ span > < span class ="nn "> httpx</ span >
4747< span class ="kn "> from</ span > < span class ="nn "> polling2</ span > < span class ="kn "> import</ span > < span class ="n "> poll</ span >
48+ < span class ="kn "> from</ span > < span class ="nn "> tenacity</ span > < span class ="kn "> import</ span > < span class ="n "> retry</ span > < span class ="p "> ,</ span > < span class ="n "> retry_if_exception_type</ span > < span class ="p "> ,</ span > < span class ="n "> stop_after_attempt</ span >
4849
4950< span class ="kn "> from</ span > < span class ="nn "> speechmatics.exceptions</ span > < span class ="kn "> import</ span > < span class ="n "> JobNotFoundException</ span > < span class ="p "> ,</ span > < span class ="n "> TranscriptionError</ span >
5051< span class ="kn "> from</ span > < span class ="nn "> speechmatics.helpers</ span > < span class ="kn "> import</ span > < span class ="n "> get_version</ span >
@@ -199,11 +200,19 @@ <h1>Source code for speechmatics.batch_client</h1><div class="highlight"><pre>
199200
200201< span class ="sd "> :raises httpx.HTTPError: When a request fails, raises an HTTPError</ span >
201202< span class ="sd "> """</ span >
203+
202204 < span class ="c1 "> # pylint: disable=no-member</ span >
203- < span class ="k "> with</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> api_client</ span > < span class ="o "> .</ span > < span class ="n "> stream</ span > < span class ="p "> (</ span > < span class ="n "> method</ span > < span class ="p "> ,</ span > < span class ="n "> path</ span > < span class ="p "> ,</ span > < span class ="o "> **</ span > < span class ="n "> kwargs</ span > < span class ="p "> )</ span > < span class ="k "> as</ span > < span class ="n "> response</ span > < span class ="p "> :</ span >
204- < span class ="n "> response</ span > < span class ="o "> .</ span > < span class ="n "> read</ span > < span class ="p "> ()</ span >
205- < span class ="n "> response</ span > < span class ="o "> .</ span > < span class ="n "> raise_for_status</ span > < span class ="p "> ()</ span >
206- < span class ="k "> return</ span > < span class ="n "> response</ span > </ div >
205+ < span class ="nd "> @retry</ span > < span class ="p "> (</ span >
206+ < span class ="n "> stop</ span > < span class ="o "> =</ span > < span class ="n "> stop_after_attempt</ span > < span class ="p "> (</ span > < span class ="mi "> 2</ span > < span class ="p "> ),</ span >
207+ < span class ="n "> retry</ span > < span class ="o "> =</ span > < span class ="n "> retry_if_exception_type</ span > < span class ="p "> (</ span > < span class ="n "> httpx</ span > < span class ="o "> .</ span > < span class ="n "> RemoteProtocolError</ span > < span class ="p "> ),</ span >
208+ < span class ="p "> )</ span >
209+ < span class ="k "> def</ span > < span class ="nf "> send</ span > < span class ="p "> ():</ span >
210+ < span class ="k "> with</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> api_client</ span > < span class ="o "> .</ span > < span class ="n "> stream</ span > < span class ="p "> (</ span > < span class ="n "> method</ span > < span class ="p "> ,</ span > < span class ="n "> path</ span > < span class ="p "> ,</ span > < span class ="o "> **</ span > < span class ="n "> kwargs</ span > < span class ="p "> )</ span > < span class ="k "> as</ span > < span class ="n "> response</ span > < span class ="p "> :</ span >
211+ < span class ="n "> response</ span > < span class ="o "> .</ span > < span class ="n "> read</ span > < span class ="p "> ()</ span >
212+ < span class ="n "> response</ span > < span class ="o "> .</ span > < span class ="n "> raise_for_status</ span > < span class ="p "> ()</ span >
213+ < span class ="k "> return</ span > < span class ="n "> response</ span >
214+
215+ < span class ="k "> return</ span > < span class ="n "> send</ span > < span class ="p "> ()</ span > </ div >
207216
208217< div class ="viewcode-block " id ="BatchClient.list_jobs "> < a class ="viewcode-back " href ="../../batch_client.html#speechmatics.batch_client.BatchClient.list_jobs "> [docs]</ a > < span class ="k "> def</ span > < span class ="nf "> list_jobs</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="n "> List</ span > < span class ="p "> [</ span > < span class ="n "> Dict</ span > < span class ="p "> [</ span > < span class ="nb "> str</ span > < span class ="p "> ,</ span > < span class ="n "> Any</ span > < span class ="p "> ]]:</ span >
209218< span class ="w "> </ span > < span class ="sd "> """</ span >
@@ -256,28 +265,39 @@ <h1>Source code for speechmatics.batch_client</h1><div class="highlight"><pre>
256265 < span class ="p "> )</ span >
257266
258267 < span class ="c1 "> # If audio=None, fetch_data must be specified</ span >
259- < span class ="k "> if</ span > < span class ="n "> audio</ span > < span class ="ow "> and</ span > < span class ="s2 "> "fetch_data"</ span > < span class ="ow "> in</ span > < span class ="n "> config_dict</ span > < span class ="p "> :</ span >
260- < span class ="k "> raise</ span > < span class ="ne "> ValueError</ span > < span class ="p "> (</ span > < span class ="s2 "> "Only one of audio or fetch_data can be set at a time"</ span > < span class ="p "> )</ span >
261- < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> audio</ span > < span class ="ow "> and</ span > < span class ="s2 "> "fetch_data"</ span > < span class ="ow "> in</ span > < span class ="n "> config_dict</ span > < span class ="p "> :</ span >
262- < span class ="n "> audio_data</ span > < span class ="o "> =</ span > < span class ="kc "> None</ span >
263- < span class ="k "> elif</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> audio</ span > < span class ="p "> ,</ span > < span class ="p "> (</ span > < span class ="nb "> str</ span > < span class ="p "> ,</ span > < span class ="n "> os</ span > < span class ="o "> .</ span > < span class ="n "> PathLike</ span > < span class ="p "> )):</ span >
264- < span class ="k "> with</ span > < span class ="n "> Path</ span > < span class ="p "> (</ span > < span class ="n "> audio</ span > < span class ="p "> )</ span > < span class ="o "> .</ span > < span class ="n "> expanduser</ span > < span class ="p "> ()</ span > < span class ="o "> .</ span > < span class ="n "> open</ span > < span class ="p "> (</ span > < span class ="s2 "> "rb"</ span > < span class ="p "> )</ span > < span class ="k "> as</ span > < span class ="n "> file</ span > < span class ="p "> :</ span >
265- < span class ="n "> audio_data</ span > < span class ="o "> =</ span > < span class ="n "> os</ span > < span class ="o "> .</ span > < span class ="n "> path</ span > < span class ="o "> .</ span > < span class ="n "> basename</ span > < span class ="p "> (</ span > < span class ="n "> file</ span > < span class ="o "> .</ span > < span class ="n "> name</ span > < span class ="p "> ),</ span > < span class ="n "> file</ span > < span class ="o "> .</ span > < span class ="n "> read</ span > < span class ="p "> ()</ span >
266- < span class ="k "> elif</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> audio</ span > < span class ="p "> ,</ span > < span class ="nb "> tuple</ span > < span class ="p "> )</ span > < span class ="ow "> and</ span > < span class ="s2 "> "fetch_data"</ span > < span class ="ow "> not</ span > < span class ="ow "> in</ span > < span class ="n "> config_dict</ span > < span class ="p "> :</ span >
267- < span class ="n "> audio_data</ span > < span class ="o "> =</ span > < span class ="n "> audio</ span >
268- < span class ="k "> else</ span > < span class ="p "> :</ span >
269- < span class ="k "> raise</ span > < span class ="ne "> ValueError</ span > < span class ="p "> (</ span > < span class ="s2 "> "Audio must be a filepath or a tuple of (filename, bytes)"</ span > < span class ="p "> )</ span >
268+ < span class ="n "> file_object</ span > < span class ="o "> =</ span > < span class ="kc "> None</ span >
269+ < span class ="k "> try</ span > < span class ="p "> :</ span >
270+ < span class ="k "> if</ span > < span class ="n "> audio</ span > < span class ="ow "> and</ span > < span class ="s2 "> "fetch_data"</ span > < span class ="ow "> in</ span > < span class ="n "> config_dict</ span > < span class ="p "> :</ span >
271+ < span class ="k "> raise</ span > < span class ="ne "> ValueError</ span > < span class ="p "> (</ span > < span class ="s2 "> "Only one of audio or fetch_data can be set at a time"</ span > < span class ="p "> )</ span >
272+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> audio</ span > < span class ="ow "> and</ span > < span class ="s2 "> "fetch_data"</ span > < span class ="ow "> in</ span > < span class ="n "> config_dict</ span > < span class ="p "> :</ span >
273+ < span class ="n "> audio_data</ span > < span class ="o "> =</ span > < span class ="kc "> None</ span >
274+ < span class ="k "> elif</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> audio</ span > < span class ="p "> ,</ span > < span class ="p "> (</ span > < span class ="nb "> str</ span > < span class ="p "> ,</ span > < span class ="n "> os</ span > < span class ="o "> .</ span > < span class ="n "> PathLike</ span > < span class ="p "> )):</ span >
275+ < span class ="c1 "> # httpx performance is better when using a file-like object</ span >
276+ < span class ="c1 "> # compared to passing the file contents as bytes.</ span >
277+ < span class ="n "> file_object</ span > < span class ="o "> =</ span > < span class ="n "> Path</ span > < span class ="p "> (</ span > < span class ="n "> audio</ span > < span class ="p "> )</ span > < span class ="o "> .</ span > < span class ="n "> expanduser</ span > < span class ="p "> ()</ span > < span class ="o "> .</ span > < span class ="n "> open</ span > < span class ="p "> (</ span > < span class ="s2 "> "rb"</ span > < span class ="p "> )</ span >
278+ < span class ="n "> audio_data</ span > < span class ="o "> =</ span > < span class ="n "> os</ span > < span class ="o "> .</ span > < span class ="n "> path</ span > < span class ="o "> .</ span > < span class ="n "> basename</ span > < span class ="p "> (</ span > < span class ="n "> file_object</ span > < span class ="o "> .</ span > < span class ="n "> name</ span > < span class ="p "> ),</ span > < span class ="n "> file_object</ span >
279+ < span class ="k "> elif</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> audio</ span > < span class ="p "> ,</ span > < span class ="nb "> tuple</ span > < span class ="p "> )</ span > < span class ="ow "> and</ span > < span class ="s2 "> "fetch_data"</ span > < span class ="ow "> not</ span > < span class ="ow "> in</ span > < span class ="n "> config_dict</ span > < span class ="p "> :</ span >
280+ < span class ="n "> audio_data</ span > < span class ="o "> =</ span > < span class ="n "> audio</ span >
281+ < span class ="k "> else</ span > < span class ="p "> :</ span >
282+ < span class ="k "> raise</ span > < span class ="ne "> ValueError</ span > < span class ="p "> (</ span >
283+ < span class ="s2 "> "Audio must be a filepath or a tuple of (filename, bytes)"</ span >
284+ < span class ="p "> )</ span >
270285
271- < span class ="c1 "> # httpx seems to expect an un-nested json, throws a type error otherwise.</ span >
272- < span class ="n "> config_data</ span > < span class ="o "> =</ span > < span class ="p "> {</ span > < span class ="s2 "> "config"</ span > < span class ="p "> :</ span > < span class ="n "> json</ span > < span class ="o "> .</ span > < span class ="n "> dumps</ span > < span class ="p "> (</ span > < span class ="n "> config_dict</ span > < span class ="p "> ,</ span > < span class ="n "> ensure_ascii</ span > < span class ="o "> =</ span > < span class ="kc "> False</ span > < span class ="p "> )}</ span >
286+ < span class ="c1 "> # httpx seems to expect an un-nested json, throws a type error otherwise.</ span >
287+ < span class ="n "> config_data</ span > < span class ="o "> =</ span > < span class ="p "> {</ span > < span class ="s2 "> "config"</ span > < span class ="p "> :</ span > < span class ="n "> json</ span > < span class ="o "> .</ span > < span class ="n "> dumps</ span > < span class ="p "> (</ span > < span class ="n "> config_dict</ span > < span class ="p "> ,</ span > < span class ="n "> ensure_ascii</ span > < span class ="o "> =</ span > < span class ="kc "> False</ span > < span class ="p "> )}</ span >
273288
274- < span class ="k "> if</ span > < span class ="n "> audio_data</ span > < span class ="p "> :</ span >
275- < span class ="n "> audio_file</ span > < span class ="o "> =</ span > < span class ="p "> {</ span > < span class ="s2 "> "data_file"</ span > < span class ="p "> :</ span > < span class ="n "> audio_data</ span > < span class ="p "> }</ span >
276- < span class ="k "> else</ span > < span class ="p "> :</ span >
277- < span class ="n "> audio_file</ span > < span class ="o "> =</ span > < span class ="n "> _ForceMultipartDict</ span > < span class ="p "> ()</ span >
289+ < span class ="k "> if</ span > < span class ="n "> audio_data</ span > < span class ="p "> :</ span >
290+ < span class ="n "> audio_file</ span > < span class ="o "> =</ span > < span class ="p "> {</ span > < span class ="s2 "> "data_file"</ span > < span class ="p "> :</ span > < span class ="n "> audio_data</ span > < span class ="p "> }</ span >
291+ < span class ="k "> else</ span > < span class ="p "> :</ span >
292+ < span class ="n "> audio_file</ span > < span class ="o "> =</ span > < span class ="n "> _ForceMultipartDict</ span > < span class ="p "> ()</ span >
278293
279- < span class ="n "> response</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> send_request</ span > < span class ="p "> (</ span > < span class ="s2 "> "POST"</ span > < span class ="p "> ,</ span > < span class ="s2 "> "jobs"</ span > < span class ="p "> ,</ span > < span class ="n "> data</ span > < span class ="o "> =</ span > < span class ="n "> config_data</ span > < span class ="p "> ,</ span > < span class ="n "> files</ span > < span class ="o "> =</ span > < span class ="n "> audio_file</ span > < span class ="p "> )</ span >
280- < span class ="k "> return</ span > < span class ="n "> response</ span > < span class ="o "> .</ span > < span class ="n "> json</ span > < span class ="p "> ()[</ span > < span class ="s2 "> "id"</ span > < span class ="p "> ]</ span > </ div >
294+ < span class ="n "> response</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> send_request</ span > < span class ="p "> (</ span >
295+ < span class ="s2 "> "POST"</ span > < span class ="p "> ,</ span > < span class ="s2 "> "jobs"</ span > < span class ="p "> ,</ span > < span class ="n "> data</ span > < span class ="o "> =</ span > < span class ="n "> config_data</ span > < span class ="p "> ,</ span > < span class ="n "> files</ span > < span class ="o "> =</ span > < span class ="n "> audio_file</ span >
296+ < span class ="p "> )</ span >
297+ < span class ="k "> return</ span > < span class ="n "> response</ span > < span class ="o "> .</ span > < span class ="n "> json</ span > < span class ="p "> ()[</ span > < span class ="s2 "> "id"</ span > < span class ="p "> ]</ span >
298+ < span class ="k "> finally</ span > < span class ="p "> :</ span >
299+ < span class ="k "> if</ span > < span class ="n "> file_object</ span > < span class ="p "> :</ span >
300+ < span class ="n "> file_object</ span > < span class ="o "> .</ span > < span class ="n "> close</ span > < span class ="p "> ()</ span > </ div >
281301
282302 < span class ="k "> def</ span > < span class ="nf "> submit_jobs</ span > < span class ="p "> (</ span >
283303 < span class ="bp "> self</ span > < span class ="p "> ,</ span >
0 commit comments