main.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/usr/bin/env python3
  2. import asyncio
  3. import functools
  4. import io
  5. from typing import Callable
  6. import replicate
  7. from nicegui import ui
  8. from nicegui.events import UploadEventArguments, ValueChangeEventArguments
  9. async def io_bound(callback: Callable, *args: any, **kwargs: any):
  10. return await asyncio.get_event_loop().run_in_executor(None, functools.partial(callback, *args, **kwargs))
  11. async def transcribe(args: UploadEventArguments):
  12. transcription.text = 'Transcribing...'
  13. model = replicate.models.get('openai/whisper')
  14. prediction = await io_bound(model.predict, audio=io.BytesIO(args.files[0]))
  15. text = prediction.get("transcription", "no transcription")
  16. transcription.set_text(f'result: "{text}"')
  17. async def generate_image(args: ValueChangeEventArguments):
  18. image.source = 'https://dummyimage.com/600x400/ccc/000000.png&text=building+image...'
  19. model = replicate.models.get('stability-ai/stable-diffusion')
  20. prediction = await io_bound(model.predict, prompt=prompt.value)
  21. print(prediction)
  22. image.source = prediction[0]
  23. with ui.row().style('gap:10em'):
  24. with ui.column():
  25. ui.label('OpenAI Whisper (voice transcription)').classes('text-2xl')
  26. ui.upload(on_upload=transcribe).style('width: 20em')
  27. transcription = ui.label().classes('text-xl')
  28. with ui.column():
  29. ui.label('Stable Diffusion (image generator)').classes('text-2xl')
  30. prompt = ui.input('prompt').style('width: 20em')
  31. ui.button('Generate', on_click=generate_image).style('width: 15em')
  32. image = ui.image().style('width: 60em')
  33. ui.run()