Lyria 3.5 output: MP3 or WAV at 44.1 kHz, and what Sume returns

Google lists MP3 by default or WAV, 44.1 kHz stereo, with a SynthID watermark. Sume's music docs say the artifact is typically audio/mpeg. Check it in code.

4 min readSume
All posts

Google's Lyria 3.5 docs list MP3 as the default output with WAV as an option, 44.1 kHz stereo, and a SynthID watermark. Sume's Music 1.0 docs do not offer a format field: they say the audio artifact is typically audio/mpeg, hosted on media.sume.com.

So through Sume, plan for an MP3 file and check the content_type on the artifact instead of assuming it.

What each page says

Statements from the two pages as read on 2026-10-03. Where a page is silent, the table says so.

Lyria 3.5 output facts by source (read 2026-10-03)
ItemGemini API docsSume docs
File typeMP3 default, WAV availableTypically audio/mpeg
Sample rate and channels44.1 kHz stereoNot stated
WatermarkSynthIDNot stated
Format selectorYes (MP3 or WAV)No such request field in the docs
Where the file livesIn the API responseresult.artifacts[] with type: audio

Check the artifact in code

This script polls a music job, finds the audio artifact, and fails loudly if the content type is not the one you built your pipeline around. It calls the Music Router, which takes the same body as Music 1.0, and reads the artifact shape documented on the Music 1.0 page.

import os, time, requests

BASE = "https://api.sume.com"
H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}

def music(prompt, key):
    r = requests.post(BASE + "/v1/music-router/generate",
                      headers={**H, "Idempotency-Key": key},
                      json={"prompt": prompt}, timeout=60)
    r.raise_for_status()
    body = r.json()
    return body.get("data", body)

def wait_result(job_id):
    while True:
        s = requests.get(f"{BASE}/v1/jobs/{job_id}/status", headers=H, timeout=60).json()
        d = s.get("data", s)
        if d.get("terminal"):
            break
        time.sleep(d.get("next_poll_after_seconds") or 5)
    res = requests.get(f"{BASE}/v1/jobs/{job_id}/result", headers=H, timeout=60).json()
    return res.get("data", res)

job = music("Warm lo-fi bed, 84 BPM. Instrumental, no vocals.", "music-check-001")
job_id = job.get("id") or job["job"]["id"]
result = wait_result(job_id)
arts = (result.get("result") or result).get("artifacts", [])
audio = next(a for a in arts if a["type"] == "audio")
assert audio["content_type"] == "audio/mpeg", audio["content_type"]
print(audio["url"])

What follows from an MP3 artifact

Practical consequences, limited to what the docs state.

  • Decoding and re-encoding adds a generation of loss, so keep the first file as the master and cut copies from it.
  • The timeline audio docs say an MP3 output re-adds priming padding at every edge and recommend WAV when a file will be joined again, so keep sample-exact work on WAV.
  • Do not state a sample rate or channel count in your own docs for the Sume file until you have read it from the file. Google's 44.1 kHz stereo figure is for Google's output.
  • Use only the Sume media URL from the result. The docs say raw provider URLs are not public outputs.

Watermark and disclosure

Google's docs state a SynthID watermark on Lyria output. Sume's page does not repeat that, so whether it survives to the Sume artifact is not something this page can confirm. If provenance matters for your delivery, test it with the detection tool of your choice on a Sume-returned file and record the result.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume