рдореБрдЦреНрдп рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЬрд╛рдПрдБ

OpenAI рдХреА Audio API: рдПрдХ рдЧрд╛рдЗрдб рдФрд░ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ

OpenAI рдХреЗ рдирд╡реАрдирддрдо рдСрдбрд┐рдпреЛ рдореЙрдбрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЙрдЗрд╕-рдЯреВ-рд╡реЙрдЗрд╕ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдмрдирд╛рдирд╛ рд╕реАрдЦреЗрдВ рдФрд░ Agents API рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВред
┬╖ 12 рдорд┐ре░ рдкрдврд╝реЗрдВ

AI рдХреЗ рд╕рд╛рде рдЦреЛрдЬреЗрдВ

OpenAI рдиреЗ рдЕрдкрдиреА рдЕрдЧрд▓реА рдкреАрдврд╝реА рдХреЗ рдСрдбрд┐рдпреЛ рдореЙрдбрд▓ рдкреЗрд╢ рдХрд┐рдП рд╣реИрдВ рдЬреЛ рд╕реНрдкреАрдЪ-рдЯреВ-рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ-рдЯреВ-рд╕реНрдкреАрдЪ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИрдВред рдпреЗ рдирд╡реАрдирддрдо рдореЙрдбрд▓ рдЬрдЯрд┐рд▓ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВтАФрдЬреИрд╕реЗ рдЙрдЪреНрдЪрд╛рд░рдг рдпрд╛ рд╢реЛрд░ рд╡рд╛рд▓реЗ рдорд╛рд╣реМрд▓тАФрдореЗрдВ рднреА рдмреЗрд╣рддрд░ рд╕рдЯреАрдХрддрд╛ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рдирдпреЛрдЧреНрдп рд╡реЙрдпрд╕ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рдореИрдВ рдЪрд░рдг-рджрд░-рдЪрд░рдг рд╕рдордЭрд╛рдКрдБрдЧрд╛ рдХрд┐ рдЗрди рдирдП OpenAI рдСрдбрд┐рдпреЛ рдореЙрдбрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЙрдпрд╕-рдЯреВ-рд╡реЙрдпрд╕ AI рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рдРрд╕рд╛ AI рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдмреЛрд▓реЗ рдЧрдП рдЗрдирдкреБрдЯ рдХреЛ рд╕рдордЭреЗ рдФрд░ рдЖрдкрдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬрд╝рд░реВрд░рддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдЖрд╡рд╛рдЬрд╝ рдореЗрдВ рдЬрд╡рд╛рдм рджреЗред

OpenAI Audio API

OpenAI рдХреЗ рдЗрд╕ рдирдП рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рддреАрди рдореЙрдбрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  1. gpt-4o-mini-tts: рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ-рдЯреВ-рдСрдбрд┐рдпреЛ рдореЙрдбрд▓ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдЯреЛрди рдФрд░ рдЖрд╡рд╛рдЬрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдСрдбрд┐рдпреЛ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдЗрд╕ рдЯреЗрдХреНрд╕реНрдЯ-рдЯреВ-рд╕реНрдкреАрдЪ рдореЙрдбрд▓ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╡рд┐рд╢реЗрд╖ рдЯреЗрдХреНрд╕реНрдЯ рдирд┐рд░реНрджреЗрд╢ рджреЗрдХрд░ рдЖрд╡рд╛рдЬрд╝ рдХреЗ рдЯреЛрди рдФрд░ рд╢реИрд▓реА рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХрд╛ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝реЗрд╢рди рд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдиреЛрдЦреЗ рдФрд░ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рддреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╡реЙрдпрд╕ рдЕрдиреБрднрд╡ рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдЖрдк OpenAI.fm рдкрд░ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВред
  2. ┬аgpt-4o-transcribe рдФрд░ gpt-4o-mini-transcribe: рджреЛ рдСрдбрд┐рдпреЛ-рдЯреВ-рдЯреЗрдХреНрд╕реНрдЯ рдореЙрдбрд▓ рдЬреЛ рдмреЛрд▓реА рдЧрдИ рднрд╛рд╖рд╛ рдХреЛ рд▓рд┐рдЦрд┐рдд рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рд╣реИрдВред рдЗрдирдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдСрдбрд┐рдпреЛ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рдЯреАрдХ рдФрд░ рднрд░реЛрд╕реЗрдордВрдж рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред рдЗрди рдореЙрдбрд▓реЛрдВ рдореЗрдВ рд╡рд░реНрдб рдПрд░рд░ рд░реЗрдЯ (WER) рдХрдо рджрд┐рдЦрддреА рд╣реИ, рдпрд╛рдиреА рдпреЗ рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЛрд▓реЗ рдЧрдП рд╢рдмреНрджреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рдХрдо рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддреЗ рд╣реИрдВред

OpenAI рдСрдбрд┐рдпреЛ API рдореЗрдВ рдЕрдЧрд▓реА рдкреАрдврд╝реА рдХреЗ рдореЙрдбрд▓: gpt-4o mini TTS, gpt-4o mini transcribe, рдФрд░ gpt-4o transcribe

рдЗрди рдирдП рдореЙрдбрд▓реЛрдВ рдХреА рдХреАрдорддреЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:

OpenAI рдСрдбрд┐рдпреЛ API рдХреА рдХреАрдорддреЗрдВ

