API REST · OpenAPI 3.1 · Servidor MCP
API para desenvolvedores
Converta arquivos, links e textos em acordes e letras, depois leia e preencha seu caderno a partir de um script ou de um assistente.
- Plano gratuito
- O mesmo motor do app
- Servidor MCP oficial
O que a API permite
Cada recurso é liberado por um escopo que você marca ao criar sua chave.
Conversão
Áudio, PDF, imagens, texto ou link para songbook, PDF, MIDI, MusicXML e mais.
Caderno privado
Listar, ler, criar, editar e organizar suas músicas e playlists.
Perfis públicos
Somente leitura: perfis, músicas publicadas, seguidores. Nenhuma trilha de áudio.
Separação de faixas
Uma conversão (output=stems) separa a voz do acompanhamento; a ferramenta /stem-tool separa em duas ou quatro faixas. Com uma chave de API, ambas exigem uma conta Premium.
Fila de áudio
Análise de acordes e letras na mesma fila do aplicativo.
Detecção de música IA
Um indício de geração para um arquivo, um link do Spotify, um link de áudio direto ou um ISRC.
Limites, cotas e privacidade
A música gerada por IA é cada vez mais comum. O Jam Jam ajuda a procurar indícios: cole um link ou envie um arquivo para obter um resultado indicativo.
Máx. 100 MB · Máx. 10 min · Spotify, link de áudio direto ou ISRC. YouTube não é aceito. Os links do Spotify podem ser analisados apenas a partir de um trecho.
Um arquivo em espera ou em processamento por conta. As contas Premium têm prioridade na fila.
Visitante: 2 análises/dia e 5/mês. Conta gratuita: 5/dia e 50/mês. Premium: 30/dia e 300/mês. Limites compartilhados entre site, app e API; falhas não contam. Reinício à meia-noite UTC e no primeiro dia do mês UTC.
O áudio é enviado ao nosso fornecedor SH Labs para análise. Segundo a política da empresa, não é armazenado nem usado para treinar modelos. Se estiver indisponível, o arquivo pode ser analisado localmente quando o serviço de reserva estiver disponível. Os arquivos temporários são excluídos após o processamento, erro ou cancelamento. A conta conserva nome ou link, data, status e resultado por 90 dias; visitantes, por 24 h. Os limites de visitantes usam um token e um identificador de rede pseudonimizado, sem armazenar o IP em texto claro.
Este índice não é uma probabilidade nem uma prova. Um índice baixo não garante uma origem humana.
Conhecer a ferramentaFormatos compatíveis
A lista completa e atualizada, com os limites exatos e o que este servidor realmente oferece, está sempre em GET /formats. Em resumo:
Formatos de entrada
- Arquivos de áudio e vídeo
- PDF: acordes, letras, partitura, tablatura, cancioneiro digitalizado
- Imagens: acordes, letras, partitura, tablatura
- Texto simples, ChordPro, OnSong
- Links e busca na web (page-link, web-search)
- MusicXML, MIDI
- JamSong, .zip misto, songbook (pivô)
Formatos de saída
- Songbook (pivô JSON, sempre disponível)
- PDF: acordes, letras, partitura, tablatura, grade
- PNG, HTML, texto simples, ChordPro
- chords-lab, chords-csv, tom e BPM
- MusicXML, MIDI (Premium)
- Letras sincronizadas: .lrc, .srt
- Vídeo de karaokê (.mp4), áudio de acompanhamento, JamSong
Comece em quatro passos
A conversão é assíncrona: você envia, acompanha e recupera.
-
Criar uma chave
Configurações › Chaves de API. Prefixo
Gerenciar minhas chaves de APIjj_live_, exibida uma única vez, 5 chaves por conta, revogáveis. -
Enviar
Um arquivo, uma URL ou texto, com o formato de saída desejado.
POST /jobs -
Acompanhar
Consulte respeitando
Retry-After, ou abra um fluxo Server-Sent Events.GET /jobs/{id}GET /jobs/{id}/events -
Recuperar
O resultado fica disponível por 24 horas; depois, 410 Gone.
GET /jobs/{id}/result
Exemplos
Chamadas completas, prontas para copiar como estão.
Listar os formatos oferecidos por este servidorcurl
curl https://jam-jam.org/api/v1/formatsConverter um arquivo para PDFcurl
curl -X POST https://jam-jam.org/api/v1/jobs \
-H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
-F [email protected] \
-F inputFormat=pdf-songbook \
-F output=pdf-songbookConverter uma URL em um cadernocurl
curl -X POST https://jam-jam.org/api/v1/jobs \
-H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/tabs/amazing-grace", "output": "songbook"}'Acompanhar o progresso (SSE ou polling)curl
# Server-Sent Events
curl -N -H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
https://jam-jam.org/api/v1/jobs/jb_123/events
# Polling
curl -H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
https://jam-jam.org/api/v1/jobs/jb_123Baixar o resultadocurl
curl -H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
-OJ https://jam-jam.org/api/v1/jobs/jb_123/resultPython (requests)python
import time
import requests
API = "https://jam-jam.org/api/v1"
HEADERS = {"Authorization": "Bearer jj_live_xxxxxxxxxxxxxxxx"}
# 1. Discover formats
formats = requests.get(f"{API}/formats").json()
# 2. Submit a conversion
resp = requests.post(
f"{API}/jobs",
headers=HEADERS,
json={"url": "https://example.com/tabs/amazing-grace", "output": "songbook"},
)
resp.raise_for_status()
job = resp.json()
# 3. Poll until done (or use GET /jobs/{id}/events for SSE)
while job["phase"] not in ("done", "failed", "cancelled"):
time.sleep(job.get("etaS", 2))
job = requests.get(f"{API}/jobs/{job['id']}", headers=HEADERS).json()
# 4. Fetch the result
if job["phase"] == "done":
songbook = requests.get(f"{API}/jobs/{job['id']}/result/songbook", headers=HEADERS).json()
print(songbook["songs"][0]["title"])
else:
print("failed:", job.get("problem"))Analisar uma música com a detecção de música de IAcurl
# Availability and remaining quota (no key needed)
curl https://jam-jam.org/api/v1/ai-music/availability
# Analyze a file
curl -X POST https://jam-jam.org/api/v1/ai-music/jobs \
-H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
-F "[email protected]"
# Analyze a Spotify link
curl -X POST https://jam-jam.org/api/v1/ai-music/jobs \
-H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"url":"https://open.spotify.com/track/2JUDGXTQYGQZrVVUgq40Ke"}'
# History, current analysis, one analysis
curl -H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
https://jam-jam.org/api/v1/ai-music/history
curl -H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
https://jam-jam.org/api/v1/ai-music/jobs
curl -H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
https://jam-jam.org/api/v1/ai-music/jobs/JOB_ID
# Cancel
curl -X DELETE -H "Authorization: Bearer jj_live_xxxxxxxxxxxxxxxx" \
https://jam-jam.org/api/v1/ai-music/jobs/JOB_IDExemplos de código
Exemplos prontos para executar em curl, JavaScript e Python, de código aberto sob licença MIT:
Assistentes e MCP
Um assistente lê o contrato e monta as próprias chamadas. O servidor MCP oficial oferece 42 ferramentas prontas.
Para agentes de IA
Leia primeiro GET /openapi.json: ele documenta a sequência de chamadas recomendada (descobrir formatos, enviar, acompanhar, buscar), autenticação e cotas em um bloco x-agent-guide pensado para ser interpretado por um modelo. O llms.txt deste site lista cada capacidade de conversão como uma entrada própria.
Servidor MCP
Chave lida em JAM_JAM_API_KEY: só aparecem as ferramentas que os escopos dela permitem. Ele não segue ninguém, não curte nada e não publica nada por conta própria.
Em detalhes
Um servidor oficial Model Context Protocol expõe a API a um assistente como 42 ferramentas com o prefixo jj_: conversão de arquivos e de texto, leitura e organização do seu caderno privado, leitura de perfis públicos, separação de stems, análise de áudio e fila, detecção de música com IA e masterização. Ele lê a sua chave de API da variável de ambiente JAM_JAM_API_KEY e mostra apenas as ferramentas que os escopos dessa chave permitem. Ele cuida do polling, dos erros de cota e da obtenção dos arquivos por você, para que um assistente como Claude Desktop, Claude Code ou Cursor possa converter um arquivo ou organizar o seu caderno sem que você escreva nenhum código HTTP. Ele nunca segue ninguém, nunca curte nada e nunca publica uma música por conta própria.
npx -y @jam-jam/convert-mcpPágina do pacote no npm: npmjs.com/package/@jam-jam/convert-mcp
{
"mcpServers": {
"jam-jam": {
"command": "npx",
"args": ["-y", "@jam-jam/convert-mcp"],
"env": {
"JAM_JAM_API_KEY": "jj_live_xxxxxxxxxxxxxxxx"
}
}
}
}Ferramentas e escopos necessários 42
formatos, arquivos, texto e status dos jobs.
jj_list_formatssem escopojj_convert_fileconvert:writejj_convert_textconvert:writejj_get_jobconvert:read
o que a chave pode fazer e quanto ainda resta.
jj_check_usage
músicas e playlists.
jj_list_songsjj_get_songjj_list_playlistsjj_get_playlist
criar, alterar e excluir músicas e playlists.
jj_create_songjj_update_songjj_delete_songjj_create_playlistjj_update_playlistjj_delete_playlist
cartões de perfil, músicas e playlists publicadas, seguidores e seguindo.
jj_get_profilejj_list_profile_songsjj_list_profile_playlistsjj_list_followersjj_list_following
capacidades, jobs e arquivos.
jj_stems_capabilitiesconvert:readjj_stems_separatestems:writejj_stems_get_jobconvert:readjj_stems_list_jobsconvert:readjj_stems_get_fileconvert:readjj_stems_cancel_jobstems:write
analisar um arquivo e listar, ler e cancelar jobs.
jj_audio_analyzeaudio:writejj_queue_listqueue:readjj_queue_get_jobqueue:readjj_queue_cancel_jobaudio:write
disponibilidade, análise, histórico e jobs.
jj_ai_music_availabilityqueue:readjj_ai_music_analyzeaudio:writejj_ai_music_currentqueue:readjj_ai_music_get_jobqueue:readjj_ai_music_historyqueue:readjj_ai_music_cancel_jobaudio:write
capacidades, predefinições, renderização, status e cancelamento dos jobs.
jj_mastering_capabilitiessem escopojj_list_mastering_presetsmastering:readjj_create_mastering_presetmastering:writejj_master_audiomastering:writejj_mastering_get_jobmastering:readjj_mastering_cancel_jobmastering:write
Referência de endpoints
Todas as rotas servidas, por família, com escopo e cota. O contrato completo é a referência oficial.
- Conversão (jobs) 6
- Formatos 1
- Uso e cotas 1
- Caderno, leitura 4
- Caderno, escrita 8
- Social, somente leitura 5
- Fila de áudio e stems 4
- Separação de stems 6
- Masterização 8
- Detecção de música de IA 7
- Status e especificação 2
Conversão (jobs) 6
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| POST | /jobsEnvie uma conversão: um arquivo (multipart/form-data), uma URL ou texto bruto/ChordPro (application/json). Com output=stems também são necessários o escopo stems:write e uma chave de API Premium, com uma cota própria (200/dia UTC). | convert:write | cota: conversão |
| GET | /jobs/{id}Status do job (fase, porcentagem, etapas). Faça polling respeitando o cabeçalho Retry-After. | convert:read | cota: nenhuma |
| DELETE | /jobs/{id}Cancela um job e apaga seus arquivos; reembolsa a cota apenas se ele ainda estivesse na fila. | convert:write | cota: nenhuma |
| GET | /jobs/{id}/eventsAlternativa ao polling via Server-Sent Events: eventos state, done, error e ping de keep-alive. | convert:read | cota: nenhuma |
| GET | /jobs/{id}/resultBaixa o artefato principal (ou um específico via ?artifact=). Disponível por 24 horas após a criação do job. | convert:read | cota: nenhuma |
| GET | /jobs/{id}/result/songbookO pivô JSON canônico do caderno (cifras, letras, estrutura), sempre disponível assim que o job termina. | convert:read | cota: nenhuma |
Formatos 1
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| GET | /formatsRegistro dos pares de entrada/saída realmente oferecidos por este servidor, com os limites (maxBytes, maxPages, maxDurationS). | público (sem necessidade de chave) | cota: nenhuma |
Uso e cotas 1
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| GET | /me/usageO saldo das suas cotas (conversão, leitura, escrita, stems) e os escopos que sua identidade pode realmente exercer, em uma única chamada. | convert:read | cota: nenhuma |
Caderno, leitura 4
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| GET | /me/songsLista as músicas do seu caderno privado, paginadas por cursor opaco; use updatedSince para uma exportação incremental. | carnet:read | cota: leitura |
| GET | /me/songs/{songId}Uma música completa do seu caderno, incluindo cifras, letras e estrutura. | carnet:read | cota: leitura |
| GET | /me/playlistsLista as playlists do seu caderno, planas e com múltipla associação, com a mesma paginação das músicas. | carnet:read | cota: leitura |
| GET | /me/playlists/{playlistId}Uma playlist e suas músicas, em ordem, em formato resumido. | carnet:read | cota: leitura |
Caderno, escrita 8
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| POST | /me/songsAdiciona uma música ao seu caderno, o mesmo payload pivô retornado por uma conversão. Defina Idempotency-Key para evitar duplicatas. | carnet:write | cota: escrita |
| PUT | /me/songs/{songId}Substitui uma música por completo (declarativo); cria-a sob esse id se ainda não existir. | carnet:write | cota: escrita |
| PATCH | /me/songs/{songId}Atualiza somente os campos enviados (tom, capotraste, bpm, playlistIds...); também publica ou despublica a música no seu perfil. | carnet:write | cota: escrita |
| DELETE | /me/songs/{songId}Remove uma música do seu caderno; exclusão lógica, idempotente, e ela também sai de todas as playlists. | carnet:write | cota: escrita |
| POST | /me/playlistsCria uma playlist; songIds é a lista ordenada de músicas que ela contém, mantida exatamente como enviada. | carnet:write | cota: escrita |
| PUT | /me/playlists/{playlistId}Substitui uma playlist por completo (declarativo); songIds é obrigatório. | carnet:write | cota: escrita |
| PATCH | /me/playlists/{playlistId}Renomeia, altera o emoji de capa ou reordena totalmente as músicas de uma playlist. | carnet:write | cota: escrita |
| DELETE | /me/playlists/{playlistId}Exclui a própria playlist; suas músicas permanecem no seu caderno e em suas outras playlists. | carnet:write | cota: escrita |
Social, somente leitura 5
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| GET | /users/{handle}Cabeçalho do perfil público de uma conta pelo handle; uma conta privada que você não segue retorna um cartão fechado (sem bio, sem contadores). | social:read | cota: leitura |
| GET | /users/{handle}/songsMúsicas que uma conta publicou em seu perfil; audioPlayable só é verdadeiro quando vocês se seguem mutuamente. | social:read | cota: leitura |
| GET | /users/{handle}/playlistsPlaylists publicadas por uma conta; songCount conta apenas o que você realmente pode ver. | social:read | cota: leitura |
| GET | /me/followersContas que seguem você; status=accepted (padrão) ou requested. | social:read | cota: leitura |
| GET | /me/followingContas que você segue; status=requested lista as solicitações pendentes para contas privadas. | social:read | cota: leitura |
Fila de áudio e stems 4
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| POST | /audioColoca na fila a análise automática de cifras e letras, seguida do alinhamento, para uma música já presente no seu caderno. Mesma fila do app; songId deve ser sua. | audio:write | cota: nenhuma |
| GET | /queueA fila de processamento de áudio da sua conta: ativa, em espera (com rank) e as concluídas dos últimos 7 dias. | queue:read | cota: nenhuma |
| GET | /queue/{id}Um job da fila de áudio, apenas o seu; o mesmo 404 indistinguível para um job desconhecido ou de outra pessoa. | queue:read | cota: nenhuma |
| DELETE | /queue/{id}Cancela um dos jobs da sua fila de áudio; reembolsa apenas se a análise ainda não tivesse sido concluída. | audio:write | cota: nenhuma |
Separação de stems 6
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| GET | /stem-tool/capabilitiesVerifica a disponibilidade, os limites, os modelos e a cota de separação de stems de quem fez a chamada. | convert:read | cota: nenhuma |
| GET | /stem-tool/jobsLista as separações privadas de quem fez a chamada, com cursor de paginação opcional. | convert:read | cota: nenhuma |
| POST | /stem-tool/jobsEnvia um arquivo de áudio para separá-lo em duas ou quatro faixas. Chaves de API exigem Premium. | stems:write | cota: stems |
| GET | /stem-tool/jobs/{id}Consulta o status, o progresso e os arquivos disponíveis de uma separação sua. | convert:read | cota: nenhuma |
| DELETE | /stem-tool/jobs/{id}Cancela uma separação sua. | stems:write | cota: nenhuma |
| GET | /stem-tool/jobs/{id}/files/{name}Obtém uma URL assinada temporária para baixar uma faixa MP3 ou um arquivo ZIP. | convert:read | cota: nenhuma |
Com uma chave de API, todas estas rotas exigem uma conta Premium; caso contrário, a resposta é um 403 (api-premium-required). Os limites de quem chama estão em GET /stem-tool/capabilities.
Masterização 8
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| GET | /mastering/capabilitiesLimites, faixas dos ajustes, alvos de loudness, predefinições integradas e direito de renderização. | público (sem necessidade de chave) | cota: nenhuma |
| GET | /mastering/presetsLista as suas predefinições de masterização. | mastering:read | cota: nenhuma |
| POST | /mastering/presetsCria uma predefinição de masterização (Idempotency-Key obrigatória). | mastering:write | cota: nenhuma |
| DELETE | /mastering/presets/{id}Exclui uma das suas predefinições de masterização. | mastering:write | cota: nenhuma |
| POST | /mastering/jobsEnvia um áudio e inicia uma masterização com uma predefinição ou ajustes. | mastering:write | cota: mastering (3/semana grátis, ilimitado com Premium) |
| GET | /mastering/jobs/{id}Obtém o estado de um trabalho de masterização. | mastering:read | cota: nenhuma |
| DELETE | /mastering/jobs/{id}Cancela um trabalho de masterização. | mastering:write | cota: nenhuma |
| GET | /mastering/jobs/{id}/resultBaixa o WAV masterizado. | mastering:read | cota: nenhuma |
Detecção de música de IA 7 + 1 interna
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| GET | /ai-music/availabilityDisponibilidade da ferramenta, formatos aceitos e cotas restantes da conta ou do visitante. | público (sem necessidade de chave) | cota: nenhuma |
| POST | /ai-music/jobsEnvia um arquivo de áudio, um link do Spotify, um link de áudio direto ou um ISRC. Um único trabalho não concluído por conta; YouTube não é compatível. | audio:write | cota: detecção de IA |
| GET | /ai-music/jobsEncontra sua análise em andamento ou a mais recente. | queue:read | cota: nenhuma |
| GET | /ai-music/jobs/{id}Acompanha uma análise e lê o relatório. | queue:read | cota: nenhuma |
| DELETE | /ai-music/jobs/{id}Cancela uma análise e apaga seus arquivos temporários. | audio:write | cota: nenhuma |
| GET | /ai-music/historyHistórico privado dos últimos 90 dias, em páginas de 30; conta obrigatória, nenhum áudio guardado. | queue:read | cota: nenhuma |
| DELETE | /ai-music/history/{id}Apaga uma análise do seu histórico; a cota de uma análise bem-sucedida não é devolvida. | audio:write | cota: nenhuma |
| GET | /ai-music/source/{token}/{filename}Endereço temporário reservado ao provedor de detecção, válido por no máximo 180 segundos: nenhum cliente o chama. | interna | cota: nenhuma |
Status e especificação 2
| Método | Caminho | Escopo | Cota |
|---|---|---|---|
| GET | /healthStatus do serviço e prontidão por motor (OMR, áudio, vídeo...); não requer autenticação. | público (sem necessidade de chave) | cota: nenhuma |
| GET | /openapi.jsonEste contrato, em JSON legível por máquina. | público (sem necessidade de chave) | cota: nenhuma |
Contrato completo e legível por máquina, sempre sincronizado com esta tabela:
https://jam-jam.org/api/v1/openapi.json Contrato OpenAPI Cotas e limites
O saldo exato está em GET /me/usage e nos cabeçalhos X-Quota-* de cada resposta.
Conversão
- Conta gratuita
- 6 / semana
- Premium
- 500 / mês
- Sem chave nem sessão
- 3 / 24 h
O mesmo contador da exportação do caderno no aplicativo.
Leituras e gravações
| por dia UTC | Conta gratuita | Premium |
|---|---|---|
| Leituras (caderno, perfis) | 2.000 | 20.000 |
| Gravações (caderno) | 200 | 5.000 |
X-Read-Quota-* · X-Write-Quota-*
Faixas separadas por conversão
POST /jobs · output=stems Exige uma chave de API Premium: sem Premium, a resposta é um 403 (premium-required).
- Premium
- 200 por dia UTC
Ao chamar essas rotas, você garante ter os direitos sobre o áudio enviado.
Em detalhes
POST /jobscomoutput=stemsretorna um.zip:vocals,accompanimentemanifest.json.- Escopos necessários:
stems:writeeconvert:write. - Um contador à parte, separado do das conversões, contado por dia UTC (e não em 24 horas móveis).
- Não confunda com a ferramenta Separação de stems (
/stem-tool/*): nela, uma chave de API exige uma conta Premium, com limites próprios (GET /stem-tool/capabilities).
Obter uma chave de API
Crie uma conta Jam Jam gratuita, depois abra Configurações, Chaves de API no app (mobile ou web) e crie uma chave. Ela começa com jj_live_ e é exibida apenas uma vez: copie-a imediatamente. Até 5 chaves por conta, revogáveis a qualquer momento.
Erros
Todo erro, em toda rota, é um objeto application/problem+json (RFC 9457) com um campo code estável no qual um cliente pode basear sua lógica: quota-exhausted, rate-limited, unsupported-pair, not-found... O catálogo completo está no esquema OpenAPI (components.schemas.Problem).
Retenção
Os arquivos enviados e os resultados gerados são excluídos 24 horas após a criação do job. Nada é mantido por mais tempo, incluindo jobs com falha. Buscar um resultado após esse prazo retorna 410 Gone.
Créditos de código aberto
Esta API se apoia em motores de código aberto reais. Usados com honestidade, creditados pelo nome:
- MuseScore 4
GPL-3.0Importação e renderização de notação, partituras em PDF - Audiveris
AGPL-3.0Reconhecimento óptico de partituras digitalizadas - Tesseract OCR
Apache-2.0Reconhecimento de texto em páginas digitalizadas e fotos - faster-whisper
MITTranscrição de letras a partir do áudio - Basic Pitch
Apache-2.0Detecção de notas e melodia a partir do áudio - FluidSynth
LGPL-2.1Renderização do acompanhamento a partir de MIDI (SoundFont) - FFmpeg
LGPL-2.1 / GPL-2.0Codificação de áudio e vídeo, conversão de formatos - Chromium
BSD-3-ClauseRenderização em PDF de partituras e grades de acordes
Modelos e dados
Detecção de interlocutores (Studio): modelo de impressão de voz WeSpeaker ResNet34-LM, projeto WeNet (github.com/wenet-e2e/wespeaker), treinado no VoxCeleb (VGG, Universidade de Oxford), licença CC BY 4.0 (creativecommons.org/licenses/by/4.0/). Modificado pelo Jam Jam: pesos convertidos para meia precisão.