Codec G.711: μ-law, A-law e áudio telefônico a 8 kHz

Rene, Kabir Goel 
Codec G.711: μ-law, A-law e áudio telefônico a 8 kHz

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

PropriedadeValor
Taxa de amostragem8.000 Hz
Bits por amostra8 (logarítmicos, não lineares)
Taxa de bits64 kbit/s por sentido
Banda de áudioCerca de 300 a 3.400 Hz
Variantesμ-law (PCMU) e A-law (PCMA)
Payload RTPPCMU = 0, PCMA = 8, ambos com clock de 8.000 Hz
Pacote de 20 ms160 amostras, 160 bytes de payload
Atraso do codecUma 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 start sempre 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. O ffprobe mostra pcm_mulaw ou pcm_alaw.
  • Silêncio. Numa linha em silêncio, os bytes μ-law ficam perto de 0xFF e 0x7E, e os A-law alternam entre 0xD5 e 0x55. Um buffer cheio de 0xFF é 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 start do 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.payload de 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.

Guias relacionados

Perguntas frequentes

O que é o codec G.711?

G.711 é o padrão da ITU-T para transmitir voz como modulação por código de pulso a 64 kbit/s: 8.000 amostras por segundo, 8 bits por amostra. Cada amostra é comprimida com uma curva logarítmica, μ-law ou A-law, para que sons baixos guardem mais detalhe do que sons altos. Foi publicado pela primeira vez em 1972 e ainda é o codec padrão na maioria das redes telefônicas e dos troncos SIP.

Qual é a diferença entre μ-law e A-law?

As duas são curvas de compansão do G.711 que fazem uma amostra linear mais larga caber em 8 bits. A μ-law (PCMU) é usada na América do Norte e no Japão; a A-law (PCMA), na Europa e na maioria dos outros países. Elas usam fórmulas diferentes, então um áudio codificado com uma soa distorcido se for decodificado com a outra. Quando uma ligação cruza entre as duas regiões, a rede faz a conversão.

O que são PCMU e PCMA?

São os nomes RTP do G.711. PCMU é μ-law e usa o tipo de payload estático 0; PCMA é A-law e usa o tipo 8. Os dois funcionam com um clock de 8.000 Hz e um canal. Você vai encontrá-los em ofertas SDP, nas configurações do PBX e na configuração do tronco SIP.

G.711 é a mesma coisa que PCM?

Não exatamente. O PCM linear guarda cada amostra como um número simples, normalmente de 16 bits. O G.711 é PCM com compressão logarítmica: cada amostra ocupa 8 bits, metade do PCM de 16 bits na mesma taxa. Para processar áudio G.711 na maioria das ferramentas, primeiro você o decodifica para PCM linear de 16 bits.

O G.711 piora o reconhecimento de voz?

Ele limita o que o reconhecedor consegue ouvir. O G.711 transmite mais ou menos de 300 a 3.400 Hz, então os sons que ficam mais acima, como a diferença entre "f" e "s", ficam mais difíceis de distinguir. Fazer upsampling do áudio não traz essas frequências de volta. Use um modelo de voz para texto que aceite μ-law ou A-law a 8 kHz diretamente e teste com gravações da sua linha telefônica real.