G.711 é o codec que o seu agente de voz ouve na maioria das ligações telefônicas. Ele amostra o áudio 8.000 vezes por segundo, guarda cada amostra em 8 bits com uma de duas curvas logarítmicas, μ-law ou A-law, e envia o resultado a 64 kbit/s. A ITU publicou o padrão pela primeira vez como Recomendação G.711 em 1972, e ele ainda é o formato padrão na rede telefônica pública, na maioria dos troncos SIP e nos media streams da Twilio.
Se você constrói qualquer coisa que toque em áudio telefônico, mais cedo ou mais tarde vai lidar com bytes G.711. Este guia explica como o codec funciona, como diferenciar μ-law de A-law, como decodificar e codificar em poucas linhas de código, quais bugs transformam quem liga em chiado e como colocar e tirar áudio de 8 kHz dos modelos de voz sem conversões a mais. Ele foi escrito para engenheiros que ligam uma linha telefônica a reconhecimento de voz, um LLM e texto para voz.
G.711 em resumo
| Propriedade | Valor |
|---|---|
| Taxa de amostragem | 8.000 Hz |
| Bits por amostra | 8 (logarítmicos, não lineares) |
| Taxa de bits | 64 kbit/s por sentido |
| Banda de áudio | Cerca de 300 a 3.400 Hz |
| Variantes | μ-law (PCMU) e A-law (PCMA) |
| Payload RTP | PCMU = 0, PCMA = 8, ambos com clock de 8.000 Hz |
| Pacote de 20 ms | 160 amostras, 160 bytes de payload |
| Atraso do codec | Uma amostra (0,125 ms), sem look-ahead |
| Bytes de silêncio | μ-law 0xFF, A-law 0xD5 |
O pacote de 20 ms vem da RFC 3551, que define 20 ms como intervalo de empacotamento padrão para PCMU e PCMA. A maioria das operadoras e dos PBXs usa esse valor, então 160 bytes por pacote é o número que você vai ver nas capturas.
Como μ-law e A-law funcionam
Uma amostra linear de 16 bits descreve 65.536 níveis. A voz não precisa de tantos degraus iguais. Ela precisa de detalhe fino em volume baixo, onde fica quase toda a informação de uma voz, e de degraus grossos em volume alto, onde o ouvido não percebe erros pequenos.
O G.711 faz exatamente isso. Ele leva cada amostra para uma curva logarítmica, um processo chamado compansão (comprimir e depois expandir na decodificação). Cada código de 8 bits tem três partes: um bit de sinal, três bits que escolhem um de oito segmentos e quatro bits que escolhem um degrau dentro do segmento. Cada segmento cobre o dobro da faixa do anterior, então o tamanho do degrau dobra conforme o sinal fica mais alto.
As duas variantes distribuem os degraus de forma diferente:
- A μ-law parte de uma amostra linear de 14 bits e é usada na América do Norte e no Japão. Também é o único formato que os Media Streams da Twilio enviam e aceitam.
- A A-law parte de uma amostra linear de 13 bits e é usada na Europa, na Índia e na maioria dos outros países. Ela dá um pouco mais de resolução a sinais baixos.
As duas guardam uma faixa dinâmica de 13 ou 14 bits em 8 bits, e é por isso que o G.711 soa como uma ligação normal e não como um walkie-talkie. Quando uma ligação passa de um país μ-law para um país A-law, a rede faz a conversão, e o padrão diz que o enlace entre os dois usa A-law.
Como saber qual você tem
Normalmente não dá para saber só pelos bytes. Os dois são uma sequência de valores sem sinal de 8 bits, sem cabeçalho. Olhe os metadados ao redor:
- SDP.
a=rtpmap:0 PCMU/8000é μ-law.a=rtpmap:8 PCMA/8000é A-law. - Twilio Media Streams. A mensagem
startsempre diz"encoding": "audio/x-mulaw"e"sampleRate": 8000. A documentação de mensagens WebSocket da Twilio deixa claro que isso nunca muda. - Arquivos WAV. A tag de formato do bloco
fmté 7 para μ-law e 6 para A-law. Offprobemostrapcm_mulawoupcm_alaw. - Silêncio. Numa linha em silêncio, os bytes μ-law ficam perto de
0xFFe0x7E, e os A-law alternam entre0xD5e0x55. Um buffer cheio de0xFFé quase certamente silêncio μ-law, não um fluxo corrompido.
Se você errar, dá para ouvir. Quando codificamos um tom de 440 Hz como μ-law e decodificamos como A-law, a saída manteve só cerca de metade da correlação com o original em todos os volumes testados, e o volume oscilou entre metade e o dobro conforme o nível de entrada. Áudio com a lei errada é inteligível o bastante para você procurar o problema em outro lugar, e áspero o bastante para arruinar o reconhecimento de voz.
Decodificar e codificar G.711 em código
O caminho mais rápido é o FFmpeg, que lê e escreve as duas leis como fluxos brutos:
# μ-law bruto de uma ligação para um WAV de 16 bits que você consegue ouvir
ffmpeg -f mulaw -ar 8000 -ac 1 -i call.ulaw call.wav
# Qualquer arquivo de áudio para μ-law bruto a 8 kHz, pronto para a Twilio
ffmpeg -i prompt.wav -ar 8000 -ac 1 -f mulaw prompt.ulaw
# A-law: troque o nome do formato
ffmpeg -f alaw -ar 8000 -ac 1 -i call.alaw call.wav
Em Python, a biblioteca padrão fazia isso com o audioop, mas o audioop foi removido no Python 3.13. O pacote audioop-lts o traz de volta. Se preferir não depender dele, a μ-law cabe em poucas linhas de NumPy:
import numpy as np
def linear_to_mulaw(pcm: np.ndarray) -> bytes:
"""16-bit signed PCM samples -> G.711 mu-law bytes."""
x = pcm.astype(np.int32) >> 2 # 14-bit magnitude range
mask = np.where(x < 0, 0x7F, 0xFF)
x = np.minimum(np.abs(x), 8158) + 33 # clip, then add the bias
segment = np.floor(np.log2(x)).astype(np.int32) - 5
code = (segment << 4) | ((x >> (segment + 1)) & 0x0F)
return (code ^ mask).astype(np.uint8).tobytes()
def mulaw_to_linear(data: bytes) -> np.ndarray:
"""G.711 mu-law bytes -> 16-bit signed PCM samples."""
u = ~np.frombuffer(data, dtype=np.uint8).astype(np.int32) & 0xFF
segment, mantissa = (u >> 4) & 0x07, u & 0x0F
magnitude = (((mantissa << 3) + 0x84) << segment) - 0x84
return np.where(u & 0x80, -magnitude, magnitude).astype(np.int16)
Conferimos as duas funções contra o audioop em todos os valores de entrada de 16 bits e nos 256 códigos μ-law, e elas batem exatamente. Os codificadores nem sempre concordam entre si nas fronteiras de segmento (FFmpeg e audioop diferem em 512 das 65.536 entradas), e tudo bem: a diferença é de um degrau na curva e não dá para ouvir.
Bugs que transformam quem liga em chiado
A maioria dos problemas com G.711 vem de uma diferença entre o que os bytes são e o que o código acha que eles são.
- A lei errada. μ-law decodificado como A-law, ou o contrário. O áudio fica alto, áspero e meio inteligível. Confira o SDP ou a mensagem
startdo fluxo, não o que você supõe sobre a operadora. - Tratar G.711 como PCM linear de 8 bits. Uma biblioteca que vê amostras de 8 bits e supõe que são lineares toca ruído com a voz enterrada embaixo. Decodifique para PCM linear de 16 bits antes de reamostrar, mixar ou rodar detecção de atividade de voz.
- Um cabeçalho de arquivo dentro do fluxo. A Twilio diz que o
media.payloadde saída não pode conter bytes de cabeçalho de arquivo de áudio. Envie o cabeçalho de 44 bytes de um WAV e você terá um clique ou uma rajada de ruído no começo de cada mensagem. Remova o cabeçalho ou peça ao modelo de voz uma saída bruta. - Uma taxa de amostragem rotulada errado. Áudio de 8 kHz rotulado como 16 kHz toca com o dobro da velocidade e uma oitava acima. O contrário soa como uma fita desacelerada. Os dois decodificam sem erro, e é por isso que esses bugs passam pela revisão de código.
- Reamostrar mais de uma vez. Um pipeline que pega μ-law a 8 kHz, converte para 16 kHz para um serviço, para 24 kHz para outro e depois de volta para μ-law a 8 kHz adiciona latência e artefatos de filtragem a cada etapa. Escolha os formatos para que cada caminho de áudio converta uma vez, ou nenhuma.
- Fazer upsampling para “melhorar” a qualidade. Converter áudio de 8 kHz para 16 kHz não recupera nada acima de 4 kHz. As novas amostras são interpoladas. Pode ajudar um modelo que só aceita 16 kHz, mas o “f” de quem liga não vai parecer menos com um “s”.
O que 8 kHz significa para agentes de voz
A banda de 300 a 3.400 Hz é a parte da voz de que a maioria das pessoas precisa para entender palavras, e é por isso que ligações funcionam. Mas falta a ela boa parte do que separa “f” de “s” e “m” de “n”. Um modelo de voz para texto testado só com áudio limpo de navegador a 16 kHz pode ir bem pior com as mesmas palavras numa linha telefônica. O guia de SIP trunking trata disso do lado da operadora.
Três hábitos ajudam:
- Avalie com áudio telefônico. Grave ligações de teste pela sua operadora real, ou pelo menos passe seu conjunto de testes por uma ida e volta em μ-law a 8 kHz, antes de comparar modelos. O guia de WER explica como ler os resultados sem se enganar.
- Confirme os dados importantes. Repita nomes, e-mails e números de conta, e ofereça o teclado para sequências longas de dígitos. Os toques DTMF não dependem de o codec acertar uma consoante.
- Envie a voz no formato que a linha quer. Texto para voz gerado a 44,1 kHz e espremido para μ-law a 8 kHz custa uma conversão em cada trecho. Se o modelo consegue produzir μ-law a 8 kHz diretamente, peça isso.
Algumas ligações carregam áudio de banda larga. O G.722 (“voz HD”) amostra a 16 kHz, e chamadas WebRTC costumam usar Opus. Mas assim que uma ligação passa pela rede telefônica pública, conte com G.711.
G.711 com a Cartesia
Os modelos de voz da Cartesia aceitam e produzem G.711 nativamente, então um pipeline telefônico não precisa de uma etapa própria de codec.
Texto para voz. O Sonic devolve μ-law ou A-law bruto a 8 kHz quando você pede. Defina o formato de saída em qualquer requisição de TTS:
{
"container": "raw",
"encoding": "pcm_mulaw",
"sample_rate": 8000
}
Use pcm_alaw para linhas A-law. A documentação de formatos de saída lista todas as codificações e taxas. Os trechos brutos do WebSocket de TTS chegam em base64, que é o mesmo formato que a Twilio espera em media.payload, então o guia de integração com a Twilio os repassa sem decodificar.
Voz para texto. O Ink aceita μ-law e A-law pela API de streaming, incluindo o endpoint com detecção de turnos feito para agentes de voz. Declare o formato ao conectar:
wss://api.cartesia.ai/stt/turns/websocket?model=ink-2&encoding=pcm_mulaw&sample_rate=8000&cartesia_version=2026-08-14
O servidor decodifica seus bytes exatamente conforme o que você declara, e pode não retornar erro se a declaração estiver errada. A documentação de entrada de áudio mostra como salvar um fluxo e conferir com ffplay, o que pega uma lei ou taxa errada em segundos.
Managed Agents. Os Managed Agents atendem ligações em números da Cartesia, da Twilio ou do seu próprio tronco SIP e cuidam do áudio da chamada por você. Se, em vez disso, você conecta a sua própria telefonia a um agente, o WebSocket de agentes aceita entrada mulaw_8000 diretamente. As chamadas de agente custam US$ 0,06 por minuto, e você pode criar um no playground e ligar para ele do seu telefone.
Se você só precisa converter algumas gravações, o FFmpeg já faz isso bem e você não precisa de nenhuma API de voz.