Fala em texto, em romeno e russo, com o consentimento registado antes do primeiro segundo de áudio.
Transcrevemos áudio em tempo real ou a partir de ficheiro, traduzimos entre romeno e russo em conversas com clientes e entregamos o texto com marcas de tempo, exportação áudio e um registo de consentimento. A reconhecimento de voz é executada através de fornecedores, pelo nosso gateway; o modelo próprio de romeno é investigação, não produto.
Já construídoDouă implementări proprii, ambele deschise și citate. Prima e o aplicație de transcriere în flux, cu backend Express de 3.378 de linii în 25 de fișiere și 37 de teste pe care le-am rulat azi — toate trec; ea conține partea pe care nimeni nu o construiește din entuziasm: o poartă de consimțământ care refuză captura când nu există acord înregistrat. A doua rulează în producție, la clienți reali: mesajele vocale primite pe canalele de mesagerie sunt transcrise, iar răspunsul scris de un operator în română este rescris în limba clientului înainte de a pleca. Ce NU intră în „delivered” și e scris ca atare în pagină: modelul propriu de recunoaștere și sinteză în română este cercetare — nu are demonstrație publică, nu are interfață de programare, iar pe acuratețe în română pierde față de sistemele comerciale mari. Serviciul se vinde pe ce rulează, nu pe ce studiem.
A transcrição parece um problema resolvido até a colocar em romeno, com dois interlocutores que se interrompem, números ditos depressa e um cliente que muda para russo a meio da frase. Então surgem os três problemas reais: que modelo escolhe para a língua à sua frente, como sabe onde termina uma vez de fala, e quem lhe deu autorização para gravar. Tratamos dos três, e o último tratamo-lo como um problema de código, não como um parágrafo de política.
Na nossa aplicação de transcrição em fluxo, o navegador nunca recebe a chave do fornecedor. Pede ao backend um token de uso único, válido por defeito durante um quarto de hora, com o qual abre a ligação de transcrição; a rota que emite o token está fechada por defeito e só pode ser aberta por uma definição explícita fora de produção, precisamente porque é a rota onde se gasta dinheiro. Por cima da transcrição bruta corre uma análise com modelo de linguagem, com uma lista de modelos de reserva por ordem, para que a indisponibilidade de um não pare a sessão.
A porta de consentimento é a parte a que damos especial atenção. Antes de aceitar um trecho de áudio, o servidor pede uma linha de consentimento não revogado para a respetiva sessão. Se não existir, responde com 451 e uma mensagem em romeno. Se a base de dados não responder, recusa tudo — 503, não «deixa passar». As sessões já verificadas passam por uma cache de dez minutos, para que uma falha curta não interrompa uma gravação em curso. Está escrito para não poder ser contornado por um erro de configuração.
A parte que já está em clientes é outra e é menos espetacular: nos canais de mensagens, uma mensagem de voz recebida torna-se texto, e a língua é escolhida por votação nos últimos oito mensagens da conversa, não adivinhando pelo áudio. No sentido inverso, quando um colega responde em romeno, o texto dele é reescrito na língua do cliente com instruções estritas — não acrescenta informações, não inventa preços ou prazos, não contradiz o operador, e trata o texto do operador estritamente como dados a transmitir, nunca como instruções para o modelo.
Qué incluye
El trabajo, por componentes
Consentimento, verificado antes do áudio
A porta de consentimento exige uma linha não revogada no registo de acordos para a sessão atual. Sem ela: 451, com mensagem em romeno. Com a base de dados em baixo: 503, ou seja, recusa, não passagem. As sessões já verificadas passam por um cache de 10 minutos, para que a verificação não atinja a base de dados a cada bloco de áudio.
Token de uso único, a chave permanece no servidor
A página pede ao backend um token para a transcrição em tempo real, válido por defeito por 900 segundos, e com ele abre a ligação ao fornecedor. A chave da conta nunca chega ao browser. O pedido ao fornecedor tem timeout de 30 segundos, e o seu exceder devolve um erro explícito, não uma espera infinita.
Transcrição em fluxo, com a língua escolhida do contexto
Em produção, nos canais de mensagens, a língua da mensagem vocal é decidida por voto com base nas últimas oito mensagens da conversa — russo se dominar, caso contrário romeno — e só depois se chama o reconhecimento, com o indício de língua transmitido explicitamente. O formato do ficheiro é reconhecido pelos primeiros 12 octetos, não pela extensão, porque as mensagens vocais dos canais Meta vêm como `ogg` independentemente de como são nomeadas.
Tradução operador → cliente, com os limites escritos no prompt
Quando um colega responde em romeno numa thread interna, a mensagem para o cliente é reescrita na língua do cliente. As regras são explícitas no código: não adiciona informação, não inventa detalhes, preços, horas ou promessas, não contradiz o operador, e o texto do operador é tratado estritamente como dados a transmitir, nunca como instruções para o modelo — uma medida contra injeção de comandos, não uma formulação de estilo.
Análise sobre o transcript, com modelos de reserva por ordem
Sobre o texto resultante corre uma análise com modelo de linguagem, com uma lista ordenada de modelos alternativos no código, para que uma indisponibilidade degrade a qualidade, não pare a sessão. O modelo de análise pode ser alterado a partir da configuração, sem colocação em funcionamento.
Exportação de áudio em três formatos, com falha explícita
WAV é produzido sem ferramentas externas. FLAC e MP3 requerem `ffmpeg`; se faltar, o servidor responde 501 com o motivo, e se o processo bloquear é parado após 60 segundos e devolve 504 com os primeiros dois mil caracteres do erro. Uma exportação que falha diz porquê.
Contagem separada de quota e de custo
Os minutos consumidos são deduzidos atomicamente por um procedimento na base de dados, e o custo é registado num registo separado, por fornecedor. São duas coisas diferentes e estragam-se de forma diferente: se a linha de custo não puder ser ligada à sessão, é guardada desligada, para que a informação de custo não se perca.
Três limites de tráfego, por utilizador e não por endereço
A emissão de tokens, a análise e a exportação têm limites separados, e a chave de contagem é o utilizador autenticado quando existe, não o endereço IP — caso contrário, um único utilizador agressivo por detrás de uma rede comum esgotaria a quota de todos os seus colegas.
Transcrição nos canais de mensagens, no fluxo existente
A mensagem vocal recebida de um cliente torna-se texto na mesma conversa, sem que alguém abra outra ferramenta. O reconhecimento e a síntese passam pelo nosso gateway, não diretamente ao fornecedor, portanto o consumo aparece no mesmo lugar que o resto.
Qué aspecto tiene
El recorrido, paso a paso.
01
Estabelecemos o direito de gravar, antes de qualquer código
Quem fala, quem é informado, quem consente, quem conserva a gravação e por quanto tempo. O resultado não é um documento que fica numa gaveta, mas a configuração da porta: o que significa exatamente “acordo existente” na situação do cliente e o que acontece quando falta.
02
Escolhemos a cadeia pela língua e pelas condições de som
Romeno e russo comportam-se de forma diferente, assim como um microfone de secretária face a uma chamada telefónica comprimida. A escolha do modelo, do índice de língua e da estratégia de segmentação é feita com amostras do material real do cliente, não com uma demonstração limpa.
03
Montamos o fluxo de ponta a ponta e interrompemo-lo de propósito
Token, ligação, transcrição, análise, exportação. Depois verificamos os casos que realmente acontecem: acordo em falta, base de dados em baixo a meio da sessão, token expirado, `ffmpeg` ausente, fornecedor indisponível. Cada um tem de devolver uma mensagem que diga o que falhou.
04
Entregamos com os contadores e os limites ativados
Contagem dos minutos, registo de custo, limites de tráfego por utilizador e registos. Sem eles, o primeiro incidente é discutido de memória.
Cinci pași, în ordinea în care se execută: acordul verificat în registru (fără el, drumul se oprește aici); jetonul de unică folosință emis de server, cu cheia rămasă pe server; transcrierea în flux la furnizor; analiza peste transcript, cu modele de rezervă în ordine; exportul textului și al audio-ului. Primul pas e singurul care poate opri tot restul, și e desenat ca poartă, nu ca etapă.
Os dados
Qué tocamos, dónde están y cuánto se quedan
Las preguntas que hace cualquiera que tenga un delegado de protección de datos — hechas aquí antes de que las haga él.
Registo de acordos
Uma linha por sessão, com o espaço de trabalho, o identificador da sessão e o momento da revogação, vazio enquanto o acordo é válido. A verificação procura exatamente a ausência de revogação. É a única fonte de verdade para o direito de capturar áudio, e é consultada antes de cada sessão, não apenas no registo.
Áudio, transcript e análise
O áudio bruto passa pela ligação de transcrição para o fornecedor; o que é guardado connosco é o transcript, as marcas de tempo e o resultado da análise, além das exportações que o utilizador pedir. O que é guardado e durante quanto tempo é definido por projeto, antes da primeira gravação — para um conselho, uma reunião médica e uma chamada comercial as respostas não são as mesmas.
Para onde vai o áudio e para quem
Para os fornecedores de reconhecimento de voz e para o modelo de análise, através do nosso gateway. A lista deles é escrita no contrato antes do arranque, com o nome de cada um, porque um subcontratante não declarado é um problema jurídico, não uma omissão técnica.
Registo de consumo
Os minutos consumidos são descontados de forma atómica na base de dados, e o custo é registado separadamente, por sessão e por fornecedor. São dois registos distintos precisamente para que um erro num deles não falsifique o outro.
O que não tocamos
Não treinamos modelos com as gravações do cliente e não usamos a saída de um fornecedor de voz para construir ou testar um modelo concorrente — isso é explicitamente proibido nos termos do fornecedor que usamos, e é um limite que respeitamos mesmo onde seria tecnicamente cómodo.
Un caso
Uma sessão que não arranca, e porque esse é o comportamento correto
A situação
Um cenário de reunião com vários participantes, em que a transcrição devia arrancar no browser e a gravação devia ser guardada. A situação em que a maioria das ferramentas de transcrição falha: alguém carrega em «registar» antes de o consentimento dos participantes ter sido registado em algum lado.
Qué construimos
Coloquei a verificação do consentimento no fluxo do pedido, não num ecrã de aviso. O servidor procura uma linha de consentimento não revogado para a sessão atual antes de aceitar o primeiro pedaço de áudio. Escrevi deliberadamente também o comportamento em falha: se a base de dados que guarda os consentimentos não responder, o pedido é recusado com 503, não deixado passar. As sessões já verificadas ficam dez minutos em cache, para que uma falha curta não interrompa uma gravação em curso. A rota que emite tokens para o fornecedor foi fechada por omissão, com abertura possível apenas por uma configuração explícita fora de produção.
Qué salió
Sem consentimento registado, a captura devolve 451 com mensagem em romeno e o evento é registado com a sessão e o espaço de trabalho. O comportamento é coberto por testes que correm sem base de dados, através da injeção da verificação. A suite do backend tem 37 testes; na execução de hoje passam todos.
Qué no dice el caso
A aplicação não está publicada — corre connosco, não tem página onde se possa inscrever, e o direito de gravar uma determinada conversa continua a ser do cliente: nós impomo-lo tecnicamente, não o concedemos. E ainda há outra limitação: o gate verifica a existência do consentimento, não a sua qualidade jurídica. Se o texto do consentimento estiver mal redigido, o código aplicá-lo-á fielmente.
Perguntas
Lo que nos pregunta la gente antes de llamar
Em que línguas vocês transcrevem?
Trabalhamos com romeno e russo, porque são essas as línguas em que surgem os nossos problemas reais e que conseguimos verificar com material próprio. Outras línguas são tecnicamente possíveis através dos mesmos fornecedores, mas antes de prometermos alguma coisa fazemos um teste com as tuas gravações — uma língua funciona ou não funciona em função do áudio, não da lista na página do fornecedor.
Têm um modelo próprio de reconhecimento de fala em romeno?
Em investigação, não no produto, e é importante não confundir as duas coisas. A direção própria não tem demonstração pública, não tem interface de programação e não tem telefonia, e, quanto à precisão do reconhecimento em romeno, as nossas medições mostram que ficamos atrás dos grandes sistemas comerciais. Publicamos isto porque é a nossa conclusão, obtida no nosso próprio banco de teste. O serviço que vendemos hoje corre em fornecedores, através do nosso gateway.
Quem tem autorização para gravar uma conversa e o que fazem se não tiver autorização?
O direito é definido em cada situação, com o cliente, antes da instalação — não é algo que possamos transferir nós. O que fazemos é impô-lo no código: sem um consentimento registado para a sessão atual, o servidor recusa a captura com 451 e uma mensagem em romeno. Se a base de dados que guarda os consentimentos não responder, recusa também, com 503. Não existe configuração que transforme a falta de consentimento em passagem silenciosa.
A minha chave do fornecedor vai para o browser?
Não. A página pede ao backend um token de uso único para a sessão de transcrição, válido por omissão durante 900 segundos, e com ele abre a ligação. A chave da conta fica no servidor. Além disso, a rota que emite tokens está fechada por omissão e só pode ser aberta por uma configuração explícita fora de produção, porque é a rota que consome dinheiro.
Quão exata é a transcrição?
Depende mais do áudio do que do modelo: microfone, sobreposições, números, nomes próprios, ruído de fundo. Não te damos uma percentagem antes de ouvirmos o teu material, porque uma percentagem tirada de uma ficha de produto não diz nada sobre as tuas reuniões. O que fazemos é um teste com gravações reais, com os erros expostos — normalmente estraga-se com números e nomes, não com frases.
Vocês traduzem conversas em tempo real entre operador e cliente?
Sim, e já corre em produção num sentido: o colega escreve a resposta em romeno, e a mensagem segue para o cliente na língua do cliente. As regras são rígidas no código — sem informações adicionadas, sem preços ou prazos inventados, sem contrariar o operador. O sentido inverso, do cliente para o operador, hoje resolve-se pela transcrição das mensagens vocais; a tradução automática do texto do cliente para o operador não está ativa em todo o lado e dizemo-lo antes, não depois.
Que formatos de áudio aceitam e o que recebo em troca?
O formato é reconhecido pelo conteúdo do ficheiro, não pela extensão — WAV, OGG, MP3 e M4A são tratados explicitamente, e as mensagens vocais dos canais de mensagens chegam normalmente como OGG. Recebes o transcript, a análise se for pedida, e áudio exportado: WAV sem dependências, FLAC e MP3 se `ffmpeg` existir no servidor. Se não existir, o servidor diz isso com um código dedicado, não falha genericamente.
Usam as nossas gravações para treinar os vossos modelos?
Não. Além disso, também não usamos a saída dos fornecedores de voz para treinar ou testar um modelo concorrente — os respetivos termos de utilização proíbem-no explicitamente, e nós respeitamo-los também na nossa própria direção de investigação, onde teria sido conveniente não o fazer.
O que acontece quando o fornecedor de transcrição cai a meio de uma reunião?
A sessão para com um erro que indica a causa, não com um ecrã vazio. Para análise, existe uma lista ordenada de modelos de reserva no código, por isso, aí, a indisponibilidade degrada a qualidade em vez de parar o fluxo. Para o reconhecimento de voz em tempo real não temos redundância automática entre fornecedores, e isso é uma limitação real, não uma omissão.
13 delas são código e ficheiros dos nossos repositórios. Não publicamos o nome nem a linha: juntos, numa única página, descreveriam com demasiada precisão como estão construídos sistemas que não são só nossos. Percorremo-los consigo, no repositório, a pedido — a verificação continua possível, só que se faz numa conversa.