рд╡реЙрдпрд╕ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рд╕реАрдзреЗ рдЖрдкрдХреЗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ AI рд╡реЙрдпрд╕ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдмрдирд╛рдирд╛ рд╕рд┐рдЦрд╛рдКрдБрдЧрд╛ред рдпрд╣ рд╡реЙрдпрд╕ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдЯреЗрдХреНрд╕реНрдЯ-рдЖрдзрд╛рд░рд┐рдд AI рдореЙрдбрд▓ рдХреА рддрд░рд╣ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЛрд▓реЗ рдЧрдП рд╕рдВрд╡рд╛рдж рдХреЗ рдЬрд╝рд░рд┐рдП рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░реЗрдЧрд╛ред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЖрдк рд╕реАрдзреЗ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рдмрд╛рдд рдХрд░ рд╕рдХреЗрдВ, рдХреЛрдИ рднреА рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВ рдФрд░ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдЖрд╡рд╛рдЬрд╝ рдореЗрдВ рдЬрд╡рд╛рдм рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдкреНрд░рднрд╛рд╡реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рд╣рдо рдЖрдкрдХреЗ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рд╕реЗ рдЖрдкрдХреЗ рдмреЛрд▓реЗ рд╣реБрдП рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рд░рд┐рдХреЙрд░реНрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрдиреНрдирдд рд╕реНрдкреАрдЪ-рдЯреВ-рдЯреЗрдХреНрд╕реНрдЯ рдореЙрдбрд▓реНрд╕ рдХреА рдорджрдж рд╕реЗ рдЗрд╕ рдСрдбрд┐рдпреЛ рдЗрдирдкреБрдЯ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗред

рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдЯреЗрдХреНрд╕реНрдЯ рдПрдХ рдмрдбрд╝реЗ рднрд╛рд╖рд╛ рдореЙрдбрд▓ рдореЗрдВ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХреЗред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдСрдбрд┐рдпреЛ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ, рдЬрд┐рд╕рд╕реЗ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдЖрдкрдХреЛ рдЙрддреНрддрд░ тАЬрдмреЛрд▓тАЭ рд╕рдХреЗред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╣рд░ рдЪрд░рдг рдХреЛ рдЗрд╕ рддрд░рд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╡реЙрдпрд╕ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рд╕рдЯреАрдХ рдФрд░ рдЖрдХрд░реНрд╖рдХ рджреЛрдиреЛрдВ рд╣реЛред

OpenAI рдСрдбрд┐рдпреЛ рдореЙрдбрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдСрдбрд┐рдпреЛ-рдЯреВ-рдСрдбрд┐рдпреЛ рдЪреЗрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░

рднрд▓реЗ рд╣реА OpenAI рдПрдХ рд╕рдорд░реНрдкрд┐рдд Realtime API рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдо рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХрд╛ рдЕрдкрдирд╛рдПрдБрдЧреЗред Realtime API рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИ рдФрд░ рддреЗрдЬрд╝ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдЪрд╛рд╣рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдХреНрд╕рд░ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХрдо рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдЪреБрдирд╛рд╡ рдХрд░рдХреЗ, рд╣рдореЗрдВ рдЕрдкрдиреЗ AI рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдХреЛ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рддрд░реАрдХрд╛ рд╣рдореЗрдВ рддрдп рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдореЙрдбрд▓ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рд╣реИрдВтАФрдЪрд╛рд╣реЗ рд▓рдХреНрд╖реНрдп рд╕рдЯреАрдХрддрд╛ рд╣реЛ, рдЧрддрд┐ рд╣реЛ, рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЯреЛрди рдХреА рдкрд╕рдВрджред рдЗрд╕ рддрд░рд╣ рд╣рдорд╛рд░рд╛ рд╡реЙрдпрд╕ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдХреЗрд╡рд▓ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рднреА рдмрдирддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХреЗред

рдпрд╣рд╛рдБ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд╛рд░рд╛ рдХреЛрдб рдЗрд╕ GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред┬а

Python рд╕реЗрдЯрдЕрдк

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ audio-demo рдирд╛рдордХ рдПрдХ рдирдпрд╛ Anaconda рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред Anaconda рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдкреЗрд╕ рдмрдирд╛рдиреЗ рджреЗрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд╣рдо рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрд╢рди рдмрд┐рдирд╛ рдЯрдХрд░рд╛рд╡ рдХреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:

conda create -n audio-demo -y python=3.9
conda activate audio-demo
pip install openai
pip install numpy
pip install dotenv
pip install sounddevice
pip install scipy

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдФрд░ рдкреИрдХреЗрдЬ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:

  1. рдПрдиреНрд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рдирд╛:
  • conda create -n audio-demo -y python=3.9: рдпрд╣ рдХрдорд╛рдВрдб audio-demo рдирд╛рдо рдХрд╛ рдирдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдг Python 3.9 рдХреЗ рд╕рд╛рде рдмрдирд╛рддрд╛ рд╣реИред -y рдлрд╝реНрд▓реИрдЧ рдмрд┐рдирд╛ рдкреВрдЫреЗ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЛ рдордВрдЬрд╝реВрд░реА рджреЗрддрд╛ рд╣реИред
  1. рдПрдиреНрд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╕рдХреНрд░рд┐рдп рдХрд░рдирд╛:
  • conda activate audio-demo: рдирдП рдмрдирд╛рдП рдЧрдП audio-demo рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реА рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХреЗрдВред
  1. рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛:
  • pip install openai: OpenAI рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛ OpenAI рдХреЗ рдореЙрдбрд▓реНрд╕ рдФрд░ APIs рддрдХ рдЖрд╕рд╛рди рдкрд╣реБрдБрдЪ рджреЗрддреА рд╣реИред
  • pip install numpy: NumPy рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред
  • pip install dotenv: Dotenv .env рдлрд╝рд╛рдЗрд▓ рд╕реЗ environment variables рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрди рдЖрд╕рд╛рди рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред
  • pip install sounddevice: Sounddevice рд╕рд░рд▓ рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдзреНрд╡рдирд┐ рд░рд┐рдХреЙрд░реНрдб рдФрд░ рдкреНрд▓реЗ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рдЬреЛ Python рдореЗрдВ рдСрдбрд┐рдпреЛ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИред
  • pip install scipy: SciPy, NumPy рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд╡ рддрдХрдиреАрдХреА рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред

рд╣рдорд╛рд░рд╛ audio-demo рд╡рд╛рддрд╛рд╡рд░рдг рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдРрд╕реЗ AI рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдСрдбрд┐рдпреЛ рдЗрдирдкреБрдЯреНрд╕ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХреЗред рдпрд╣ рд╕рдВрд░рдЪрд┐рдд рд╕реЗрдЯрдЕрдк рд╕реНрд╡рдЪреНрдЫ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╕реНрдкреЗрд╕ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВред

OpenAI API рдХреА рдХреБрдВрдЬреА рд╕реЗрдЯрдЕрдк

OpenAI API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ API рдХреБрдВрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрдирдХреЗ API рдХреА-рдкреЗрдЬ рдкрд░ рдЬрд╛рдПрдБ рдФрд░ "Generate new secret key" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдПрдХ API рдХреБрдВрдЬреА рдмрдирд╛рдПрдВред рдХреБрдВрдЬреА рдХреЙрдкреА рдХрд░реЗрдВ, .env рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ, рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ:

OPENAI_API_KEY=<paste_your_api_key_here>

рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдСрдбрд┐рдпреЛ рдЙрджрд╛рд╣рд░рдг

рдЖрдЗрдП рдПрдХ Python рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдЪрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд╝рд░рддреЗ рд╣реИрдВ рдЬреЛ OpenAI рдХреА рдЯреЗрдХреНрд╕реНрдЯ-рдЯреВ-рдСрдбрд┐рдпреЛ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдирд┐рдЬреА рд╕реНрдкрд░реНрд╢ рдХреЗ рд╕рд╛рде рд╕реНрдкреАрдЪ рдореЗрдВ рдмрджрд▓рддреА рд╣реИред рд╣рдо рдЕрдкрдирд╛ рдХреЛрдб text_to_audio.py рдирд╛рдордХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬреЛ .env рдлрд╝рд╛рдЗрд▓ рд╡рд╛рд▓реЗ рдЙрд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реЛрдЧреАред

рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░реЗрдВ

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рдиреА рд╣реЛрдВрдЧреА:

import asyncio
from openai import AsyncOpenAI
from openai.helpers import LocalAudioPlayer
from dotenv import load_dotenv

рдЖрдЗрдП рдЬрд▓реНрджреА рд╕реЗ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрдореНрдкреЛрд░реНрдЯ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:

  • asyncio: Python рдореЗрдВ asynchronous рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдЬреЛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ APIs рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЬрд╝рд░реВрд░реА рд╣реИред
  • AsyncOpenAI: OpenAI рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛, рдЬреЛ OpenAI рдХреЗ APIs рдХреЗ рд╕рд╛рде asynchronous рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдЯреВрд▓ рджреЗрддрд╛ рд╣реИред
  • LocalAudioPlayer: OpenAI рдХрд╛ рдпрд╣ рд╣реЗрд▓реНрдкрд░ рд╣рдореЗрдВ рдЕрдкрдиреА рдорд╢реАрди рдкрд░ рд▓реЛрдХрд▓реА рдСрдбрд┐рдпреЛ рдкреНрд▓реЗ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
  • load_dotenv: .env рдлрд╝рд╛рдЗрд▓ рд╕реЗ environment variables рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рд╣рдо рдЕрдкрдиреЗ API рдХреА рдЬреИрд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡рд┐рд╡рд░рдг рд░рдЦрддреЗ рд╣реИрдВред

рдПрдиреНрд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рд▓реЛрдб рдХрд░реЗрдВ

рдЕрдЧрд▓рд╛ рдХрджрдо рд╣реИ load_dotenv рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде .env рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╣рдорд╛рд░реА API рдХреБрдВрдЬреА рд▓реЛрдб рдХрд░рдирд╛:

load_dotenv()

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ API рдХреБрдВрдЬреА рддрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдБрдЪ рдорд┐рд▓реЗред

OpenAI рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ

OpenAI API рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо AsyncOpenAI рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБрдЧреЗ:

openai = AsyncOpenAI()

рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ

рдЕрдм рд╣рдо рдЕрдкрдирд╛ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди text_to_audio() рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ OpenAI рдХреА рдЯреЗрдХреНрд╕реНрдЯ-рдЯреВ-рдСрдбрд┐рдпреЛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдирдкреБрдЯ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдСрдбрд┐рдпреЛ рдкреНрд▓реЗ рдХрд░реЗрдЧрд╛:

async def text_to_audio(text, tone_and_style_instructions):
  async with openai.audio.speech.with_streaming_response.create(
    model="gpt-4o-mini-tts",
    voice="coral",
    input=text,
    instructions=tone_and_style_instructions,
    response_format="pcm",
  ) as response:
    await LocalAudioPlayer().play(response)

рдЖрдЗрдП рдЬрд▓реНрджреА рд╕реЗ рд╕рдордЭ рд▓реЗрдВ рдХрд┐ рдКрдкрд░ рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛:

  • рд╣рдо рд╕реНрдкреАрдЪ рд╕рд┐рдВрдереЗрд╕рд┐рд╕ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП model рдФрд░ voice рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ model gpt-4o-mini-tts рд╣реИ рдФрд░ рдЪреБрдиреА рдЧрдИ рдЖрд╡рд╛рдЬрд╝ "coral" рд╣реИред
  • response_format рдХреЛ "pcm" рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдСрдбрд┐рдпреЛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред
  • LocalAudioPlayer рддрдм API рджреНрд╡рд╛рд░рд╛ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдСрдбрд┐рдпреЛ рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдХреЛ рдкреНрд▓реЗ рдХрд░рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ text_to_audio() рдлрд╝рдВрдХреНрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ:

