Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/calmerism/Tamed/llms.txt

Use this file to discover all available pages before exploring further.

Tamed can translate song lyrics into your language of choice using a large language model of your choosing. The translation engine works with both synced (LRC-format) and plain lyrics: it extracts each lyric line, batches them for efficiency, sends them to your configured AI provider, and reassembles the translated result into the original format. All processing happens through direct API calls from your device — no Tamed server is involved.
Lyrics content is sent to your configured AI provider’s API for translation. If privacy is a concern, consider using the CUSTOM provider option with a locally-hosted model such as Ollama, which keeps everything on-device.

Supported Providers

Tamed supports six provider options defined in the AiProvider enum:

ChatGPT

Calls the OpenAI Chat Completions API at https://api.openai.com/v1/chat/completions. Default model: gpt-4o. Standard OpenAI API key required.

Gemini

Calls the Google AI generateContent endpoint. Default model: gemini-3.5-flash. Requires a Google AI Studio API key.

Claude

Calls the Anthropic Messages API at https://api.anthropic.com/v1/messages. Default model: claude-3-haiku-20240307. Requires an Anthropic API key.

OpenRouter

Routes through openrouter.ai, giving you access to dozens of models from a single API key. Default model: openrouter/auto.

Custom

Any OpenAI-compatible endpoint you supply. Useful for self-hosted models (e.g. Ollama, LM Studio, vLLM). Requires both an API key and a custom endpoint URL.

None

Disables AI translation entirely. The AI service will throw an exception if called while set to NONE.

Setup

1

Open AI settings

Navigate to Settings → Integrations → AI in Tamed.
2

Select a provider

Choose your preferred provider from the dropdown. This sets AiProviderKey (string). Available values: CHATGPT, GEMINI, CLAUDE, OPENROUTER, CUSTOM, NONE.
3

Enter your API key

Paste your API key into the API key field (AiApiKeyKey). The key is stored securely in the app’s DataStore and sent only to the configured provider’s endpoint.
4

Set a custom endpoint (CUSTOM or OPENROUTER)

If you selected CUSTOM, enter the full base URL of your OpenAI-compatible API in the custom endpoint field (AiCustomEndpointKey). For example, a locally-hosted Ollama instance might use http://localhost:11434/v1/chat/completions. This field is ignored for all other providers.
5

Select a model

Tamed can fetch the available models for your provider (ChatGPT, Gemini, Claude, and OpenRouter all support model listing). Select from the list (AiSelectedModelKey) or type a model identifier manually into the custom model field (AiCustomModelKey).If no model is set, Tamed uses a sensible default per provider:
ProviderDefault model
CHATGPTgpt-4o
GEMINIgemini-3.5-flash
CLAUDEclaude-3-haiku-20240307
OPENROUTERopenrouter/auto
6

Validate your configuration

Tamed runs a lightweight test call to verify your credentials. The result is stored in AiApiValidationStatusKey and shown in the settings UI:
StatusMeaning
UNKNOWNNo validation has been attempted yet
SUCCESSThe test call returned "OK" as expected
FAILEDThe API key is invalid, the model is unavailable, or the endpoint is unreachable

Translation Settings

KeyTypeDescription
EnableTranslatorKeybooleanMaster toggle — enables or disables all AI translation
TranslateLyricsKeybooleanEnables on-screen lyrics translation in the player view
TranslatorTargetLangKeystringLanguage name for the translation target (e.g. "ENGLISH", "JAPANESE", "FRENCH")
TranslatorContextsKeystringComma-separated context tokens sent to the model (e.g. "{song},{artist}")

Supported target languages

TranslatorTargetLangKey stores a language name in UPPER_CASE, matching the enum entries used by the translation library (for example ENGLISH, JAPANESE, KOREAN, CHINESE, FRENCH, GERMAN, SPANISH, PORTUGUESE, RUSSIAN, ARABIC, HINDI). The default value when the key is unset is ENGLISH. Values are normalized before being passed to the AI provider — underscores are replaced with spaces and the result is title-cased (e.g. BRAZILIAN_PORTUGUESE becomes Brazilian Portuguese).

How Translation Works

The AiLyricsTranslator extracts individual lyric lines from both LRC-synced and plain-text formats, then batches them into chunks of up to 80 lines or 6,000 characters before sending each batch to the AI provider. The translated lines are then reinserted into the original structure, preserving all timestamps and formatting. The model is instructed to:
  • Preserve meaning, tone, names, and repeated hooks
  • Match the profanity level of the original
  • Return exactly the same number of lines as it received
  • Omit any markdown, explanations, or extra output
If the AI response returns a different number of lines than were sent, Tamed will throw an error and the translation will not be applied. This is a safety check to prevent misaligned synced lyrics.

Cost Considerations

AI provider APIs charge per token. Translating a full album’s lyrics can add up quickly with commercial providers. For a zero-cost alternative, set the provider to CUSTOM and point AiCustomEndpointKey at a local Ollama instance running a model such as llama3 or mistral. Performance and translation quality will vary by model.

Romanization (No AI Required)

For Japanese, Korean, Chinese, and Hindi lyrics, Tamed includes offline romanization that works without any AI provider or internet connection:
KeyLanguage
LyricsRomanizeJapaneseKeyJapanese → rōmaji
LyricsRomanizeKoreanKeyKorean → Revised Romanization
LyricsRomanizeChineseKeyChinese → Pinyin
LyricsRomanizeHindiKeyHindi → Latin transliteration
LyricsRomanizeOtherLanguagesKeyOther languages (broad coverage)
Romanization is independent of the AI translation feature and can be used alongside it or on its own.

Build docs developers (and LLMs) love