🎧 Artistas virtuales: cómo tokenizar pistas generadas por IA en 2024
Introducción
En menos de un año, las pistas creadas por inteligencia artificial han pasado de ser un experimento de laboratorio a venderse como NFTs por cientos de dólares. Si aún no has probado a combinar IA y blockchain, estás perdiendo una fuente de ingresos que ya está generando royalties automáticos para músicos, productores y creadores de contenido. En este artículo te muestro, paso a paso y con ejemplos de código, cómo pasar de una idea a un NFT musical listo para vender en los marketplaces más populares.
1. ¿Qué necesitas para crear tu primer NFT musical?
| Recurso | Opciones recomendadas | Por qué |
|---|---|---|
| Modelo de IA para generar audio |
MusicLM (Google), Riffusion (Stable Diffusion + audio), AIVA
|
Calidad profesional y API pública (MusicLM) o código abierto (Riffusion). |
| Editor de audio | Audacity, Reaper, Adobe Audition | Para recortar, masterizar y exportar a WAV/MP3. |
| Cartera blockchain | MetaMask (Ethereum), Polygon (MATIC) o Solana (Phantom) | Polygon ofrece gas barato; Solana es ultra‑rápido. |
| Marketplace NFT | OpenSea (Polygon), Mintable, Catalog (Solana) | Soporte directo para archivos de audio y royalties. |
Node.js (>=18) y ethers.js |
— | Para interactuar con contratos inteligentes desde la línea de comandos. |
Tip: Si eres principiante, abre una cuenta en Polygon y usa MetaMask; la curva de aprendizaje es menor y los costos de gas son prácticamente nulos.
2. Generar la pista con IA (ejemplo con MusicLM)
- Crear una cuenta en Google Cloud y habilitar la API de MusicLM (versión beta).
- Instalar el cliente de Python:
pip install google-cloud-aiplatform
- Ejecutar el script (reemplaza
YOUR_PROJECT_IDyYOUR_LOCATION):
from google.cloud import aiplatform
def generar_audio(prompt: str, output_path: str):
client = aiplatform.gapic.PredictionServiceClient()
endpoint = client.endpoint_path(
project="YOUR_PROJECT_ID",
location="YOUR_LOCATION",
endpoint="musiclm-predict"
)
instance = {"prompt": prompt, "duration_seconds": 30}
response = client.predict(endpoint=endpoint, instances=[instance])
audio_bytes = response.predictions[0]["audio"]
with open(output_path, "wb") as f:
f.write(audio_bytes)
# Ejemplo de uso
generar_audio(
prompt="Synthwave retro con bajo pulsante, tempo 120 BPM, atmósfera nocturna",
output_path="track.wav"
)
-
Masteriza la pista en Audacity: normaliza a -1 dB, aplica compresión ligera y exporta como
track.mp3.
3. Crear el contrato inteligente (ERC‑721 con royalties)
Utilizaremos OpenZeppelin y Hardhat para desplegar un contrato ERC‑721 que incluya EIP‑2981 (royalties).
# 1. Inicializar proyecto
mkdir nft-music && cd nft-music
npm init -y
npm install --save-dev hardhat @openzeppelin/contracts ethers
npx hardhat
# 2. Seleccionar "Create a basic sample project"
# 3. Reemplazar el contrato en contracts/MyMusicNFT.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";
contract MyMusicNFT is ERC721URIStorage, IERC2981 {
address public immutable creator;
uint96 public royaltyFee; // en basis points (ej. 750 = 7.5%)
constructor(string memory name_, string memory symbol_, uint96 fee_) ERC721(name_, symbol_) {
creator = msg.sender;
royaltyFee = fee_;
}
function mint(address to, string memory tokenURI) external returns (uint256) {
uint256 tokenId = totalSupply() + 1;
_safeMint(to, tokenId);
_setTokenURI(tokenId, tokenURI);
return tokenId;
}
// EIP‑2981
function royaltyInfo(uint256, uint256 salePrice) external view override returns (address, uint256) {
return (creator, (salePrice * royaltyFee) / 10000);
}
function _baseURI() internal pure override returns (string memory) {
return "";
}
}
Desplegar en Polygon (testnet Mumbai)
# 1. Instalar la red
npm install @nomiclabs/hardhat-etherscan @nomiclabs/hardhat-ethers ethers
# 2. Configurar hardhat.config.js
require("@nomiclabs/hardhat-ethers");
require("@nomiclabs/hardhat-etherscan");
module.exports = {
solidity: "0.8.24",
defaultNetwork: "mumbai",
networks: {
mumbai: {
url: "https://polygon-mumbai.g.alchemy.com/v2/YOUR_ALCHEMY_KEY",
accounts: ["0xYOUR_PRIVATE_KEY"]
}
},
etherscan: {
apiKey: "YOUR_POLYGONSCAN_API_KEY"
}
};
npx hardhat compile
npx hardhat run scripts/deploy.js --network mumbai
El script deploy.js simplemente instancia MyMusicNFT con royaltyFee = 750 (7,5 %).
4. Acuñar el NFT con metadatos y archivo de audio
Los marketplaces esperan que el tokenURI apunte a un JSON con la siguiente estructura (IPFS recomendado):
{
"name": "Synthwave Night #001",
"description": "Pista generada con MusicLM. Prompt: 'Synthwave retro con bajo pulsante, tempo 120 BPM, atmósfera nocturna'.",
"image": "ipfs://Qm.../cover.png",
"animation_url": "ipfs://Qm.../track.mp3",
"attributes": [
{ "trait_type": "Genre", "value": "Synthwave" },
{ "trait_type": "BPM", "value": 120 },
{ "trait_type": "AI Model", "value": "MusicLM" }
]
}
Subir a IPFS con nft.storage
npm install nft.storage
const { NFTStorage, File } = require('nft.storage');
const fs = require('fs');
const mime = require('mime');
async function upload() {
const client = new NFTStorage({ token: "YOUR_NFT_STORAGE_API_KEY" });
const metadata = await client.store({
name: "Synthwave Night #001",
description: "Pista generada con MusicLM...",
image: new File(
[fs.readFileSync('cover.png')],
"cover.png",
{ type: mime.getType('cover.png') }
),
animation_url: new File(
[fs.readFileSync('track.mp3')],
"track.mp3",
{ type: mime.getType('track.mp3') }
),
properties: {
genre: "Synthwave",
bpm: 120,
model: "MusicLM"
}
});
console.log("Metadata URI:", metadata.url);
}
upload();
Copiamos la URI (ipfs://bafy...) y la pasamos al método mint del contrato:
async function mintNFT() {
const provider = new ethers.providers.JsonRpcProvider("https://polygon-mumbai.g.alchemy.com/v2/YOUR_ALCHEMY_KEY");
const wallet = new ethers.Wallet("0xYOUR_PRIVATE_KEY", provider);
const contract = new ethers.Contract("DEPLOYED_CONTRACT_ADDRESS", abi, wallet);
const tx = await contract.mint(wallet.address, "ipfs://bafy.../metadata.json");
const receipt = await tx.wait();
console.log("NFT acuñado. Token ID:", receipt.events[0].args.tokenId.toString());
}
mintNFT();
5. Publicar y vender en un marketplace
- Abrir OpenSea (modo Polygon).
- Conectar tu cartera y hacer clic en "Create" → "My Music NFT".
- Pegar la metadata URI y establecer el royalty (debe coincidir con el 7,5 % del contrato).
- Elegir precio fijo (ej. 0.08 MATIC ≈ USD 15) o subasta.
Consejo de marketing:
- Usa hashtags como
#AIgeneratedMusic,#MusicNFTy#Synthwave.- Publica un teaser de
Herramienta mencionada: DigitalOcean
Top comments (0)