File size: 2,520 Bytes
e5fdf4f
2f3b32c
 
 
39f7f02
2f3b32c
39f7f02
 
207c35f
c640ef1
2f3b32c
39f7f02
ab0e126
e5fdf4f
ab0e126
39f7f02
f4dad5f
 
 
39f7f02
2f3b32c
679f566
 
 
 
 
2f3b32c
390611c
 
 
 
 
 
 
ab0e126
62e14ef
679f566
62e14ef
 
 
 
2f3b32c
5a78105
c68088d
2f3b32c
62e14ef
39f7f02
679f566
39f7f02
ab0e126
 
b986f28
 
ab0e126
39f7f02
ab0e126
d49facf
39f7f02
679f566
394ca4c
ab0e126
 
 
e5fdf4f
 
62e14ef
 
 
 
e5fdf4f
62e14ef
 
e5fdf4f
62e14ef
 
 
 
 
e5fdf4f
62e14ef
 
e5fdf4f
62e14ef
 
 
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import streamlit as st
import edge_tts
import asyncio
import tempfile
import os
from huggingface_hub import InferenceClient
import re
from streaming_stt_nemo import Model
import torch
import random

default_lang = "en"

engines = {default_lang: Model(default_lang)}

def transcribe(audio):
    lang = "en"
    model = engines[lang]
    text = model.stt_file(audio)[0]
    return text

HF_TOKEN = os.environ.get("HF_TOKEN", None)

def randomize_seed_fn(seed: int) -> int:
    seed = random.randint(0, 999999)
    return seed

system_instructions1 = """
[SYSTEM] Answer as Real Jarvis JARVIS, Made by 'Tony Stark.' 
Keep conversation friendly, short, clear, and concise. 
Avoid unnecessary introductions and answer the user's questions directly. 
Respond in a normal, conversational manner while being friendly and helpful.
[USER]
"""

def models(text, seed=42):
    seed = int(randomize_seed_fn(seed))
    generator = torch.Generator().manual_seed(seed)  
    
    client = InferenceClient("mistralai/Mistral-7B-Instruct-v0.3")
    
    generate_kwargs = dict(
        max_new_tokens=300,
        seed=seed
    )
    
    formatted_prompt = system_instructions1 + text + "[JARVIS]"
    stream = client.text_generation(
        formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
    output = ""
    for response in stream:
        if not response.token.text == "</s>":
            output += response.token.text

    return output

async def respond(audio, model, seed):
    user = transcribe(audio)
    reply = models(user, model, seed)
    communicate = edge_tts.Communicate(reply)
    with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmp_file:
        tmp_path = tmp_file.name
        await communicate.save(tmp_path)
    return tmp_path

DESCRIPTION = """ # <center><b>JARVIS⚡</b></center>
        ### <center>A personal Assistant of Tony Stark for YOU
        ### <center>Voice Chat with your personal Assistant</center>
        """

st.markdown(DESCRIPTION)
st.title("JARVIS")

uploaded_file = st.file_uploader("Upload audio file", type=["wav"])
seed = st.slider("Seed", min_value=0, max_value=999999, value=0)
if uploaded_file is not None:
    # Convert the uploaded file to a BytesIO object
    audio_bytes = uploaded_file.read()

    # Process the audio using the respond function
    response_path = asyncio.run(respond(audio_bytes, models, seed))

    # Display the audio response
    st.audio(response_path, format="audio/wav")
    os.remove(response_path)