if __name__ == "__main__":
  asyncio.run(text_to_audio("Hello world!", "Enthusiastic voice."))

рдпрд╣ рдХреЛрдб рдмреНрд▓реЙрдХ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓ рд░рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ asynchronous рд▓реЙрдЬрд┐рдХ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП asyncio.run() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП text_to_audio() рдЪрд▓рд╛рддрд╛ рд╣реИред

рдЗрди рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ OpenAI рдХреА рдЯреЗрдХреНрд╕реНрдЯ-рдЯреВ-рдСрдбрд┐рдпреЛ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рдХреЛ рд╕реНрдкреАрдЪ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдпрд╣ рд╕реЗрдЯрдЕрдк рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдирдкреБрдЯреНрд╕ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдзреНрд╡рдирд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреАрд╡рдВрдд рд╣реЛ рдЙрдарддрд╛ рд╣реИред

рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рдореНрди рдХрдорд╛рдВрдб рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

python text_to_audio.py

рдкреВрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдБ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдСрдбрд┐рдпреЛ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди

рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рдЖрдЗрдП OpenAI рдХреЗ рдСрдбрд┐рдпреЛ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдирд╛ рд╕реАрдЦреЗрдВред рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддреЗрдЬрд╝ рдФрд░ рдХреБрд╢рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ asynchronous рдврдВрдЧ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИред рд╣рдо рдЗрд╕реЗ audio_to_text.py рдирд╛рдордХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред

рдЗрдореНрдкреЛрд░реНрдЯреНрд╕ рдФрд░ рд╢реБрд░реБрдЖрддреА рд╕реЗрдЯрдЕрдк рдкрд╣рд▓реЗ рдЬреИрд╕реЗ рд╣реА рд╣реИрдВ, рдмрд╕ рдпрд╣рд╛рдБ рд╣рдореЗрдВ LocalAudioPlayer рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

async def transcribe_audio(audio_filename = "audio.wav"):
  audio_file = await asyncio.to_thread(open, audio_filename, "rb")
  stream = await openai.audio.transcriptions.create(
    model="gpt-4o-mini-transcribe",
    file=audio_file,
    response_format="text",
    stream=True,
  )
  transcript = ""
  async for event in stream:
    if event.type == "transcript.text.delta":
      print(event.delta, end="", flush=True)
      transcript += event.delta
  print()
  audio_file.close()
  return transcript

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЖрдЗрдП рд╕рдордЭрддреЗ рд╣реИрдВ:

  1. рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдирд╛:
  • audio_file = await asyncio.to_thread(open, audio_filename, "rb"): рдпрд╣ рдкрдВрдХреНрддрд┐ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрд╛рдЗрдирд░реА рд░реАрдб рдореЛрдб ("rb") рдореЗрдВ рдЦреЛрд▓рддреА рд╣реИред asyncio.to_thread() рдореЗрдердб рдЗрд╕ рдлрд╝рд╛рдЗрд▓-рдЦреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрд╢рди рдХреЛ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдЪрд▓рдиреЗ рджреЗрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрдиреНрдп рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рди рдХрд░реЗред
  1. рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдирд╛:
  • stream = await openai.audio.transcriptions. create(...): рдпрд╣ рдкрдВрдХреНрддрд┐ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди API рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИред┬а
  • рд╣рдо model рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ gpt-4o-mini-transcribe рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЦрд╛рд╕ рддреМрд░ рдкрд░ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • file рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╣рдорд╛рд░реА рдУрдкрди рдХреА рдЧрдИ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдЬрд╛рддреА рд╣реИред
  • response_format="text" API рдХреЛ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
  • stream=True рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рд░реАрдпрд▓-рдЯрд╛рдЗрдо рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛рдиреА рдЬреИрд╕реЗ рд╣реА рдСрдбрд┐рдпреЛ рдХрд╛ рдХреЛрдИ рд╣рд┐рд╕реНрд╕рд╛ рдкреНрд░реЛрд╕реЗрд╕ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╣ рддреБрд░рдВрдд рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреЗрдЬрд╝ рд╣реЛ рдЬрд╛рддреА рд╣реИред
  1. рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рд╕реНрдЯреНрд░реАрдо рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдирд╛:
  • async for event in stream: рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЖрддреЗ рд╣реБрдП рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реВрдк рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
  • if event.type == "transcript.text.delta":: рд╣рд░ рдЗрд╡реЗрдВрдЯ рдЯрд╛рдЗрдк рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рддрдм рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЯрд╛рдЗрдк transcript.text.delta рд╣реЛ, рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рддреИрдпрд╛рд░ рд╣реИред
  • print(event.delta, end="", flush=True): рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реА рдХреНрд░рдорд┐рдХ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд░реАрдпрд▓-рдЯрд╛рдЗрдо рдореЗрдВ рдорд┐рд▓реЗред
  1. рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдмрдВрдж рдХрд░рдирд╛:
  • audio_file.close(): рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрди рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред

main() рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛рдХрд░, рд╣рдо рдХрд┐рд╕реА рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреНрд░реАрдореНрдб рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рддреБрд░рдВрдд рдлреАрдбрдмреИрдХ рдорд┐рд▓ рд╕рдХреЗред рдпрд╣ рд╕реЗрдЯрдЕрдк рддреЗрдЬрд╝ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╛ рд▓рдВрдмреА рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИред

рдЖрдк рдЗрд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рд░рдЦрдХрд░, audio.wav рдХреЛ рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рд╕реЗ рдмрджрд▓рдХрд░ рдФрд░ рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ:

python audio_to_text.py

рдкреВрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдБ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рд╕реЗ рдСрдбрд┐рдпреЛ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди

рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рд╡реЙрдпрд╕ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдмрдирд╛рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдСрдбрд┐рдпреЛ рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЛ рдПрдХ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдо record.py рдирд╛рдо рдХреА рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБрдЧреЗ рдЬрд┐рд╕рдореЗрдВ record_audio рдирд╛рдо рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рд╕реЗ рдзреНрд╡рдирд┐ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдЬрд╛рдПрдБрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рдлреЛрдХрд╕ рдирд╣реАрдВ рд╣реИ:

import sounddevice as sd
import numpy as np
import scipy.io.wavfile as wavfile

SAMPLE_RATE = 44100  # Sample rate in Hz

def record_audio():
    print("[INFO: Recording... Press <Enter> to stop]")
    audio_data = []  # Initialize a list to store audio frames
    def callback(indata, frames, time, status):
        audio_data.append(indata.copy())
    with sd.InputStream(samplerate=SAMPLE_RATE, channels=1, callback=callback, dtype='int16'):
        input()  # Wait for the user to press Enter to stop recording
    print("[INFO: Recording complete]")
    print()
    audio_data = np.concatenate(audio_data)  # Concatenate the list into a single array
    filename = "output.wav"
    wavfile.write(filename, SAMPLE_RATE, audio_data)
    return audio_data

рдЬрдм рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рд╕реЗ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред рдпрд╣ рддрдм рддрдХ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "Enter" рдирд╣реАрдВ рджрдмрд╛рддрд╛, рдФрд░ рдлрд┐рд░ рджрд┐рдП рдЧрдП рдлрд╝рд╛рдЗрд▓рдирд╛рдо рдХреЗ рд╕рд╛рде рдСрдбрд┐рдпреЛ рд╕рд╣реЗрдЬ рджреЗрдЧрд╛ред

рдЗрд╕реЗ рдкрд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдмреЛрд▓рд╛ рдЧрдпрд╛ рд╕рдВрджреЗрд╢ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд╛рдЗрдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо record_and_transcribe.py рдирд╛рдо рдХреА рдирдИ рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдБрдЧреЗ:

import asyncio
from audio_to_text import transcribe_audio
from audio_recorder import record_audio

async def main():
  record_audio("prompt.wav")
  await transcribe_audio("prompt.wav")

if __name__ == "__main__":
  asyncio.run(main())

рдЖрдк рдЗрд╕реЗ python record_and_transcribe.py рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЪрд▓рд╛ рдХрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрдм рддрдХ рдЖрдкрдХреА рдмрд╛рдд рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдЧреА рдЬрдм рддрдХ рдЖрдк "Enter" рдирд╣реАрдВ рджрдмрд╛рддреЗ рдФрд░ рдлрд┐рд░ рдЖрдкрдиреЗ рдЬреЛ рдХрд╣рд╛ рдЙрд╕рдХрд╛ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХрд░ рджреЗрдЧреАред

рдСрдбрд┐рдпреЛ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдмрдирд╛рдирд╛

рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд╣рдо рд╕рдм рдХреБрдЫ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдСрдбрд┐рдпреЛ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдмрдирд╛рдПрдБрдЧреЗред рд╣рдо рдЗрд╕реЗ audio_assistant.py рдирд╛рдо рдХреА рдирдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ:

  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдСрдбрд┐рдпреЛ рдкреНрд░реЙрдореНрдкреНрдЯ record_audio() рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВред
  • transcribe_audio() рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдСрдбрд┐рдпреЛ рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдмрджрд▓реЗрдВред
  • gpt-4o рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдХреНрд╕реНрдЯ-рдЯреВ-рдЯреЗрдХреНрд╕реНрдЯ рдореЙрдбрд▓ рд╕реЗ рдЙрддреНрддрд░ рдЬрдирд░реЗрдЯ рдХрд░реЗрдВред
  • рдЕрдВрдд рдореЗрдВ, text_to_audio() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯреБрдЕрд▓ рдЙрддреНрддрд░ рдХреЛ рдСрдбрд┐рдпреЛ рдореЗрдВ рдмрджрд▓реЗрдВред
  • рдЗрд╕реЗ рддрдм рддрдХ рджреЛрд╣рд░рд╛рдПрдБ рдЬрдм рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╛рд╣рд░ рди рдирд┐рдХрд▓ рдЬрд╛рдПред

рдирд┐рдореНрди рдЖрд░реЗрдЦ рдЗрд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:

рд▓реВрдк рд╕рд╣рд┐рдд рдСрдбрд┐рдпреЛ-рдЯреВ-рдСрдбрд┐рдпреЛ рдЪреЗрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░

рдЖрдЧреЗ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдБред

рдкрд╣рд▓реЗ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХреЛ рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ OpenAI рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред

# Import the functions we created
from text_to_audio import text_to_audio
from audio_to_text import transcribe_audio
from audio_recorder import record_audio

# Import other dependencies and initialize OpenAI
import asyncio
from openai import AsyncOpenAI
from dotenv import load_dotenv
load_dotenv()
openai = AsyncOpenAI()

рдлрд┐рд░, рд╣рдореЗрдВ рдЙрддреНрддрд░ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп OpenAI GPT API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ gpt-4o рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЯреЗрдХреНрд╕реНрдЯ-рдЯреВ-рдЯреЗрдХреНрд╕реНрдЯ рдореЙрдбрд▓ред рдпрджрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рдирдП рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ GPT-4o API рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ asynchronous рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдпрд╣рд╛рдБ рд╣реИ:

