texto-a-música
Dos formas de crear una canción con voz + acompañamiento, guardada como MP3. Cada solicitud produce dos variantes.
- Generar — una canción nueva a partir de una descripción musical y letras.
- Cover — reinterpretar una canción existente en un nuevo estilo, manteniendo su melodía. Las letras pueden ser las originales (reconocidas automáticamente) o nuevas.
Disparadores
- haz una canción / generar música / texto a música / componer
- convierte estas letras en una canción / canta esto / jingle / canción temática / canción de cumpleaños
- haz un cover de esta canción / haz una versión jazz / reinterpreta en otro estilo
- 写歌 / 生成音乐 / 作曲 / 唱首歌 / 歌词谱曲 / 翻唱 / 改编 / 换个风格唱
Generar — canción nueva a partir de texto
Una solicitud necesita un prompt (la descripción musical) y exactamente una fuente de letras:
# Deja que el servidor escriba letras a partir de un tema
python3 skills/text-to-music/scripts/t2m.py "indie pop alegre, guitarras brillantes, 120 BPM" \
--lyrics-prompt "una canción sobre viajes por carretera con amigos"
# Usa tus propias letras (en línea o desde un archivo)
python3 skills/text-to-music/scripts/t2m.py "balada mandopop, piano y cuerdas" \
--lyrics $'[Verso]\nLa lluvia afuera ha parado\n[Estribillo]\nTe sigo esperando' --vocal-gender Female --title "La lluvia paró"
python3 skills/text-to-music/scripts/t2m.py "lo-fi hip hop, suave, crujido de vinilo" \
--lyrics-file cancion.txt --duration 120 -o chill.mp3
# Modela la voz/estilo a partir de una canción de referencia (archivo local ≤20 MB o URL pública)
python3 skills/text-to-music/scripts/t2m.py "synth-pop soñador" --lyrics-file cancion.txt --ref-audio ./ref.mp3
Salida: cancion_v1.mp3 y cancion_v2.mp3 (o <nombre>_v1.mp3 / <nombre>_v2.mp3 con -o). Cuando el servidor escribe las letras, también se guardan en <nombre>_letras.txt.
| Argumento | Por defecto | Descripción |
|---|---|---|
prompt | requerido | Descripción musical: género, ambiente, instrumentos, tempo (≤1500 caracteres) |
--lyrics / -l | — | Texto de las letras; los marcadores [Verso], [Estribillo], [Puente] ayudan a estructurar |
--lyrics-file | — | Archivo UTF-8 .txt con letras (≤64 KB) |
--lyrics-prompt | — | Tema para que el servidor escriba las letras |
--tags | — | Etiquetas de estilo, separadas por comas (≤50 caracteres) |
--negative-tags | — | Estilos a evitar |
--duration / -d | auto | Indicación de duración objetivo: 60, 120 o 180 segundos. Una sugerencia, no una garantía. |
--ref-audio | — | Canción de referencia, ruta local o URL pública |
--lyrics, --lyrics-file y --lyrics-prompt son mutuamente excluyentes; se requiere uno.
Cover — reinterpretar una canción existente
Necesita la canción fuente, letras y una descripción del nuevo sonido (--style y/o --prompt):
# Mismas letras, nuevo estilo: reconoce las letras del original y luego lo versiona
python3 skills/text-to-music/scripts/t2m.py cover original.mp3 \
--style "jazz, voz femenina ahumada" --recognize-lyrics -o cover_jazz.mp3
# Nuevas letras sobre la melodía original, arreglo más libre
python3 skills/text-to-music/scripts/t2m.py cover https://ejemplo.com/cancion.mp3 \
--prompt "folk acústico, guitarra punteada, íntimo" --lyrics-file nuevas_letras.txt \
--adherence main_melody --vocal-gender Male
# Reconocer solo las letras (para revisar o editar antes de versionar)
python3 skills/text-to-music/scripts/t2m.py lyrics original.mp3 -o letras.txt
Flujo recomendado cuando el usuario quiere ajustar las letras: ejecutar lyrics → editar el archivo → cover --lyrics-file.
| Argumento | Por defecto | Descripción |
|---|---|---|
source | requerido | Canción original: archivo local (≤100 MB; mp3/wav/m4a/aac/flac/ogg) o URL pública |
--style / -s | — | Etiquetas de estilo cortas, ej. "rock, voz masculina" (≤50 caracteres) |
--prompt / -p | — | Descripción más larga del sonido del cover (≤1500 caracteres) |
--adherence | high | high = seguir el arreglo original de cerca; main_melody = mantener solo la melodía principal, más libertad |
--lyrics / -l | — | Letras a cantar |
--lyrics-file | — | Archivo UTF-8 .txt con letras (≤64 KB) |
--recognize-lyrics | off | Transcribir primero las letras de la fuente y usarlas |
--output / -o | cover.mp3 | Ruta de salida; las variantes obtienen los sufijos _v1 / _v2 |
Se requiere al menos uno de --style / --prompt; se requiere exactamente una fuente de letras.
Argumentos Compartidos
| Argumento | Por defecto | Descripción |
|---|---|---|
--title | — | Título de la canción (≤80 caracteres) |
--vocal-gender | — | Male o Female |
--vocal-timbre | — | Descripción libre de la voz, ej. "contralto cálida y ronca" (≤50 caracteres) |
--output / -o | song.mp3 (cover.mp3 para covers) | Ruta de salida; las variantes obtienen los sufijos _v1 / _v2 |
--no-wait | off | Enviar, imprimir el/los ID del trabajo y salir |
--poll-interval | 10 | Segundos entre comprobaciones de estado |
--timeout | 1800 | Máximo de segundos de espera (el trabajo continúa ejecutándose en el servidor) |
--api-key | de env/config | Clave de API de Noiz (anula la clave almacenada) |
Reanudar / Verificar Trabajos
La generación imprime dos gen_product_ids; un cover imprime un task_id. Si la espera agota el tiempo o usaste --no-wait, reanuda con:
python3 skills/text-to-music/scripts/t2m.py status <id_v1> <id_v2> -o cancion.mp3
python3 skills/text-to-music/scripts/t2m.py status --cover <task_id> -o cover.mp3
python3 skills/text-to-music/scripts/t2m.py status --cover <task_id> --no-wait # solo imprime el estado
El estado pasa por submitted → running → succeeded / failed. Los covers también informan de una stage (el análisis ocurre antes de cantar, por lo que los covers tardan más). Las URL de descarga caducan después de ~24h; vuelve a ejecutar status para obtener nuevas.
Escribir Buenos Prompts
- Prompt / estilo = el sonido: género + ambiente + instrumentación + tempo.
"pop orquestal cinematográfico, cuerdas ascendentes, 90 BPM, esperanzador". - Letras: mantén las secciones cortas y etiquétalas. Las letras en chino, inglés y mixtas funcionan.
- Canciones cortas: para jingles o saludos, pasa
-d 60y escribe solo un verso + estribillo. - Covers: elige
highpara que el cover sea reconocible; eligemain_melodypara un cambio de género más grande. - ¿No estás satisfecho? Ejecuta de nuevo: cada ejecución da dos variantes nuevas.
Costo
- Canciones y covers se cobran una vez por trabajo (no por variante):
techo(segundos de la variante más larga) × 15créditos, cobrados después de que ambas variantes tengan éxito. Una canción de 2 minutos cuesta alrededor de 1,800 créditos. Si los créditos de la suscripción no cubren todo el trabajo, se factura como pago por uso a $0.00015/s. El script imprime el monto cobrado al finalizar. - Reconocimiento de letras (
lyrics/--recognize-lyrics): 100 créditos (o $0.001 pago por uso), cobrado solo cuando se detectan voces.
Límites de velocidad: 5 envíos por minuto por clave por endpoint; consulta de estado 60 por minuto.
Limitaciones
- No se admite música puramente instrumental: siempre se requieren letras.
--durationes solo una sugerencia; la duración real puede diferir. Los covers siguen la duración de la fuente.- Los prompts o letras que contengan contenido sensible son rechazados (
code=400).
Configuración
python3 skills/text-to-music/scripts/t2m.py config --set-api-key TU_CLAVE
# o
export NOIZ_API_KEY=TU_CLAVE
Obtén tu clave de API en developers.noiz.ai.
Requisitos
- Python 3.6+
- Paquete
requests:uv pip install requests - Clave de API de Noiz desde developers.noiz.ai
Seguridad y Divulgación de Datos
- Clave de API: Almacenada en
~/.config/noiz/api_key(permisos0600) o mediante la variable de entornoNOIZ_API_KEY. - Red: Los prompts, letras y cualquier audio de referencia/fuente (carga de archivo o URL) se envían a
https://noiz.ai/v1/text-to-musicyhttps://noiz.ai/v1/text-to-music/cover*; el estado del trabajo se consulta desde los mismos endpoints. No se transmite ningún otro dato. - Salida: Los MP3 generados (y los archivos de texto de letras) se descargan desde URL firmadas de almacenamiento de Noiz y se guardan en la ruta de salida. No se modifican otros archivos.