Skip to content
GitHub

Multimedia (lexigram-multimedia)

Multimedia generation umbrella for Lexigram Framework — TTS, music, video, image, upscale, interpolation, and beat analysis in one DI module.


lexigram-multimedia is the orchestration layer for the Lexigram multimedia subsystem. It wires seven independent generation packages (lexigram-multimedia-tts, lexigram-multimedia-music, lexigram-multimedia-video, lexigram-multimedia-image, lexigram-multimedia-upscale, lexigram-multimedia-interpolate, lexigram-multimedia-beat) through the framework’s DI container and entry-point discovery, and exposes a single MultimediaModule for application composition. Generated assets are normalized into blob storage (MediaAsset with bytes or URI), and long-running jobs are submitted to the task queue.

Full documentation: docs.lexigram.dev

Terminal window
uv add lexigram-multimedia
# Subsystem extras (per backend, e.g. torch-based reference servers)
uv add "lexigram-multimedia-tts[elevenlabs,openai]"
uv add "lexigram-multimedia-music[ace-step-server]"
uv add "lexigram-multimedia-video[wan22-server,cogvideox-server]"
from lexigram import Application
from lexigram.di.module import Module, module
from lexigram.multimedia import MultimediaModule
from lexigram.contracts.multimedia import TTSProvider, TTSRequest
@module(imports=[MultimediaModule.configure()])
class AppModule(Module):
pass
async def main() -> None:
async with Application.boot(modules=[AppModule]) as app:
tts = await app.container.resolve(TTSProvider)
result = await tts.generate(TTSRequest(text="Hello from Lexigram"))
if result.is_ok():
asset = result.unwrap() # MediaAsset — bytes or URI in blob storage
if __name__ == "__main__":
import asyncio
asyncio.run(main())

Zero-config usage: Call MultimediaModule.configure() with no arguments to use defaults. Default backends: local-http for TTS, music, video, and image; librosa for beat analysis; rife for frame interpolation; real-esrgan for upscaling.

application.yaml
multimedia:
tts:
backend: "elevenlabs"
elevenlabs_voice_id: "21m00Tcm4TlvDq8ikWAM"
music:
backend: "stable-audio-open"
video:
backend: "local-http"
storage_path_prefix: "multimedia/"
cache_results: true

Option 2 — Profiles + Environment Variables

Section titled “Option 2 — Profiles + Environment Variables”
Terminal window
export LEX_PROFILE=production
export LEX_MULTIMEDIA__TTS__BACKEND=elevenlabs
export LEX_MULTIMEDIA__STORAGE_PATH_PREFIX=multimedia/
from lexigram.multimedia import MultimediaModule, MultimediaConfig
from lexigram.multimedia.tts.config import TTSConfig
MultimediaModule.configure(
config=MultimediaConfig(
tts=TTSConfig(backend="elevenlabs", elevenlabs_voice_id="21m00Tcm4TlvDq8ikWAM"),
cache_results=True,
)
)
FieldDefaultEnv varDescription
ttsTTSConfig()LEX_MULTIMEDIA__TTS__*TTS subsystem config
musicMusicConfig()LEX_MULTIMEDIA__MUSIC__*Music generation config
videoVideoConfig()LEX_MULTIMEDIA__VIDEO__*Video generation + processing config
imageImageConfig()LEX_MULTIMEDIA__IMAGE__*Image generation config
upscaleUpscaleConfig()LEX_MULTIMEDIA__UPSCALE__*Image/video upscale config
interpolateInterpolationConfig()LEX_MULTIMEDIA__INTERPOLATE__*Frame interpolation config
beatBeatAnalysisConfig()LEX_MULTIMEDIA__BEAT__*Beat analysis config
storage_path_prefix"multimedia/"LEX_MULTIMEDIA__STORAGE_PATH_PREFIXBlob storage key prefix for generated assets
cache_resultsFalseLEX_MULTIMEDIA__CACHE_RESULTSCache generation results in the cache backend
MethodDescription
MultimediaModule.configure(config)Configure with all seven subsystems wired
MultimediaModule.stub()Stub module for testing — discovers installed subsystem stubs via lexigram.multimedia.modules entry points
  • One module, seven subsystems — TTS, music, video, image, upscale, interpolation, and beat analysis wired through DI
  • Entry-point discovery — subsystem providers register via lexigram.multimedia.subsystems; no manual wiring
  • SubsystemAccessor — single accessor to generate any media type (generate(request) -> Result[MediaAsset, MultimediaError])
  • VideoAccessor / ComposeAccessor / BeatAccessor — video processing, timeline composition, and beat analysis with dedicated accessors
  • Async job submissionsubmit() dispatches generation to the task queue with idempotency and generation events
  • Blob-backed assets — results normalized into MediaAsset (bytes or URI) via lexigram-storage
from lexigram import Application
from lexigram.multimedia import MultimediaModule
async def test_boot():
async with Application.boot(modules=[MultimediaModule.stub()]) as app:
assert app.container is not None
FileWhat it contains
src/lexigram/multimedia/__init__.pyPublic API: MultimediaModule, MultimediaProvider, MultimediaConfig, accessors, Timeline
src/lexigram/multimedia/module.pyMultimediaModule.configure() and MultimediaModule.stub()
src/lexigram/multimedia/config.pyMultimediaConfig — nested subsystem configs + storage/cache options
src/lexigram/multimedia/di/provider.pyMultimediaProvider — registers and boots the seven sub-providers
src/lexigram/multimedia/accessors/SubsystemAccessor, VideoAccessor, ComposeAccessor, BeatAccessor
src/lexigram/multimedia/timeline/Timeline, TimelineRenderTask — timeline composition
src/lexigram/multimedia/types.pyJobHandle and accessor types