async def get_answer(prompt):
  stream = await openai.chat.completions.create(
    model="gpt-4o",
    messages=[
      {"role": "user", "content": prompt}
    ],
    stream=True,
  )
  answer = ""
  async for chunk in stream:
    content = chunk.choices[0].delta.content
    if content is not None:
      answer += content
      print(content, end="", flush=True)
  print("\n\n")
  return answer

рдореБрдЦреНрдп рд▓реВрдк рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ:

async def main(tone_and_style_instructions):
  await text_to_audio("Hello, how can I help you today?", tone_and_style_instructions)
  while True:
    record_audio("prompt.wav")
    prompt = await transcribe_audio("prompt.wav")
    print()
    answer = await get_answer(prompt)
    await text_to_audio(answer, tone_and_style_instructions)

рдЕрдВрдд рдореЗрдВ, рдЬрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рддреА рд╣реИ рддреЛ рд╣рдо рдореБрдЦреНрдп рд▓реВрдк рдХреЛ рд░рди рдХрд░рддреЗ рд╣реИрдВ:

if __name__ == "__main__":
  tone_and_style_instructions = "Enthusiastic voice."
  asyncio.run(main(tone_and_style_instructions))

рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рдбреЗрдореЛ рд╣реИ:

рдкреВрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдБ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЧреЗ рдХреЗ рд╕реБрдзрд╛рд░

рдпрджрд┐ рд╣рдо рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрдЯрд┐рд▓ рдЯреЛрди рдФрд░ рд╢реИрд▓реА рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХрд░реЗрдВ, рддреЛ рд╣рдореЗрдВ рд╢рдмреНрджреЛрдВ рдФрд░ рдЯреЛрди рдХреЗ рдмреАрдЪ рдЕрд╕рдВрдЧрддрд┐ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, OpenAI рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ "Emo Teenager" рд╡реЙрдпрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреЗрдВ:

tone_and_style_instructions = """
Tone: Sarcastic, disinterested, and melancholic, with a hint of passive-aggressiveness.
Emotion: Apathy mixed with reluctant engagement.
Delivery: Monotone with occasional sighs, drawn-out words, and subtle disdain, evoking a classic emo teenager attitude.
"""

рдСрдбрд┐рдпреЛ рдХрд╛ рд╡реЙрдпрд╕ рдЯреЛрди рдЗрд╕ рд╢реИрд▓реА рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди get_answer() рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдЙрддреНрддрд░ рдХреА рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦреЗрдЧреА, рдЬрд┐рд╕рд╕реЗ рдереЛрдбрд╝реА рдЕрд╕рдВрдЧрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

рдЗрд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо get_answer() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЙрдореНрдкреНрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдЯреЛрди рдФрд░ рд╢реИрд▓реА рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗред

рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо tone_and_style_instructions рдХреЛ get_answer() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреВрд╕рд░реЗ рдЖрд░реНрдЧреНрдпреБрдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЪреИрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдореЗрдВ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдореИрд╕реЗрдЬ рдЬреЛрдбрд╝рдХрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

async def get_answer(prompt, tone_and_style_instructions):
  stream = await openai.chat.completions.create(
    model="gpt-4o",
    messages=[
      {
        "role": "system", 
        "content": 
          f"""
          The text you generate is being used in a text-to-voice model.
          Make sure your answer matches the guidelines {tone_and_style_instructions}
          """
      },
      {"role": "user", "content": prompt}
    ],
    stream=True,
  )
  answer = ""
  async for chunk in stream:
    content = chunk.choices[0].delta.content
    if content is not None:
      answer += content
      print(content, end="", flush=True)
  print("\n\n")
  return answer

рдЕрдм рдореЙрдбрд▓ рдЗрд╕ рддрд░рд╣ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдм рдпрд╣ рдЬреЛ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдЯреЛрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдкреВрд░рд╛ рдХреЛрдб рдЖрдкрдХреЛ рдпрд╣рд╛рдБ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред

Agents API рдХреЗ рд╕рд╛рде рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдмрдирд╛рдирд╛

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рд╡реЙрдЗрд╕ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЙрдпрд╕-рдЯреВ-рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ-рдЯреВ-рд╡реЙрдпрд╕ рдореЙрдбрд▓реЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓реА рдХреЙрд▓ рдХрд┐рдпрд╛ред рдРрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ OpenAI рдХреА рд╡реЙрдпрд╕ API рд╕реЗ рдирдП рдореЙрдбрд▓реЛрдВ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реАрдЦрд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд▓рдХреНрд╖реНрдп рд╡реЙрдЗрд╕ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдмрдирд╛рдирд╛ рд╣реИ, рддреЛ рдПрдЬреЗрдВрдЯ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕ API рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ-рдЖрдк рдЙрд╕ рд╡реЙрдпрд╕-рдЯреВ-рдЯреЗрдХреНрд╕реНрдЯ-рдЯреВ-рд╡реЙрдпрд╕ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХреЗ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдпрд╣рд╛рдБ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдПрдЬреЗрдВрдЯ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ: OpenAI Agents SDKред

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рдФрд░ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреА рд╣реЛрдЧреА:

pip install 'openai-agents[voice]'

рдпрд╣ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╡реЙрдпрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдПрдХ рдПрдЬреЗрдВрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

from dotenv import load_dotenv
load_dotenv()
import asyncio
from agents import Agent
from agents.voice import (
    AudioInput,
    SingleAgentVoiceWorkflow,
    VoicePipeline,
    VoicePipelineConfig,
    TTSModelSettings,
)
from audio_recorder import record_audio
from audio_player import AudioPlayer

