File size: 2,233 Bytes
6d250b3
a86d422
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import gradio as gr
from transformers import AutoTokenizer, AutoModelForCausalLM
import svgwrite
import cairosvg
import speech_recognition as sr
import io

# Load the StarVector model
tokenizer = AutoTokenizer.from_pretrained("starvector/starvector-8b-im2svg")
model = AutoModelForCausalLM.from_pretrained("starvector/starvector-8b-im2svg")

def generate_svg(prompt, width, height):
    inputs = tokenizer(prompt, return_tensors="pt")
    outputs = model.generate(**inputs, max_length=512)
    svg_code = tokenizer.decode(outputs[0], skip_special_tokens=True)

    # Ensure SVG is properly wrapped
    svg_wrapped = f'<svg width="{width}" height="{height}" xmlns="http://www.w3.org/2000/svg">{svg_code}</svg>'

    # Convert to PNG
    png_output = cairosvg.svg2png(bytestring=svg_wrapped.encode('utf-8'))

    with open("output.svg", "w") as f:
        f.write(svg_wrapped)
    with open("output.png", "wb") as f:
        f.write(png_output)

    return svg_wrapped, "output.png", "output.svg"

def transcribe_audio(audio_path):
    recognizer = sr.Recognizer()
    with sr.AudioFile(audio_path) as source:
        audio_data = recognizer.record(source)
    return recognizer.recognize_google(audio_data)

with gr.Blocks() as demo:
    gr.Markdown("## Vector Logo Generator (Text + Voice)")

    with gr.Row():
        txt = gr.Textbox(label="Text Prompt")
        mic = gr.Audio(source="microphone", type="filepath", label="Or speak your prompt")

    with gr.Row():
        width = gr.Slider(minimum=100, maximum=1000, value=500, step=10, label="Width (px)")
        height = gr.Slider(minimum=100, maximum=1000, value=500, step=10, label="Height (px)")

    svg_output = gr.Textbox(label="SVG Code Output")
    png_output = gr.Image(label="PNG Preview")
    svg_file = gr.File(label="Download SVG")
    png_file = gr.File(label="Download PNG")

    def run(prompt, audio, w, h):
        if not prompt and audio:
            prompt = transcribe_audio(audio)
        svg, png_path, svg_path = generate_svg(prompt, w, h)
        return svg, png_path, svg_path

    run_button = gr.Button("Generate")
    run_button.click(fn=run, inputs=[txt, mic, width, height], outputs=[svg_output, png_output, svg_file, png_file])

demo.launch()