É assim que a programação por voz deveria ser (Qwen Audio Agent)
Autoria: Better Stack · Assistir no YouTube
Vídeo de autoria do canal indicado, não da IANIA; todos os direitos pertencem ao criador. Transcrição, resumo e tradução gerados automaticamente; o conteúdo no idioma original é preservado na versão em idioma original.
Idioma original: inglês
Vídeo original: This Is What Voice Coding Was Supposed to Be (Qwen Audio Agent) · Canal: Better Stack · 09:19 · Assistir no YouTube
Tópicos: Agentes de IA, Engenharia de software com IA, Ferramentas de desenvolvimento com IA, Modelos locais e open source
O vídeo apresenta o Qwen Audio Agent, um runtime de código aberto que mantém a conversa por voz ativa enquanto um agent de programação executa tarefas em segundo plano. O sistema separa o agent de voz, responsável por respostas rápidas e interrupções, do agent de programação, conectado por ACP para mexer em arquivos e executar ferramentas. O apresentador demonstra tarefas paralelas, consulta de status e interrupções, além de comentar limitações como configuração complexa, dependência de serviços pagos da Alibaba e falta de números públicos de latência. A ideia central é que a programação por voz precisa resolver um problema de concorrência, não apenas melhorar a transcrição.
Pontos-chave
Seção intitulada “Pontos-chave”- O Qwen Audio Agent é um runtime, não um modelo, e não inclui pesos de modelo.
- O modo full duplex permite interromper a fala do agent e manter a conversa enquanto uma tarefa de programação continua em execução.
- O agent de voz responde a perguntas simples e gerencia a conversa; Claude Code executa o trabalho mais demorado por meio de ACP.
- É possível fazer perguntas, solicitar novas tarefas e consultar o andamento enquanto outra tarefa está sendo executada.
- O runtime é open source sob Apache 2.0, mas a opção de voz padrão usa uma API paga da Alibaba.
- Há um modo local com uma pipeline de speech-to-text do Hugging Face e backend MLX, mas sua configuração é mais limitada.
- O apresentador não encontrou números publicados de latência para o runtime.
- A principal contribuição da abordagem é manter a conversa ativa durante o trabalho, em vez de apenas converter fala em texto.
Capítulos
Seção intitulada “Capítulos”| Início | Capítulo | Resumo |
|---|---|---|
| 00:00 | Por que a programação por voz costuma parar | O vídeo contrasta a ditagem tradicional com uma abordagem full duplex que mantém a conversa ativa enquanto o trabalho acontece. |
| 01:33 | Configuração e interrupções | O apresentador descreve a configuração do sistema e demonstra como interromper a fala do agent sem esperar que ele termine. |
| 02:34 | Tarefas simultâneas na demonstração | O agent de voz responde a perguntas e recebe novas solicitações enquanto Claude Code trabalha em uma tarefa de refatoração. |
| 04:39 | Arquitetura com dois agents e ACP | O vídeo explica a separação entre o agent de voz e o agent de programação, além do uso de tarefas assíncronas e ACP. |
| 06:45 | Limitações, modo local e conclusão | O apresentador aborda os custos e as limitações de idioma e latência, explica a alternativa local e resume a importância da concorrência. |
Citações
Seção intitulada “Citações”Você trocou os dedos pela boca e não mudou praticamente nada. — 01:02
Estou falando com um agent, outro agent está fazendo o trabalho, e nenhum precisa parar porque o outro está ocupado. — 04:07
A camada de voz nunca fica bloqueada esperando a tarefa demorada. — 05:10
É um problema de concorrência, não um problema de fala. — 09:19
Conceitos e entidades
Seção intitulada “Conceitos e entidades”- Qwen Audio Agent (ferramenta): Runtime de programação por voz que separa a conversa do trabalho de programação executado em segundo plano.
- Claude Code (ferramenta): Agent de programação usado na demonstração para editar arquivos, executar ferramentas e realizar tarefas demoradas.
- ACP (conceito): Agent Client Protocol, usado para conectar o runtime ao agent de programação que executa o trabalho.
- full-duplex (conceito): Modo de interação em que usuário e sistema podem falar ao mesmo tempo, permitindo interrupções e conversa contínua.
- Alibaba DashScope (ferramenta): Serviço da Alibaba usado pelo caminho padrão de voz, que requer uma API key paga.
- MLX (ferramenta): Backend mencionado para executar localmente uma pipeline de speech-to-text em dispositivos Apple.
- OpenAI real-time API (ferramenta): API descrita no vídeo como a camada subjacente para entrada e saída de fala.
- Better Stack (empresa): Canal que publicou o vídeo sobre o Qwen Audio Agent.
Tradução completa (pt-BR)
Seção intitulada “Tradução completa (pt-BR)”00:00 A programação por voz desmorona no momento em que o agent precisa fazer um trabalho de verdade. “Refatore este arquivo, execute o build” — e então, silêncio. O agent desaparece, e ficamos olhando para o ícone do microfone, esperando que ele volte. O Qwen Audio Agent funciona de outro jeito. O Claude Code pode estar refatorando em segundo plano enquanto você continua falando com o agent de voz. E, quando a tarefa termina, ele pode interromper você e avisar que concluiu. E aqui vem a parte estranha: o Qwen Audio Agent não é um modelo. Ele não vem com nenhum peso de modelo. É um runtime construído em torno de uma coisa que a maioria dos sistemas de
00:31 programação por voz deixa completamente passar: manter a conversa ativa enquanto o trabalho de verdade acontece. Agora, deixe-me explicar por que isso importa, porque acho que a maioria das pessoas tem uma ideia errada sobre codificação por voz. A configuração mais comum é ditado. O Whisper escuta, transcreve e cola o texto no seu editor. Isso é útil, mas veja o que ele realmente substitui: substitui toda a parte de digitar. Você fica sentado ali,
01:02 e continua esperando. Você trocou os dedos pela boca e não mudou praticamente nada. Ainda assim, isso acelera as coisas. Full duplex significa outra coisa. Significa que os dois lados podem falar ao mesmo tempo. Você pode interromper no meio de uma frase e, mais importante, o que está do outro lado pode manter a conversa ativa enquanto o trabalho acontece em outro lugar. Essa segunda parte é a razão de tudo isso existir. Se você gosta de ferramentas de programação que aceleram seu workflow, não deixe de se inscrever. Publicamos vídeos o tempo todo. Certo, agora vou mostrar por que isso é diferente. Vou fazer o agent falar por
01:33 tempo demais de propósito. Não vou mentir: a configuração foi realmente frustrante. Estava tudo em chinês, então tive que acessar o site em inglês da Alibaba Cloud, configurar a interface desktop para o worker de frontend e backend com a chave de API da Alibaba e depois adicionar alguns créditos de API da Anthropic para o backend. Tive que traduzir parte daquilo. Mas, quando fica tudo sincronizado, funciona bem. Posso simplesmente falar sem apertar nada. Ele está sempre escutando, a menos que eu desligue o microfone. Então, vamos lá. Vou passar para você um repo de código em que
02:04 preciso que trabalhe. Ele começa a explicar isso. Certo. E aí, no meio, vou simplesmente dizer: “Pare. Está demorando demais. Entendi.” >> Entendido. >> E ele corta assim mesmo. Ele ouviu isso. Agora, acabou. Posso atualizar a partir daqui. Ele não termina a frase porque eu o interrompi. Não há um segundo extra de áudio brigando comigo depois que começo a falar aqui. O runtime realmente encerra o turno anterior e segue em frente. Vou colar aqui o caminho do repo em que vamos trabalhar.
02:34 Agora veja o que acontece com algo simples. Quanto é 19 * 24? Não mexa no repo. Recebi uma resposta imediata, porque o Claude Code nem precisava ver isso. O agent de voz consegue cuidar sozinho das coisas simples, o que é ótimo, porque não quero que toda pergunta aleatória vire uma tarefa enorme nem que consuma meus créditos de API da Anthropic. Mas agora vou pedir algo que leva um pouco mais de tempo. O repo de código que passei para ele contém apenas exercícios de TypeScript. Eu poderia ter escolhido algo mais difícil, mas vamos manter as coisas simples por enquanto.
03:05 Vou dizer: “Refatore o problema record em TS. Garanta que funcione corretamente.” Agora veja. A tarefa sai do agent de voz. O Claude Code a assume, e este cartão de trabalho aparece. É a prova de que o Claude realmente está com a tarefa agora. E, normalmente, é aqui que um sistema de programação por voz poderia desmoronar. Você pediu que ele fizesse algo de verdade. Então, agora precisa esperar. Só que aqui não preciso esperar. Posso dizer: “Além disso, você pode criar um arquivo JS normal com uma função async para lidar com requisições HTTP?”
03:37 Ele responde e faz as duas coisas enquanto ambas estão acontecendo lado a lado. O Claude continua trabalhando. Agora vou fazer uma pergunta aleatória. “Além disso, como está o tempo em Dubai?” Certo, consigo ler a resposta daqui. Obrigado. Mais uma resposta. A mesma conversa. E posso até perguntar sobre a tarefa em andamento sem precisar esperar que ela termine. “Ei, como está indo a refatoração? Não espere terminar, só me diga o
04:07 status.” Agora ele pode me dizer que o Claude está editando, executando testes ou ainda trabalhando. Basicamente, há duas coisas acontecendo ao mesmo tempo. Estou falando com um agent, outro agent está fazendo o trabalho, e nenhum dos dois precisa parar porque o outro está ocupado. Isso significa que, enquanto o Claude termina, posso simplesmente continuar. A tarefa de programação terminou, o resultado voltou para a conversa em andamento e não precisei verificar nada. Nunca vi um runtime desktop open source lidar com isso de forma tão limpa. Então, por baixo de tudo isso, a
04:39 configuração é bem simples. De um lado, temos o agent de voz. Certo, ótimo. Ele cuida da conversa, das interrupções, do status, do cancelamento e de muitas tarefas rápidas. Do outro lado, o Claude Code está conectado por meio do ACP. É ele que interage com os arquivos, executa ferramentas e faz o trabalho demorado. Agora, mecanicamente, há duas vias aqui. E, quando você percebe isso, o design fica um pouco mais claro. Há um agent de voz leve no frontend cuja única função é manter a conversa. Ele responde imediatamente às perguntas simples.
05:10 “Qual é o status?” “Cancele isso.” “Deixa para lá.” Depois, há o seu verdadeiro agent de programação no backend, e eles se comunicam pelo Agent Client Protocol, o ACP. O trabalho de verdade é encaminhado como uma tarefa async e executado por conta própria. Quando termina, o resultado é inserido de volta na conversa em andamento. Assim, a camada de voz nunca fica bloqueada esperando a tarefa demorada. E, como é um protocolo, e não uma integração, o backend pode ser trocado. Claude Code, Codex, Open Code e vários outros. Agora, um detalhe que quero
05:41 destacar, porque mostra que alguém realmente prestou atenção: a interrupção não é tratada aqui como um evento. É uma máquina de estados. Detectar a fala do usuário, marcar uma interrupção, emitir um sinal interpretado, suprimir ativamente qualquer áudio e transcrição ainda em andamento e, então, iniciar o novo turno. A própria nota de design deles diz que a qualidade da engenharia de interrupções determina a reputação. E eles têm razão. O que faz um assistente de voz parecer quebrado não são respostas lentas. É interrompê-lo e ainda ouvir mais um segundo e meio da frase anterior. Esse tipo
06:13 de intervalo é realmente bem irritante, e é grande. Às vezes, este também tem um pequeno atraso. Agora, como tudo isso se encaixa no que já conhecemos? Bem, a API de tempo real da OpenAI é a camada abaixo disso. É ela que faz a conversão de fala para fala. Isto funciona por cima e permite trocar de provedor. Pycat e LiveKit Agents são frameworks. Eles fornecem as peças, e você monta o pipeline. Isto já vem montado e direcionado a uma tarefa específica. E o pipeline de Whisper para LLM e depois para TTS que você mesmo escreveu é
06:45 o que muitos de nós temos, o que muitos de nós montamos. Agora, vamos falar sério por um instante, porque há duas coisas que o README não vai destacar logo de cara. Primeiro: o runtime é open source. A voz, não. O código é Apache 2.0, mas o caminho padrão, o que soa melhor, passa pelo DashScope da Alibaba com uma chave de API paga. Você recebe alguns créditos grátis, mas ainda assim é pago. A voz otimizada em tempo real só está disponível por API na nuvem. Não existe uma versão auto-hospedada da boa geração de áudio. Então, dizer que o agent de voz é open source
07:16 é apenas parcialmente verdade neste caso. Existe uma alternativa real, e dou crédito a eles por documentá-la: um modo totalmente local usando um pipeline de speech-to-text do Hugging Face com backend MLX em Apple Silicon, executado no MPS. No modo totalmente local, você não precisa de nenhuma chave de nuvem. É uma segunda instalação de Python, e o perfil ajustado na documentação está apenas em chinês. Certo, então traduza. Mas o caminho existe e foi direcionado especificamente ao Mac. Segundo ponto, e este importa mais: não há números de latência publicados em lugar algum, em nenhum hardware que procurei.
07:46 Certo, agora alguns pontos finais rápidos. Ele prioriza o chinês. A palavra de ativação é esta, que se traduz como isto. O principal artigo de design que explica a arquitetura full duplex está apenas em chinês. O perfil de voz ajustado está em chinês. O modelo usado por baixo afirma oferecer reconhecimento em mais de 100 idiomas e fala em algumas dezenas. Então, precisei traduzir a página para entender o essencial enquanto fazia todo o cadastro. Na versão 2.0, o Qwen já aparece listado como em desenvolvimento, com o
08:18 a arquitetura sendo reescrita, e o número de estrelas está crescendo mais rápido que o uso. 2.340 estrelas aqui, mas cerca de 4.000 downloads do npm por mês e, na versão mais recente, 92 downloads da versão para Mac, contra 502 da versão para Windows. Agora, se você já trabalha no Claude Code ou no Codex, como presumo que a maioria de vocês trabalhe, e quer que ele deixe de ficar preso ao teclado enquanto tarefas longas estão em execução, esta é a única ferramenta que encontrei que combina tarefas paralelas com conversas ao vivo — ou, pelo menos, a que faz isso muito bem. Baixe o
08:49 DMG. É uma versão universal assinada. Sem CUDA, sem Python, nada para compilar. Leva cerca de 10, talvez 15 minutos para integrar tudo. Se você quer uma pilha de voz totalmente aberta e totalmente local, não é isso. Mas o caminho com MLX é um ponto de partida real e oferece mais do que a maioria dos projetos. E a ideia que vale a pena levar consigo, aconteça o que acontecer com este repo específico, é que o que torna a voz útil para o trabalho de verdade não é uma transcrição melhor. A transcrição já foi resolvida. A questão é se o sistema consegue continuar conversando com você enquanto está ocupado. Esse é um problema de concorrência, não de fala
09:19 problema. E quase ninguém está tratando isso como tal. Aqui é o Josh, da Better Stack. Se você gosta de ferramentas de programação como esta, não deixe de se inscrever. Até o próximo vídeo. >> [música]
Transcrição original
[00:00] Voice coding falls apart the moment the agent has to do actual work. Refactor this file, run the build, and then silence. The agent disappears and we’re left staring at the mic icon, waiting for it to come back. Quen audio agent works differently. Claude code can be refactoring the background while you keep talking to the voice agent. And when the task finishes, it can interrupt you and tell you it’s done. And here’s the weird part. Quen audio agent isn’t a model. It ships zero model weights. It’s a runtime built around one thing most
[00:31] voice coding setups completely miss. Keeping the conversation alive while the actual work happens. Now let me set up why that matters because I think most people have the wrong idea about voice encoding. The usual setup is dictation. Whisper listens, transcribes, pastes text into your editor. That’s useful, but look at what actually it replaces. It replaces the whole typing part. You sit there,
[01:02] you still wait. You’ve swapped the fingers for your mouth and changed really nothing. It does speed things up, though. Full duplex means something different. It means both sides can talk at the same time. You can cut in mid-sentence, and more importantly, the thing on the other end can keep the conversation alive while work happens somewhere else. The second half is the whole reason this exists. If you enjoy coding tools that speed up your workflow, be sure to subscribe. We have videos coming out all the time. All right, now let me show you why this is different. I’m going to make it talk for
[01:33] way too long on purpose. Not going to lie, the setup was actually really frustrating. It was all in Chinese, so I had to go to the Alibaba cloud English site, set the desktop UI for frontend and backend worker with the Alibaba API key, and then add some anthropic API credits for the backend. I did have to translate some of that. Once it’s all synced, though, it does work pretty good. I can just speak without pressing anything. It’s always listening unless I turn off the mic. So, here we go. I’m going to give you a code repo that I
[02:04] need you to work on. It starts explaining that. Okay. And then halfway through, I’m just going to go here. Stop. Too long. I get it. >> Understood. >> And it cuts off just like that. It it listened to this. Now it’s all gone. I can refresh from here. It doesn’t finish the sentence because I cut it off. There’s no extra second of audio fighting me after I start talking here. The runtime actually kills the old turn and moves on. I’ll paste in the path to the repo that we are going to work on here.
[02:34] Now watch what happens with something simple. What’s 19 * 24? Don’t touch the repo. I got an immediate answer though because clawed code never needed to see that. The voice agent can handle the easy stuff itself, which is great because I don’t want every random question turning into a big task or racking up my API credits for anthropic. But now I’m going to give it something that actually takes a bit more time. The code repo that I gave it is just TypeScript practice problems. I could have chose something harder, but let’s just keep it straightforward for now.
[03:05] I’m going to say here, refactor record problem TS. Make sure it works correctly. Now watch this. The task leaves the voice agent. Claude code picks it up and this work card appears. It’s the proof that Claude actually has the job now. And normally this is where a voice coding setup could fall apart. You’ve asked it to do something real. So now you have to wait. Except here I don’t have to. I can say also can you go make me a normal JS file with an async function to handle HTTP
[03:37] requests? It answers and does both while they’re both running side by side. Claude is still working. Now I’m going to fire out a random question. Also, what is the weather like in Dubai? Okay, I can read it from here. Thanks. Another answer. Same conversation. And I can even ask about the task that is being worked on without having to wait for it. Hey, how’s the refactor going? Don’t wait for it to finish, just the
[04:07] status. Now it can tell me Claude is editing, running tests, or still working. There are basically two things happening at once. I’m talking to one agent, another agent is doing the work, and neither one has to stop because the other one is busy, which means while Claude finishes, I can just keep going. The coding task finished, the result came back into the live conversation, and I didn’t have to check anything. I haven’t seen an open- source desktop runtime handle that this cleanly. So underneath all this, the
[04:39] setup is actually pretty simple. On one side, we’ve got the voice agent. Okay, great. That handles conversation, interruptions, status, cancelling, a lot of the fast stuff. On the other side, clogged code is connected over ACP. That’s the side touching files, running tools, and doing the slow work. Now, mechanically, it’s really two lanes here. And once you see that, this design is a bit more obvious. There’s a lightweight front-end voice agent whose only job is to hold the conversation. It answers the easy questions immediately.
[05:10] What’s the status? Cancel that. Never mind. Then there is your real coding agent on the back end and they talk over the agent client protocol, the ACP. Real work gets handed over as an async task and runs on its own. When it finishes, the result gets injected back into the live conversation. So the voice layer never blocks on the slow thing. And because it’s a protocol rather than an integration, the backend is swappable. Clawed Code, Codeex, Open Code, and a bunch of others. Now, one detail I want
[05:41] to flag because it shows someone was actually paying attention to this interruption isn’t handled as an event here. It’s a state machine. Detect user speech, mark an interruption, admit an interpreted signal, actively surpass any audio and transcripts still in flight, then start the new term. Their own design note says the engineering quality of interruption determines the reputation. And they’re right. The thing that makes a voice assistant feel broken isn’t slow responses. It’s interrupting it and still hearing another second and a half of the former sentence. That kind
[06:13] of gap is actually rather annoying and a big gap. This has a slight one sometimes. Now, where does all this sit next to what we already know? Well, the OpenAI real-time API is the layer underneath this. It’s the thing that does speech in speech out. This runs on top and is provider pluggable. Pycat and LiveKit agents are frameworks. They give you the parts and you assemble the pipeline. This is assembled and pointed at a specific job. And to whisper to LLM to TTS pipeline you wrote yourself is
[06:45] the thing that a lot of us have, a lot of us build out. Now, let’s get real here for a second because there are two things here that the readme will not lead with. First, the runtime is open source. The voice is not. The code is Apache 2.0, but the default path, the best sounding one, roots through Alibaba’s Dash scope with a paid API key. You get some free credits, but it’s still paid. The optimized real-time voice is cloud API only. There is no self-hosted version of the good audio generation. So, open- source voice agent
[07:16] is only partially true here. There is a real escape hatch, and I’ll give them credit for documenting it. a fully local mode using a hugging face speechtoext pipeline with an MLX backend on Apple silicone running on MPS. In full local mode, you need no cloud key at all. It’s a second Python install and the tune profile in the docs is Chinese only. Okay, so translate it. But the path exists and it’s pointed at max specifically. Second thing, and this one matters more, there are no published
[07:46] latency numbers anywhere on any hardware I went looking. Okay, now a final quick points here. It’s Chinese first. The wake word is this, which translates to this. The main design article explaining the full duplex architecture is Chinese only. The tuned voice profile is Chinese. The model underneath claims a 100 plus languages for recognition and a few dozen for speech. So, I had to translate the page to understand the gist of it when I was signing up for all this. In version 2.0 know is already listed in development with the
[08:18] architecture being rewritten and the stars are running ahead of the usage. 23 2400 stars here but around 4,000 mpm downloads a month and on the latest release 92 downloaded the Mac version build against 502 on Windows. Now, if you already work inside Cloud Code or Codeex, which I assume most of you all do, and you want it to stop being chained to the keyboard while long tasks run, this is the only thing I found doing the parallel task plus line conversation together, or at least the one that does it really well. Get the
[08:49] DMG. It’s a signed universal build. No CUDA, no Python, nothing to compile. It takes about 10, maybe 15 minutes to get everything integrated. If you want a fully open, fully local voice stack, this isn’t it. But the MLX path is a real starting point and it’s more than most projects offer. And the idea worth taking away whatever happens to this particular repo is the thing that makes voice usable for real work isn’t better transcription. Transcription got solved. It’s whether the system can keep talking to you while it’s busy. That’s a concurrency problem, not a speech
[09:19] problem. And almost nobody is treating it like one. I’m Josh from Better Stack. If you enjoy coding tools like this, be sure to subscribe. We’ll see you in another video. >> [music]