AudioPlayer рдХрд┐рд╕реА рдкреИрдХреЗрдЬ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдПрдХ рд▓реЛрдХрд▓ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЗрдореНрдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреНрд▓рд╛рд╕ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд░рд┐рдпрд▓ рдЯрд╛рдЗрдо рдореЗрдВ рдСрдбрд┐рдпреЛ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред рдпрд╣ рдЗрд╕рд▓рд┐рдП рдЬрд╝рд░реВрд░реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ VoicePipeline рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдСрдбрд┐рдпреЛ рдЯреБрдХрдбрд╝рд╛-рджрд░-рдЯреБрдХрдбрд╝рд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╣рд░ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реА рдЪрд▓рд╛ рджреЗрдВрдЧреЗред рдпрд╣рд╛рдБ audio_player.py рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:

import numpy as np
import sounddevice as sd
class AudioPlayer:
  def __enter__(self):
    self.stream = sd.OutputStream(samplerate=24000, channels=1, dtype=np.int16)
    self.stream.start()
    return self
  def __exit__(self, tp, val, tb):
    self.stream.close()
  def add_audio(self, audio_data):
    self.stream.write(audio_data)

рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рдПрдЬреЗрдВрдЯ рдмрдирд╛рдирд╛ рд╣реИ:

agent = Agent(
  name="Voice Assistant",
  instructions="YouтАЩre a helpful assistant speaking to a human.",
  model="gpt-4o-mini",
)

рдпрд╣рд╛рдБ рд╣рдордиреЗ рдЬрд┐рди рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдЙрдирдХрд╛ рд╡рд┐рд╡рд░рдг:

  • name: рдпрд╣ рд╣рдо рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛ рд╕реЗ рдХреБрдЫ рднреА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
  • instructions: рдпреЗ рдирд┐рд░реНрджреЗрд╢ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдПрдЬреЗрдВрдЯ рдХреНрдпрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЙрдореНрдкреНрдЯ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  • model: рдЙрддреНрддрд░ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореЙрдбрд▓ред

рдПрдЬреЗрдВрдЯ, рдкрд╣рд▓реЗ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯ рдХрд┐рдП рдЧрдП get_answer() рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдЙрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреА рддрд░рд╣ рд╕рдордЭреЗрдВ, рдЬреЛ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░реЙрдореНрдкреНрдЯ рдХрд╛ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИред

рдЕрдм рд╣рдо рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣реАрдВ рд╣рдо рд╡реЙрдЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддрдп рдХрд░рддреЗ рд╣реИрдВ:

pipeline = VoicePipeline(
  workflow=SingleAgentVoiceWorkflow(agent),
  stt_model="gpt-4o-mini-transcribe",
  tts_model="gpt-4o-mini-tts",
  config=VoicePipelineConfig(
    tts_settings=TTSModelSettings(
      voice="coral",
      instructions="""
        Speak in an enthusiastic voice.
      """
    )
  )
)

рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг:

  • stt_model: рд╕реНрдкреАрдЪ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореЙрдбрд▓ред
  • tts_model: рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╕реНрдкреАрдЪ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореЙрдбрд▓ред
  • config: рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреЗрдВред рдпрд╣рд╛рдБ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ tts_model рдХреЗ рд▓рд┐рдП рдЪреБрдиреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЖрд╡рд╛рдЬрд╝ рдФрд░ рд╕реНрдкреАрдЪ рдирд┐рд░реНрджреЗрд╢ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдореБрдЦреНрдп рд▓реВрдк рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛:

async def main():
  while True:
    audio_input = AudioInput(buffer=record_audio())
    result = await pipeline.run(audio_input)
    with AudioPlayer() as player:
      async for event in result.stream():
        if event.type == "voice_stream_event_audio":
          player.add_audio(event.data)

if __name__ == "__main__":
    asyncio.run(main())

рдПрдХ рд╕рдВрдкреВрд░реНрдг рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдЖрдкрдХреЛ рдпрд╣рд╛рдБ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред

рдЯреВрд▓реНрд╕ рдЬреЛрдбрд╝рдирд╛

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд▓реВрдк рд╣рдореЗрд╢рд╛ рдЪрд▓рддрд╛ рд░рд╣реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдХреЛрдИ рд╕реНрдЯреЙрдк рдХрдВрдбреАрд╢рди рддрдп рдирд╣реАрдВ рдХреА рд╣реИред рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓реА рдХрд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдПрдЬреЗрдВрдЯ рдХреЛ рдПрдХ рдЯреВрд▓ рджреЗрдирд╛ред┬а

рдЯреВрд▓реНрд╕ рд╡реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдПрдЬреЗрдВрдЯ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡рд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛ рд╕рдХреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд░реЛрдХ рджреЗред рдПрдЬреЗрдВрдЯ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдФрд░ рдХрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред

from agents import function_tool
@function_tool
def stop_conversation():
  """Stop the conversation."""
  exit()

рдлрд┐рд░, рд╣рдо рдпрд╣ рдЯреВрд▓ рдПрдЬреЗрдВрдЯ рдХреЛ рджреЗрддреЗ рд╣реИрдВ:

agent = Agent(
  тАж
  tools=[stop_conversation], # Add this line when creating the agent
)

рдЗрд╕ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде, рдЕрдЧрд░ рд╣рдо рдХрд╣реЗрдВ, тАЬрдореИрдВ рдмрд╛рддрдЪреАрдд рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛/рдЪрд╛рд╣рддреА рд╣реВрдБ,тАЭ рддреЛ рдПрдЬреЗрдВрдЯ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕реЗ stop_conversation() рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди, stop_conversation() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг, рдЧреНрд░реЗрд╕рдлреБрд▓реА рдПрдЧреНрдЬрд╝рд┐рдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдпрджрд┐ рдЖрдк рдПрдХ рдкреВрд░рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рджреЗрдЦреЗрдВред

