рдкреЗрд╢ рд╣реИ Eleven v4рдкреЗрд╢ рд╣реИ Eleven v4, рд╣рдорд╛рд░рд╛ рдЕрдм рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рднрд╛рд╡рдкреВрд░реНрдг рдореЙрдбрд▓ред

рдХрдВрдЯреЗрдВрдЯ рдкрд░ рдЬрд╛рдПрдВ

рд░реАрдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ 200ms рд╕реЗ рдХрдо рдореЗрдВ: рдПрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЧрд╛рдЗрдб

рд▓реЗрдЦрдХ
Tadas Petra
Jack Limebear
рдкреНрд░рдХрд╛рд╢рд┐рдд
рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

рд╕реБрдиреЗрдВрдЗрд╕ рдЖрд░реНрдЯрд┐рдХрд▓ рдХреЛ рд╕реБрдиреЗрдВ

рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ (STT) рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмреЛрд▓рддреЗ рд╕рдордп рд╣реА рдСрдбрд┐рдпреЛ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╕реМ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдЙрд╕рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди STT рд▓реЗрдЯреЗрдВрд╕реА рдХрдо рд░рдЦрдирд╛ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рднреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ, рдЪрдВрдХрд┐рдВрдЧ, рдПрдВрдб-рдкреЙрдЗрдВрдЯрд┐рдВрдЧ рдФрд░ рдХреИрдкреНрдЪрд░ рдкрд╛рде рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреА рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдПрдХ рд▓реЗрдЯреЗрдВрд╕реА рдмрдврд╝рд╛рддрд╛ рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреА рдЕрдХреНрд╖рдорддрд╛ рднреА рдЖрдкрдХреЗ 200ms рдмрдЬрдЯ рдХреЛ рдкрд╛рд░ рдХрд░ рд╕рдХрддреА рд╣реИред

рдпрд╣ рдЧрд╛рдЗрдб рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рд▓реЗрдпрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рджреЗрддреА рд╣реИред рд╣рдо Scribe v2 Realtime рдХреЛ рдЖрдзрд╛рд░ рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ рд▓рдЧрднрдЧ 150ms рдореЙрдбрд▓ рд▓реЗрдЯреЗрдВрд╕реА рдореЗрдВ рдЖрдВрд╢рд┐рдХ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрд╢рди рджреЗрддрд╛ рд╣реИ, 90+ рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, PCM (8kHz-48kHz) рдФрд░ mu-law рдСрдбрд┐рдпреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡реЙрдЗрд╕ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдбрд┐рдЯреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рдлрд╝рд╛рдЗрдирд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рдХрдорд┐рдЯ рдХрдВрдЯреНрд░реЛрд▓ рджреЗрддрд╛ рд╣реИред

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

рд╕рд╛рд░рд╛рдВрд╢

  • рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдмрд╛рд░реАрдХреА рд╕реЗ рдЯреНрдпреВрди рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдкреВрд░реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рд▓реЗрдЯреЗрдВрд╕реА рдХрдо рд░рд╣реЗред
  • рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП WebSocket рд╕рд╣реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ WebRTC рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрдИ рдлрд╛рдпрджреЗ рджреЗрддрд╛ рд╣реИред
  • рд╡реЙрдЗрд╕ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдбрд┐рдЯреЗрдХреНрд╢рди рд╣реИрдВрдбреНрд╕-рдлрд╝реНрд░реА рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореИрдиреНрдпреБрдЕрд▓ рдХрдорд┐рдЯ рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЯрд░реНрди рдЦрддреНрдо рд╣реЛрдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреЗ рдкрд░ рдУрд╡рд░рд░рд╛рдЗрдб рджреЗрддрд╛ рд╣реИред
  • рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдЕрд╕реНрдерд╛рдпреА рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рд╛рдЗрдирд▓ рдХрдорд┐рдЯ рдХрд┐рдП рд╣реБрдП рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд░реЗрдВрдбрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рд▓рдЧрднрдЧ 100ms рдХреЗ рдЫреЛрдЯреЗ PCM рдЪрдВрдХ рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╢рд┐рдпрд▓ рддрдХ рдХреА рд▓реЗрдЯреЗрдВрд╕реА рдХрдо рдХрд░рддреЗ рд╣реИрдВред

рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП WebSocket рдмрдирд╛рдо WebRTC

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

WebSocket, TCP рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓рд╛, рдХреНрд░рдордмрджреНрдз, рднрд░реЛрд╕реЗрдордВрдж рдФрд░ рджреНрд╡рд┐рджрд┐рд╢ рдЪреИрдирд▓ рд╣реИред рдЖрдк рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рддреЗ рд╣реИрдВ, рдмрд╛рдЗрдирд░реА рдСрдбрд┐рдпреЛ рдлрд╝реНрд░реЗрдо рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рдЗрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░, рджреЛрдиреЛрдВ рдкрд░ рдпрд╣ рд╕реАрдзрд╛ рд╣реИ; рдпрд╣ рдЙрди рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдкреНрд░реЙрдХреНрд╕реА рдФрд░ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ HTTPS рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рд╣рд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡ рд╕рд░реНрд╡рд░ рд░рдирдЯрд╛рдЗрдо рдЗрд╕реЗ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред

WebSocket рдХреА рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ TCP рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рдкреИрдХреЗрдЯ рдЦреЛрдиреЗ рдкрд░ TCP рдЙрд╕реЗ рджреЛрдмрд╛рд░рд╛ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдЧреИрдк рднрд░рдиреЗ рддрдХ рдмрд╛рдж рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИред рдЕрдЪреНрдЫреА рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдпрд╣ рджрд┐рдЦрддрд╛ рдирд╣реАрдВ рд╣реИред рдкреИрдХреЗрдЯ рд▓реЙрд╕ рд╣реЛрдиреЗ рдкрд░ рд╣реЗрдб-рдСрдл-рд▓рд╛рдЗрди рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╣реЛрддреА рд╣реИтАФрдСрдбрд┐рдпреЛ рдереЛрдбрд╝реА рджреЗрд░ рд░реБрдХрдХрд░ рдлрд┐рд░ рдПрдХ рд╕рд╛рде рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред

WebRTC рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдореАрдбрд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ UDP (SRTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдкрд░ рдореАрдбрд┐рдпрд╛ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреИрдХреЗрдЯ рдЦреЛрдиреЗ рдкрд░ рд╕реНрдЯреНрд░реАрдо рдирд╣реАрдВ рд░реБрдХрддреА рдФрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред рдЗрд╕рдореЗрдВ рдкреИрдХреЗрдЯ рдЖрдиреЗ рдХреЗ рд╕рдордп рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдЯрд░ рдмрдлрд╝рд░ рд╣реИ, рд░рд╛рдЙрдЯрд░ рдХреЗ рдкреАрдЫреЗ рдореМрдЬреВрдж рдкреАрдпрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП ICE/STUN/TURN рд╕реЗ NAT рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдиреЗрдЧреЛрд╢рд┐рдПрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдкрдирд╛ рдСрдбрд┐рдпреЛ рдХреИрдкреНрдЪрд░ рд╡ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рддрдВрддреНрд░ рд╣реЛрддрд╛ рд╣реИред

рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реАрдзреЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рдЙрдирдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ TURN рд╕рд░реНрд╡рд░ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЛ рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░реАрдо рдкрдврд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдо рдЯрд░реНрдорд┐рдиреЗрдЯ рдХрд░рдиреА рд╣реЛрддреА рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЕрдВрддрд░ рдпрд╣ рд╣реИ:

WebSocket
Transport
TCP (reliable, ordered)
Behavior under packet loss
Head-of-line blocking, bursty recovery
Jitter handling
Your responsibility
NAT traversal
Not needed (client-initiated)
Browser support
Universal, trivial
Server complexity
Low
WebRTC
Transport
UDP/SRTP (real-time, loss-tolerant)
Behavior under packet loss
Graceful degradation
Jitter handling
Built-in jitter buffer
NAT traversal
Requires ICE/STUN/TURN
Browser support
Universal, but more API surface
Server complexity
High (media server or SFU)

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

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

рдЗрд╕ рдЧрд╛рдЗрдб рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд░рд┐рдХрдЧреНрдирд╛рдЗрдЬрд╝рд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП WebSocket рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░рд╣рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЕрдзрд┐рдХрддрд░ рдЯреАрдореНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╢реБрд░реБрдЖрдд рд╣реИред рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рд╕рд┐рд░реНрдл WebSocket рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╛рдж рдореЗрдВ рдЖрдк рдЖрдЧреЗ WebRTC рдореАрдбрд┐рдпрд╛ рд▓реЗрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд░реНрд╡рд░ рдкрд░ рдСрдбрд┐рдпреЛ рдХреЛ PCM рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣реА рдЪрдВрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдФрд░ рдлрд╝рд╛рдЗрдирд▓ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ: рдЕрдВрддрд░рд┐рдо рдирддреАрдЬреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛

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

рдкрд╛рд░реНрд╢рд┐рдпрд▓ (рдЕрдВрддрд░рд┐рдо) рд╣рд╛рдЗрдкреЛрдереЗрд╕рд┐рд╕ рдЕрдм рддрдХ рдорд┐рд▓реЗ рдСрдбрд┐рдпреЛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЙрдбрд▓ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрдорд╛рди рд╣реИред рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЕрд╕реНрдерд┐рд░ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдСрдбрд┐рдпреЛ рдЖрдиреЗ рдкрд░ рдореЙрдбрд▓ рдкрд╣рд▓реЗ рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ: "I want to" рдмрд╛рдж рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдЦрддреНрдо рд╣реЛрдиреЗ рдкрд░ "I want two tickets" рдмрди рд╕рдХрддрд╛ рд╣реИред рдпреЗ рддреЗрдЬрд╝реА рд╕реЗ рдЖрддреЗ рд╣реИрдВ (~150ms рд▓реЗрдЯреЗрдВрд╕реА рдХрд╛ рдЖрдВрдХрдбрд╝рд╛ рдЗрд╕реА рдХреЗ рд▓рд┐рдП рд╣реИ) рдФрд░ рдЗрдиреНрд╣реЗрдВ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реЛрддрд╛ рд╣реИред

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

рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдФрд░ рдлрд╝рд╛рдЗрдирд▓ рдХрд╛ рдЕрдВрддрд░ рдЗрди рддреАрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рддрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдзреБрдВрдзрд▓рд╛ рдХрд░рдиреЗ рдкрд░ рдЧрд▓рдд рдХрд░ рджреЗрдВрдЧреЗ:

  • рдпреВрдЬрд╝рд░ рдЕрдиреБрднрд╡: рдкрд╛рд░реНрд╢рд┐рдпрд▓ рджрд┐рдЦрд╛рдиреЗ рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрд╡ рд▓рдЧрддрд╛ рд╣реИ: рдпреВрдЬрд╝рд░ рдЕрдкрдиреЗ рдмреЛрд▓рддреЗ рд╣реА рд╢рдмреНрдж рджрд┐рдЦрддреЗ рджреЗрдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреБрд╖реНрдЯрд┐ рд╣реЛрддреА рд╣реИ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕реБрди рд░рд╣рд╛ рд╣реИред
  • рдПрдВрдб-рдкреЙрдЗрдВрдЯрд┐рдВрдЧ: рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдЖрдкрдХреЛ рд╕реНрдкреАрдЪ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХрд╛ рд▓рдЧрд╛рддрд╛рд░ рд╕рд┐рдЧреНрдирд▓ рджреЗрддреЗ рд╣реИрдВред VAD рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдпреЗ рддрдп рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдкреАрдХрд░ рд╕рдЪ рдореЗрдВ рдХрдм рд░реБрдХрд╛ рд╣реИред
  • рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЯрд╛рдЗрдорд┐рдВрдЧ: рдПрдХ рд╡реЙрдЗрд╕ рдПрдЬреЗрдВрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХреНрд░рдо рд╣реЛрддрд╛ рд╣реИ: рдСрдбрд┐рдпреЛ рдЗрди, рдлрд┐рд░ рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ, рдлрд┐рд░ LLM, рдлрд┐рд░ рдЯреЗрдХреНрд╕реНрдЯ рдЯреВ рд╕реНрдкреАрдЪ, рдФрд░ рдлрд┐рд░ рдСрдбрд┐рдпреЛ рдЖрдЙрдЯред рдЖрдк рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдкрд░ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд╛рдо рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рд╛рдЗрдирд▓ рдкрд░ рдЙрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдХрднреА-рдХрднреА рдЙрд╕ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд╛рдо рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдХреАрдордд рдкрд░ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдШрдЯрддрд╛ рд╣реИред

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

type TranscriptState = {
  committed: string[]; // finalized segments, never rewritten
  current: string;     // latest partial, overwritten on each update
};

const onPartial = (s: TranscriptState, text: string): TranscriptState =>
  ({ ...s, current: text });

const onFinal = (s: TranscriptState, text: string): TranscriptState =>
  ({ committed: [...s.committed, text], current: "" });

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

рдПрдВрдб-рдкреЙрдЗрдВрдЯрд┐рдВрдЧ рдФрд░ рд╡реЙрдЗрд╕ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдбрд┐рдЯреЗрдХреНрд╢рди (VAD)

рдХреНрдпрд╛ рдХрд╣рд╛ рдЧрдпрд╛, рдпрд╣ рдЬрд╛рдирдирд╛ рдХреЗрд╡рд▓ рдЖрдзреА рдЪреБрдиреМрддреА рд╣реИред рд░рд┐рдХрдЧреНрдирд╛рдЗрдЬрд╝рд░ рдХреЛ рдпрд╣ рднреА рдЬрд╛рдирдирд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХрдм рдЦрддреНрдо рд╣реБрдЖред рдЗрд╕реА рдирд┐рд░реНрдгрдп рд╕реЗ рддрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕реЗрдЧрдореЗрдВрдЯ рдХрдм рдлрд╝рд╛рдЗрдирд▓ рд╣реЛрдЧрд╛ рдФрд░ рдПрдЬреЗрдВрдЯ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХрдм рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ред

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

Scribe v2 Realtime рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдкреВрд░рдХ рддрд░реАрдХреЗ рд╣реИрдВ:

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

рдпреЗ рджреЛрдиреЛрдВ рд╕рд╛рде рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реЙрдЗрд╕ рдПрдЬреЗрдВрдЯ рд╣реИрдВрдбреНрд╕-рдлрд╝реНрд░реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП VAD рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рдХрдорд┐рдЯ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд░реБрдХрд╛ рдпреВрдЬрд╝рд░ рдХрдЯреЗ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдмрдЯрди рдЯреИрдк рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдпреВрдЬрд╝рд░ рдХреЛ рддреБрд░рдВрдд рд╕реАрдорд╛ рдорд┐рд▓ рдЬрд╛рдПред

рдЪреБрдкреНрдкреА рдХреА рд╕реАрдорд╛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрддреБрд▓рди рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рд╣реА рдорд╛рди рдирд╣реАрдВ рд╣реИ:

  • рдХрдо рдПрдВрдб-рдСрдл-рд╕реНрдкреАрдЪ рдЯрд╛рдЗрдордЖрдЙрдЯ (рдЬреИрд╕реЗ ~200-400ms рдХреА рдЪреБрдкреНрдкреА рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрдирд▓рд╛рдЗрдЬрд╝реЗрд╢рди) рд╕рд┐рд╕реНрдЯрдо рдХреЛ рддреЗрдЬрд╝ рдорд╣рд╕реВрд╕ рдХрд░рд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд░реБрдХрдиреЗ рд╡рд╛рд▓реЗ рдпреВрдЬрд╝рд░ рднреА рдХрдЯ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХрдИ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдмрдВрдЯ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдЬреЗрдВрдЯ рдореЗрдВ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╡рд╛рдм рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рд▓рдВрдмрд╛ рдЯрд╛рдЗрдордЖрдЙрдЯ (рдЬреИрд╕реЗ ~800-1200ms) рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╡рд┐рд░рд╛рдореЛрдВ рдХреЛ рд╕рд╣рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдердиреЛрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рд▓рд╛рдпрдХ рджреЗрд░реА рд╣реЛрддреА рд╣реИред

рдпрд╣рд╛рдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдирд╣реАрдВ рд╣реИ; рд╕реАрдорд╛ рдХреЛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЯреНрдпреВрди рдХрд░реЗрдВ:

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

рдЗрди рд╕реБрдЭрд╛рд╡реЛрдВ рд╕реЗ рдЖрдк рдкреНрд░рднрд╛рд╡реА рдПрдВрдб-рдкреЙрдЗрдВрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рдХреА рдУрд░ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрди-рд╕реНрдЯреНрд░реАрдо рд╕реБрд╡рд┐рдзрд╛рдПрдВ: рднрд╛рд╖рд╛ рдкрд╣рдЪрд╛рди рдФрд░ рд╕реНрдкреАрдХрд░ рдбрд╛рдпрд░реАрдХрд░рдг

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

рдСрдЯреЛрдореИрдЯрд┐рдХ рднрд╛рд╖рд╛ рдкрд╣рдЪрд╛рди Scribe v2 Realtime рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рднрд╛рд╖рд╛ рдмрддрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрд╕рдХреА 90+ рд╕рдорд░реНрдерд┐рдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдмреЛрд▓реА рдЬрд╛ рд░рд╣реА рднрд╛рд╖рд╛ рдкрд╣рдЪрд╛рдирдиреЗ рджреЗрддреА рд╣реИред рдЗрд╕рдХреА рдХреАрдордд рдпрд╣ рд╣реИ рдХрд┐ рднрд░реЛрд╕реЗрдордВрдж рдирд┐рд░реНрдгрдп рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЛ рдСрдбрд┐рдпреЛ рдХрд╛ рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рднрд╛рд╖рд╛ рддрдп рд╣реЛрдиреЗ рддрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╢реБрд░реБрдЖрддреА рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдХрдо рд╕реНрдерд┐рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдк рднрд╛рд╖рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣рдЯрддреА рд╣реИ рдФрд░ рд╢реБрд░реБрдЖрддреА рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рд╣реЛрддреЗ рд╣реИрдВред

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

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

рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдпреЛ рдлрд╝реЙрд░реНрдореЗрдЯ: PCM рдФрд░ mu-law

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

PCM (рд▓рд┐рдирд┐рдпрд░, 16-рдмрд┐рдЯ рд╕рд╛рдЗрди рдХрд┐рдпрд╛ рд╣реБрдЖ, рд▓рд┐рдЯрд┐рд▓-рдПрдВрдбрд┐рдпрди) рд╡рд╣ рдлрд╝реЙрд░реНрдореЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдХреИрдкреНрдЪрд░ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдКрдВрдЪреА рд╕реИрдВрдкрд▓ рджрд░реЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдзреНрд╡рдирд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ: 16kHz рд╕реНрдкреАрдЪ рд░рд┐рдХрдЧреНрдирд┐рд╢рди рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдиреНрдпреВрдирддрдо рджрд░ рд╣реИ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ; 8kHz рдЯреЗрд▓реАрдлрд╝реЛрди-рдЧреНрд░реЗрдб рд╣реИ рдФрд░ рдЙрдЪреНрдЪ-рдлрд╝реНрд░реАрдХреНрд╡реЗрдВрд╕реА рдХрдВрдЯреЗрдВрдЯ рдЦреЛ рджреЗрддрд╛ рд╣реИред рд╕реНрд░реЛрдд рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реА рджрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред 8kHz рдЯреЗрд▓реАрдлрд╝реЛрдиреА рдСрдбрд┐рдпреЛ рдХреЛ 48kHz рдкрд░ рдЕрдкрд╕реИрдВрдкрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЦреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреАред

8kHz рдкрд░ Mu-law рдЯреЗрд▓реАрдлрд╝реЛрдиреА рдлрд╝реЙрд░реНрдореЗрдЯ рд╣реИред рдЕрдЧрд░ рдЖрдк Twilio рдЬреИрд╕реЗ рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдХреЙрд▓ рд▓реЗ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдСрдбрд┐рдпреЛ 8kHz mu-law рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЙрд╕реЗ рджреЛ рдмрд╛рд░ рдЯреНрд░рд╛рдВрд╕рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрд╕реА рдлрд╝реЙрд░реНрдореЗрдЯ рдореЗрдВ рдлрд╝реЙрд░рд╡рд░реНрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрд░реЛрдд рдлрд╝реЙрд░реНрдореЗрдЯ рд╕реЗ рдореЗрд▓ рд░рдЦрдиреЗ рдкрд░ рд░реА-рд╕реИрдВрдкрд▓рд┐рдВрдЧ рдЖрд░реНрдЯрд┐рдлрд╝реИрдХреНрдЯ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрдиреНрд╡рд░реНрдЬрд╝рди рд╕реНрдЯреЗрдк рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред

рдЪрдВрдХ рд╕рд╛рдЗрдЬрд╝ рд╡рд╣ рд▓реАрд╡рд░ рд╣реИ рдЬреЛ рдЕрдиреБрдорд╛рдирд┐рдд рд▓реЗрдЯреЗрдВрд╕реА рдХреЛ рд╕рдмрд╕реЗ рд╕реАрдзреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рдСрдбрд┐рдпреЛ рдХреЛ рдЪрдВрдХ рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдХрдЧреНрдирд╛рдЗрдЬрд╝рд░ рдЪрдВрдХ рдЖрдиреЗ рдкрд░ рдкрд╛рд░реНрд╢рд┐рдпрд▓ рджреЗрддрд╛ рд╣реИред рдЫреЛрдЯреЗ рдЪрдВрдХ рдХрд╛ рдорддрд▓рдм рд╣реИ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдФрд░ рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╢рд┐рдпрд▓ рддрдХ рдХрдо рд▓реЗрдЯреЗрдВрд╕реА; рдмрдбрд╝реЗ рдЪрдВрдХ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрдо рдореИрд╕реЗрдЬ рдФрд░ рд╣рд░ рдЗрдиреНрдлрд╝рд░реЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрднред рдкреНрд░рддрд┐ рдЪрдВрдХ 20-250ms рдСрдбрд┐рдпреЛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реЗрдВрдЬ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 16kHz рдореЛрдиреЛ 16-рдмрд┐рдЯ PCM рдореЗрдВ рдПрдХ рд╕реЗрдХрдВрдб рдХрд╛ рдСрдбрд┐рдпреЛ 32,000 рдмрд╛рдЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП 100ms рдЪрдВрдХ рд▓рдЧрднрдЧ 3,200 рдмрд╛рдЗрдЯ рдХрд╛ рд╣реЛрддрд╛ рд╣реИред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рдЗрдирдкреБрдЯ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рд╣реА рдЯреВрд▓ Web рдСрдбрд┐рдпреЛ API рдФрд░ AudioWorklet рд╣реИред рд╡рд░реНрдХрд▓реЗрдЯ рдСрдбрд┐рдпреЛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдереНрд░реЗрдб рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рдЫреЛрдЯреЗ рдлрд╝реНрд░реЗрдо рдореЗрдВ рдСрдбрд┐рдпреЛ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рдкреБрд░рд╛рдиреЗ ScriptProcessorNode рдХреА рддрд░рд╣ рдореЗрди-рдереНрд░реЗрдб рдЬреИрдВрдХ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ред рдЗрд╕рдХрд╛ рдХрд╛рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдиреЗрдЯрд┐рд╡ рдлрд╝реНрд▓реЛрдЯ рд╕реИрдВрдкрд▓ рдХреЛ 16-рдмрд┐рдЯ PCM рдореЗрдВ рдмрджрд▓рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореЗрди рдереНрд░реЗрдб рдХреЛ рджреЗрдирд╛ рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ WebSocket рдХреЗ рдЬрд░рд┐рдП рдлрд╝реЙрд░рд╡рд░реНрдб рдХрд░рддрд╛ рд╣реИред

рд╡рд░реНрдХрд▓реЗрдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдлрд╝реНрд▓реЛрдЯ-рд╕реЗ-PCM рдХрдиреНрд╡рд░реНрдЬрд╝рди рд╣реИ:

// pcm-worklet.ts - registered via audioContext.audioWorklet.addModule()
class PCMWorklet extends AudioWorkletProcessor {
  process(inputs: Float32Array[][]) {
    const channel = inputs[0]?.[0]; // mono; Float32, range [-1, 1]
    if (!channel) return true;
    const pcm = new Int16Array(channel.length);
    for (let i = 0; i < channel.length; i++) {
      const s = Math.max(-1, Math.min(1, channel[i]));
      pcm[i] = s < 0 ? s * 0x8000 : s * 0x7fff;
    }
    // Transfer the buffer to the main thread without copying.
    this.port.postMessage(pcm.buffer, [pcm.buffer]);
    return true;
  }
}
registerProcessor("pcm-worklet", PCMWorklet);

рдХреЛрдб рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди

рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рддреАрди рд╣рд┐рд╕реНрд╕реЗ рд╣реИрдВ: рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдЬреЛ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рдХреИрдкреНрдЪрд░ рдХрд░рдХреЗ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ PCM рд╕реНрдЯреНрд░реАрдо рдХрд░рддрд╛ рд╣реИ, рдПрдХ Node рд╕рд░реНрд╡рд░ рдЬреЛ рдСрдбрд┐рдпреЛ рдХреЛ Scribe v2 Realtime рддрдХ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рд░рд┐рд▓реЗ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреНрд▓рд╛рдЗрдВрдЯ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдЯреЗрд▓реАрдлрд╝реЛрдиреА рдмреНрд░рд┐рдЬ рд╕реЗ PCM рд╕реНрдЯреНрд░реАрдо рдХрд░рддрд╛ рд╣реИред

рд░рд┐рдХрдЧреНрдирд╛рдЗрдЬрд╝рд░ рдХреЛ рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рд░реНрд╡рд░ рд░рд┐рд▓реЗ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдг рд╣реИ: рдЖрдкрдХреА ElevenLabs API key рдЧреБрдкреНрдд рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЛрдб рдореЗрдВ рдХрднреА рдирд╣реАрдВ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред key рд╕рд░реНрд╡рд░ рдкрд░ рд░рд╣рддреА рд╣реИред рдЕрдЧрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд╕реАрдзреЗ рд░рд┐рдХрдЧреНрдирд╛рдЗрдЬрд╝рд░ рд╕реЗ рдмрд╛рдд рдХрд░рдиреА рд╣реА рд╣реЛ, рддреЛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдХрдо рд╕рдордп рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп, рдПрдХ рдмрд╛рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдЯреЛрдХрди рдмрдирд╛рдПрдВ рдФрд░ API key рдХреА рдЬрдЧрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡рд╣ рджреЗрдВред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд▓рд╛рдЗрдВрдЯ

рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рд╕реЗ WebSocket рдЦреЛрд▓рддрд╛ рд╣реИ, рдКрдкрд░ рджрд┐рдП рд╡рд░реНрдХрд▓реЗрдЯ рд╕реЗ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рд░ PCM рдлрд╝реНрд░реЗрдо рдмрдирддреЗ рд╣реА рдлрд╝реЙрд░рд╡рд░реНрдб рдХрд░рддрд╛ рд╣реИред рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЗрд╡реЗрдВрдЯ (рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд░реНрд╡рд░ рдкрд╣рд▓реЗ рд╣реА { type, text } рдореЗрдВ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝ рдХрд░ рдЪреБрдХрд╛ рд╣реИ) рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рдкрд╛рд░реНрд╢рд┐рдпрд▓/рдлрд╝рд╛рдЗрдирд▓ рд╕реНрдЯреЗрдЯ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:

// client.ts - runs in the browser. ws is an open WebSocket to your server.
const audioContext = new AudioContext({ sampleRate: 16000 });
await audioContext.audioWorklet.addModule("pcm-worklet.js");

const mediaStream = await navigator.mediaDevices.getUserMedia({
  audio: { channelCount: 1, echoCancellation: true, noiseSuppression: true },
});

const source = audioContext.createMediaStreamSource(mediaStream);
const worklet = new AudioWorkletNode(audioContext, "pcm-worklet");

// Forward each PCM frame to the server the moment it is produced.
worklet.port.onmessage = (e: MessageEvent<ArrayBuffer>) => {
  if (ws.readyState === WebSocket.OPEN) ws.send(e.data);
};
source.connect(worklet);

// Manual commit: tell the server to finalize the current segment.
const commit = () => ws.send(JSON.stringify({ type: "commit" }));

рд╕рд░реНрд╡рд░ рд░рд┐рд▓реЗ

рд╕рд░реНрд╡рд░ рд╣рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХрдЧреНрдирд╛рдЗрдЬрд╝рд░ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рддрд╛ рд╣реИ, API key рд╕рд░реНрд╡рд░ рдкрд░ рд░рдЦрддрд╛ рд╣реИ, рдмрд╛рдЗрдирд░реА PCM рдХреЛ рд╕реАрдзреЗ рдлрд╝реЙрд░рд╡рд░реНрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рд┐рдХрдЧреНрдирд╛рдЗрдЬрд╝рд░ рдЗрд╡реЗрдВрдЯ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдерд┐рд░ { type, text } рдЖрдХрд╛рд░ рдореЗрдВ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ:

// server.ts - Node, using the `ws` library. ELEVENLABS_API_KEY and the
// recognizer URL come from the environment; see the Speech to Text reference
// for the exact path and query parameters.
import { WebSocketServer, WebSocket } from "ws";

new WebSocketServer({ port: 8080 }).on("connection", (client) => {
  // The API key stays on the server, never on the wire to the browser.
  const recognizer = new WebSocket(process.env.RECOGNIZER_WSS_URL!, {
    headers: { "xi-api-key": process.env.ELEVENLABS_API_KEY! },
  });

  // Browser -> recognizer: forward binary PCM, translate control messages.
  client.on("message", (data, isBinary) => {
    if (recognizer.readyState !== WebSocket.OPEN) return;
    if (isBinary) recognizer.send(data); // raw PCM bytes
    else if (JSON.parse(data.toString()).type === "commit")
      recognizer.send(sendCommit());
  });

  // Recognizer -> browser: normalize events into a stable shape.
  recognizer.on("message", (raw) => {
    const event = parseRecognizerEvent(raw.toString());
    if (event && client.readyState === WebSocket.OPEN)
      client.send(JSON.stringify(event));
  });

  // ... open handshake, queueing pre-open audio, and teardown on close/error
});

рдПрдВрдбрдкреЙрдЗрдВрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рднреА рдЪреАрдЬрд╝реЗрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рджреЛ рдЕрдбреИрдкреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВред рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреЛ рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рд░реЗрдлрд░реЗрдВрд╕ рдореЗрдВ рджрд┐рдП рд╕рдЯреАрдХ рдирд╛рдореЛрдВ рд╕реЗ рдмрджрд▓реЗрдВ; рдмрд╛рдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдирд╣реАрдВ рдмрджрд▓реЗрдЧреА:

// The single place that knows the recognizer's wire format.
const sendCommit = (): string => JSON.stringify({ type: "commit" });

type NormalizedEvent =
  | { type: "partial"; text: string }
  | { type: "final"; text: string }
  | { type: "vad"; speaking: boolean };

function parseRecognizerEvent(raw: string): NormalizedEvent | null {
  const msg = JSON.parse(raw);
  if (msg.is_final === true || msg.type === "final")
    return { type: "final", text: msg.text ?? "" };
  if (msg.type === "vad") return { type: "vad", speaking: !!msg.speaking };
  if (typeof msg.text === "string")
    return { type: "partial", text: msg.text };
  return null;
}

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмреИрдХрдПрдВрдб рдХреНрд▓рд╛рдЗрдВрдЯ

рдмреИрдХрдПрдВрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП, рдпрд╣реА рд░рд┐рдХрдЧреНрдирд╛рдЗрдЬрд╝рд░ рдХрдиреЗрдХреНрд╢рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмрд┐рдирд╛ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдХрд┐рд╕реА рднреА рд╕реНрд░реЛрдд рд╕реЗ PCM рдкрдврд╝реЗрдВ, рдЙрд╕реЗ рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдЪрдВрдХ рдХреИрдбреЗрдВрд╕ рдкрд░ рднреЗрдЬреЗрдВ рдФрд░ рдЗрд╡реЗрдВрдЯ рд╡рд╛рдкрд╕ рдкрдврд╝реЗрдВред API key рдФрд░ URL, рд╕рд░реНрд╡рд░ рдХреА рддрд░рд╣, рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╕реЗ рдЖрддреЗ рд╣реИрдВред

// stream-stt.ts - pace ~100ms chunks at real time, then commit the tail.
const SAMPLE_RATE = 16000, CHUNK_MS = 100;
const CHUNK_BYTES = (SAMPLE_RATE * 2 * CHUNK_MS) / 1000; // 3200 bytes
const ws = new WebSocket(process.env.RECOGNIZER_WSS_URL!, {
  headers: { "xi-api-key": process.env.ELEVENLABS_API_KEY! },
});

// Send: walk the PCM buffer in 100ms chunks, sleeping between to mimic a
// live source. For audio that already arrives in real time, drop the sleep.
async function sendAudio(pcm: Buffer) {
  for (let off = 0; off < pcm.length; off += CHUNK_BYTES) {
    ws.send(pcm.subarray(off, off + CHUNK_BYTES));
    await new Promise((r) => setTimeout(r, CHUNK_MS));
  }
  ws.send(JSON.stringify({ type: "commit" })); // finalize the trailing segment
}

// Receive: print partials in place, append finals.
ws.on("message", (raw) => {
  const e = parseRecognizerEvent(raw.toString());
  if (e?.type === "final") console.log(`[final]   ${e.text}`);
  else if (e?.type === "partial") process.stdout.write(`[partial] ${e.text}\r`);
});

рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рд▓реЗрдЯреЗрдВрд╕реА рдФрд░ рд╡рд░реНрдб рдПрд░рд░ рд░реЗрдЯ рдХрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ

рд▓реЗрдЯреЗрдВрд╕реА рдФрд░ рд╡рд░реНрдб рдПрд░рд░ рд░реЗрдЯ, рджреЛрдиреЛрдВ рд╕реНрдкреАрдХрд░, рднрд╛рд╖рд╛, рдзреНрд╡рдирд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ, рдСрдбрд┐рдпреЛ рдХреА рд▓рдВрдмрд╛рдИ, рд╣рд░ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдирд┐рдХрдЯрддрдо рд░реАрдЬрди рддрдХ рдЖрдкрдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд╛рде рдФрд░ рд╣рд░ рд╕реЗрд╡рд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд▓реЛрдб рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВред

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

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

рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рд▓реЗрдЯреЗрдВрд╕реА рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдорд╛рдкреЗрдВ

рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рд▓реЗрдЯреЗрдВрд╕реА рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд░рддреЗ рд╕рдордп рдпреЗ рдореБрдЦреНрдп рдореЗрдЯреНрд░рд┐рдХ рдорд╛рдкреЗрдВ:

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

рдирд┐рдпрдВрддреНрд░рдг

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

рдпрд╣рд╛рдВ рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рд▓реЗрдЯреЗрдВрд╕реА рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдХреЗ рдореБрдЦреНрдп рдирд┐рдпрдВрддреНрд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ:

  • рдПрдХ рдЬреИрд╕рд╛ рдСрдбрд┐рдпреЛ: рд╣рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓реЗрдВ, рдПрдХ рд╣реА рд╕реИрдВрдкрд▓ рд░реЗрдЯ рдФрд░ рдПрдХ рд╣реА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рджреЗрдВред
  • рдПрдХ рдЬреИрд╕реА рдкреЗрд╕рд┐рдВрдЧ: рд╣рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХ рд╣реА рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдЪрдВрдХ рдХреИрдбреЗрдВрд╕ рдкрд░ рд╕реНрдЯреНрд░реАрдо рдХрд░реЗрдВ (рдЬреИрд╕реЗ 100ms рдЪрдВрдХ)ред
  • рджреЛрд╣рд░рд╛рдПрдВ рдФрд░ рд╡рд┐рддрд░рдг рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ: рд╣рд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рджрд┐рдирднрд░ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЪрд▓рд╛рдПрдВ; рдорд╛рдзреНрдпрд┐рдХрд╛ рдФрд░ рдЯреЗрд▓ (p50/p95) рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВред
  • рдПрдХ рдЬреИрд╕реЗ рд░реЗрдлрд░реЗрдВрд╕ рдФрд░ рд╕реНрдХреЛрд░рд┐рдВрдЧ:WER рдХреИрд▓рдХреБрд▓реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдПрдХ рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ (рдЕрдХреНрд╖рд░ рдХреЗрд╕, рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди, рд╕рдВрдЦреНрдпрд╛рдПрдВ)ред
  • рд░реАрдЬрди рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдмрддрд╛рдПрдВ: рд╣рд╛рд░реНрдиреЗрд╕ рдХрд╣рд╛рдВ рдЪрд▓рд╛ рдФрд░ рд╣рд░ рдкреНрд░рджрд╛рддрд╛ рддрдХ рдХрд╛ рдкрд╛рде рдХреНрдпрд╛ рдерд╛, рдпрд╣ рдмрддрд╛рдПрдВред

рдЗрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдЬреИрд╕рд╛ рд░рдЦрдХрд░ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдореЗрдЯреНрд░рд┐рдХ рдорд┐рд▓реЗрдВрдЧреЗред

рд╣рд╛рд░реНрдиреЗрд╕ рдХрд╛ рдврд╛рдВрдЪрд╛

рдорд╛рдкрди рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдЕрдбреИрдкреНрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╢рд┐рдпрд▓ рддрдХ рдХрд╛ рд╕рдордп, рдлрд╝рд╛рдЗрдирд▓рд╛рдЗрдЬрд╝реЗрд╢рди рджреЗрд░реА рдФрд░ рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдЪрд░реНрди рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ:

// benchmark.ts - measurement core; one StreamFn adapter per provider.
type StreamFn = (
  audioPath: string,
  onEvent: (kind: "partial" | "final", text: string) => void,
  result: RunResult
) => Promise<void>; // adapter sets result.lastChunkSentAt on the final chunk

interface RunResult {
  firstPartialMs?: number;
  finalLagMs?: number;
  hypothesis: string;
  partialEdits: number;
  lastChunkSentAt: number;
  startedAt: number;
}

async function measure(streamFn: StreamFn, audioPath: string): Promise<RunResult> {
  const result: RunResult = {
    hypothesis: "", partialEdits: 0, lastChunkSentAt: 0,
    startedAt: performance.now(),
  };
  let prevPartial = "";

  await streamFn(audioPath, (kind, text) => {
    const now = performance.now();
    if (kind === "partial") {
      if (text && result.firstPartialMs === undefined)
        result.firstPartialMs = now - result.startedAt;
      if (text !== prevPartial) { result.partialEdits++; prevPartial = text; }
    } else { // final
      result.hypothesis = result.hypothesis ? `${result.hypothesis} ${text}` : text;
      if (result.lastChunkSentAt)
        result.finalLagMs = now - result.lastChunkSentAt;
    }
  }, result);

  return result;
}

рд╡рд░реНрдб рдПрд░рд░ рд░реЗрдЯ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рдЯреЗрдХреНрд╕реНрдЯ рдкрд░ рдорд╛рдирдХ рдЯреЛрдХрди-рд╕реНрддрд░реАрдп Levenshtein рджреВрд░реА рд╣реИред рдЗрд╕реЗ рдХреИрд▓рдХреБрд▓реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд░реЗрдлрд░реЗрдВрд╕ рдФрд░ рд╣рд╛рдЗрдкреЛрдереЗрд╕рд┐рд╕, рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рддрд░рд╣ рд▓реЛрдЕрд░рдХреЗрд╕ рдХрд░реЗрдВ рдФрд░ рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рд╣рдЯрд╛рдПрдВ, рд╡рд░рдирд╛ рдЖрдк рдореЙрдбрд▓ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдорд╛рдкреЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдк рдХреЛ рдПрдХ рдРрд╕реЗ рд▓реВрдк рдореЗрдВ рд░рдЦреЗрдВ рдЬреЛ рд╣рд░ рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдХреЗ рд▓рд┐рдП рд╣рд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рдЧрднрдЧ 10 рдмрд╛рд░ рдЪрд▓рд╛рдП рдФрд░ рдорд╛рдзреНрдпрд┐рдХрд╛ рдкрд╣рд▓реЗ-рдкрд╛рд░реНрд╢рд┐рдпрд▓ рд╕рдордп рд╡ рдорд╛рдзреНрдпрд┐рдХрд╛ WER (p50/p95) рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдирдореВрдиреЗ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рднрд┐рдиреНрдирддрд╛ рдХрд╛ рдмрд╣реБрдд рдЕрд╕рд░ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рджреЛ рдЪреАрдЬрд╝реЗрдВ рджреЗрдиреА рд╣реЛрдВрдЧреАред рдкрд╣рд▓реЗ, рд╣рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ StreamFn рдЕрдбреИрдкреНрдЯрд░ рд▓рд┐рдЦреЗрдВред рдКрдкрд░ рджрд┐рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд╣рд▓реЗ рд╕реЗ рдПрдХ рд╣реИ; рдмрд╛рдХреА рдХреЗ рдЕрдбреИрдкреНрдЯрд░ рднреА рдЙрд╕реА (audioPath, onEvent, result) рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЖрдЦрд┐рд░реА рдСрдбрд┐рдпреЛ рдЪрдВрдХ рдЬрд╛рдиреЗ рдкрд░ result.lastChunkSentAt рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░рд╛, рдЕрдкрдиреА рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рдФрд░ рд░реЗрдлрд░реЗрдВрд╕ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЙрди рдкрд░ measures рдХреЙрд▓ рдХрд░реЗрдВред рдЗрд╕реЗ рдРрд╕реЗ рдорд╢реАрди рд╕реЗ рдЪрд▓рд╛рдПрдВ рдЬреЛ рдЖрдкрдХреЗ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реЛ, рдРрд╕реЗ рдСрдбрд┐рдпреЛ рдкрд░ рдЬреЛ рдЖрдкрдХреЗ рдпреВрдЬрд╝рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реЛ, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓рд╛ рддреБрд▓рдирд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред

рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рдкрд╛рдиреЗ рдХрд╛ рд╕рд╛рд░

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдордиреЗ рдХрдИ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓ рдмрджрд▓рд╛рд╡реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рдЬрд┐рдирд╕реЗ рдЖрдк рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЪрд░рдгрдмрджреНрдз рддрд░реАрдХреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдХрд░ рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рдХреА рдУрд░ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░реЛрдбрдХреНрд╢рди рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо STT рд╕рд┐рд╕реНрдЯрдо рдХреБрдЫ рдореБрдЦреНрдп рдирд┐рд░реНрдгрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:

  • рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ: рд╕рд░рд▓рддрд╛ рдФрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП WebSocket рдЪреБрдиреЗрдВ; рд▓реЙрд╕ рдЯреЙрд▓рд░реЗрдВрд╕ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ WebRTC рдЪреБрдиреЗрдВред
  • рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдФрд░ рдлрд╝рд╛рдЗрдирд▓: рдкрд╛рд░реНрд╢рд┐рдпрд▓ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рдФрд░ рдлрд╝рд╛рдЗрдирд▓ рдХреЛ рдХрдорд┐рдЯ рдХрд┐рдпрд╛ рд╣реБрдЖ рдорд╛рдиреЗрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд░реЗрдВрдбрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпреВрдЬрд╝рд░ рд▓рд╛рдЗрд╡ рдЯреЗрдХреНрд╕реНрдЯ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдВред
  • рдПрдВрдб-рдкреЙрдЗрдВрдЯрд┐рдВрдЧ: рд╣реИрдВрдбреНрд╕-рдлрд╝реНрд░реА рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП VAD, рдУрд╡рд░рд░рд╛рдЗрдб рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рдХрдорд┐рдЯ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ рдФрд░ рдЪреБрдкреНрдкреА рдХреА рд╕реАрдорд╛ рдХреЛ рдХрд┐рд╕реА рд╕реНрдерд┐рд░ рдорд╛рди рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЯреНрдпреВрди рдХрд░реЗрдВред
  • рдЗрди-рд╕реНрдЯреНрд░реАрдо рд╕реБрд╡рд┐рдзрд╛рдПрдВ: рдЗрди-рд╕реНрдЯреНрд░реАрдо рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдХреЗрд╡рд▓ рд╡рд╣реАрдВ рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рд▓рд╛рдЗрд╡ рдЕрдиреБрднрд╡ рдХреЛ рдЙрдирдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛ, рдФрд░ рдмрд╛рдХреА рдХреЛ Scribe v2 рдХреЗ рд╕рд╛рде рдмреИрдЪ рдкрд╛рд╕ рдореЗрдВ рд░рдЦреЗрдВред
  • рдСрдбрд┐рдпреЛ рдлрд╝реЙрд░реНрдореЗрдЯ: рдЫреЛрдЯреЗ PCM рдлрд╝реНрд░реЗрдо рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ, ~100ms рдЪрдВрдХ рднреЗрдЬреЗрдВ рдФрд░ рдЯреЗрд▓реАрдлрд╝реЛрдиреА рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдлрд╝реЙрд░реНрдореЗрдЯ рд╕реЗ рдореЗрд▓ рд░рдЦреЗрдВред
  • рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ: рдЕрдкрдиреЗ рдСрдбрд┐рдпреЛ рдФрд░ рд▓рдХреНрд╖рд┐рдд рдореЗрдЯреНрд░рд┐рдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдЯреАрдХрддрд╛ рд╡ рд▓реЗрдЯреЗрдВрд╕реА рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЕрдиреБрднрд╡рдЬрдиреНрдп рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВред
  • API рд╕реБрд░рдХреНрд╖рд╛: рдЕрдкрдиреА API key рд╕рд░реНрд╡рд░ рдкрд░ рд░рдЦреЗрдВ, рдпрд╛ рд╕реАрдзреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЯреЛрдХрди рдмрдирд╛рдПрдВред

рдЕрдЧрд░ рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЙрдЗрд╕ рдПрдЬреЗрдВрдЯ рдореЗрдВ рд▓реЗрдЯреЗрдВрд╕реА рдХреИрд╕реЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░реЗрдВ, рддреЛ рд╣рдордиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рдЧрд╛рдЗрдб рд▓рд┐рдЦреА рд╣реИред

Scribe v2 Realtime рдХреЗ рд╕рд╛рде рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдПрдВ

Scribe v2 Realtime рд▓рдЧрднрдЧ 150ms рдореЙрдбрд▓ рд▓реЗрдЯреЗрдВрд╕реА рдореЗрдВ рдкрд╛рд░реНрд╢рд┐рдпрд▓ рджреЗрддрд╛ рд╣реИред рдЖрдкрдХреЗ рдпреВрдЬрд╝рд░ рдХреЛ рдпрд╣ рдЖрдВрдХрдбрд╝рд╛ рдорд╣рд╕реВрд╕ рд╣реЛрдЧрд╛ рдпрд╛ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ, рдпрд╣ рдЙрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИтАФрдФрд░ рд╡рд╣реА рд╣рд┐рд╕реНрд╕рд╛ рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рджреА рдЧрдИ рд░рдгрдиреАрддрд┐рдпрд╛рдВ рдЕрдкрдирд╛рдХрд░ рдЖрдк рдРрд╕реА рдмреЗрд╣рддрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рд▓реЗрдЯреЗрдВрд╕реА рдШрдЯрд╛рддреА рд╣реИ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрднрд╡ рдмреЗрд╣рддрд░ рдХрд░рддреА рд╣реИред

рдФрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рдХреНрд╖рдорддрд╛рдПрдВ рдУрд╡рд░рд╡реНрдпреВ рджреЗрдЦреЗрдВ, рдкреВрд░реА рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рднрд╛рд╖рд╛ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓реНрд╕ рд░реЗрдлрд░реЗрдВрд╕ рдкрдврд╝реЗрдВ, рдФрд░ рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдкреНрд░реЛрдбрдХреНрдЯ рдкреЗрдЬ рджреЗрдЦреЗрдВ: рд░рд┐рдпрд▓рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ API рдФрд░ рд░рд┐рдпрд▓рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯред

рдЬрдм рдЖрдк рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдВ, рдореБрдлрд╝реНрдд ElevenLabs рдЕрдХрд╛рдЙрдВрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЖрдЬ рд╣реА рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рд╕реНрдЯреНрд░реАрдо рдХрд░реЗрдВред

рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреАрдЪ рдЯреВ рдЯреЗрдХреНрд╕реНрдЯ рд▓реЗрдЯреЗрдВрд╕реА: рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╡рд╛рд▓

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

Tadas Petra рдПрдХ рдбреЗрд╡рд▓рдкрд░ рд░рд┐рд▓реЗрд╢рдВрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░ рд╣реИрдВ, рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ ElevenLabs рдХреЗ рдкреНрд░реЛрдбрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣ Hungrimind рдХреЗ рдлрд╛рдЙрдВрдбрд░ рднреА рд╣реИрдВ, рдЬреЛ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдПрдЬреБрдХреЗрд╢рди рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рд╡рд╣ Agora рдореЗрдВ рд▓реАрдб рдбреЗрд╡рд▓рдкрд░ рдПрдбрд╡реЛрдХреЗрдЯ рдФрд░ Zero To Mastery рдореЗрдВ рдЗрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдереЗред

рд╕рдВрдмрдВрдзрд┐рдд рд▓реЗрдЦ

рдЙрдЪреНрдЪрддрдо рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ AI рдСрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдмрдирд╛рдПрдВ