рдПрдХрд╛рдзрд┐рдХ рдПрдЬреЗрдВрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ

рдПрдЬреЗрдВрдЯреНрд╕ API рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдПрдЬреЗрдВрдЯреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ OpenAI рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

from agents.extensions.handoff_prompt import prompt_with_handoff_instructions

spanish_agent = Agent(
  name="Spanish voice assistant",
  handoff_description="A spanish speaking agent.",
  instructions=prompt_with_handoff_instructions(
    "You're speaking to a human, so be polite and concise. Speak in Spanish.",
  ),
  model="gpt-4o-mini",
)

agent = Agent(
  name="Voice Assistant",
  instructions=prompt_with_handoff_instructions("""
    You're speaking to a human, so be polite and concise. 
    If the user speaks in Spanish, handoff to the spanish agent.
  """),
  model="gpt-4o-mini",
)

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рджреВрд╕рд░рд╛ рдПрдЬреЗрдВрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╕реНрдкреИрдирд┐рд╢ рдореЗрдВ рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рд╣реИрдВрдбрдСрдлрд╝ рд╕рд╣рд┐рдд рдПрдХ рдкреНрд░реЙрдореНрдкреНрдЯ рджреЗрдХрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рд╣реИрдВрдбрдСрдлрд╝ рдирд┐рд░реНрджреЗрд╢ рдкреВрд░реЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рджреВрд╕рд░рд╛ рдПрдЬреЗрдВрдЯ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмрд╛рддрдЪреАрдд рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдЧрд╛ред

рдкреВрд░рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖

OpenAI рдХреЗ рдирд╡реАрдирддрдо рдСрдбрд┐рдпреЛ рдореЙрдбрд▓реЛрдВ рдХреА рдЙрдиреНрдирдд рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдордиреЗ рдРрд╕рд╛ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдмреЛрд▓реА рдЧрдИ рднрд╛рд╖рд╛ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд╛рдЗрдм рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯреБрдЕрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдорд╛рдирд╡реАрдп рдЬреИрд╕реА рдЖрд╡рд╛рдЬрд╝ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рди рд╕рд┐рд░реНрдл рдореМрдЬреВрджрд╛ рддрдХрдиреАрдХ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рдХрд┐ рдХрд╕реНрдЯрдо AI рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдпреЗ рдЯреВрд▓реНрд╕ рдЕрдм рдХрд┐рддрдиреЗ рд╕реБрд▓рдн рд╣реЛ рдЧрдП рд╣реИрдВред

Fran├зois Aubry

рд▓реЗрдЦрдХ

Fran├зois Aubry

Full-stack рдЗрдВрдЬреАрдирд┐рдпрд░ рдПрд╡рдВ рд╕рдВрд╕реНрдерд╛рдкрдХ, CheapGPT рдкрд░ред рдкрдврд╝рд╛рдирд╛ рд╣рдореЗрд╢рд╛ рд╕реЗ рдореЗрд░рд╛ рдЬреБрдиреВрди рд░рд╣рд╛ рд╣реИред рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдЬреАрд╡рди рд╕реЗ рд╣реА рдореИрдВ рдЙрддреНрд╕рд╛рд╣рдкреВрд░реНрд╡рдХ рдЯреНрдпреВрд╢рди рджреЗрдиреЗ рдФрд░ рдЕрдиреНрдп рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдпреЛрдВ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рддрд▓рд╛рд╢рддрд╛ рд░рд╣рд╛ рд╣реВрдБред рдЗрд╕реА рдЬреБрдиреВрди рдиреЗ рдореБрдЭреЗ рдкреАрдПрдЪрдбреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╢реИрдХреНрд╖рдгрд┐рдХ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рд╕рд╛рде рд╢рд┐рдХреНрд╖рдг рд╕рд╣рд╛рдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд╛рдо рдХрд┐рдпрд╛ред рдЙрди рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХрдХреНрд╖рд╛-рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛, рд╕рдВрдмрдВрдз рдмрдирд╛рдирд╛ рдФрд░ рд╕реАрдЦрдиреЗ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдирд╛ рдореБрдЭреЗ рдЕрддреНрдпрдВрдд рд╕рдВрддреЛрд╖ рджреЗрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдСрдирд▓рд╛рдЗрди рд▓рд░реНрдирд┐рдВрдЧ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рдбрд┐рдЬрд┐рдЯрд▓ рд╢рд┐рдХреНрд╖рд╛ рдХреА рд░реВрдкрд╛рдВрддрд░рдХрд╛рд░реА рдХреНрд╖рдорддрд╛ рдХреЛ рдкрд╣рдЪрд╛рдирд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реА рд╣реА рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдРрд╕реЗ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдерд╛ред рдореИрдВ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╢рд┐рдХреНрд╖рдг рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдирд╡реЛрдиреНрдореЗрд╖реА рдбрд┐рдЬрд┐рдЯрд▓ рдкрджреНрдзрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реВрдБред рдореЗрд░рд╛ рдЙрджреНрджреЗрд╢реНрдп рдРрд╕реЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рди рдХреЗрд╡рд▓ рд░реЛрдЪрдХ рдФрд░ рд╕реВрдЪрдирд╛рдкреНрд░рдж рд╣реЛрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕ рдбрд┐рдЬрд┐рдЯрд▓ рдпреБрдЧ рдХреЗ рд╢рд┐рдХреНрд╖рд╛рд░реНрдерд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрдЧрдо рднреА рд╣реЛрдВред

рд╡рд┐рд╖рдп