File size: 2,243 Bytes
f30e274
bd4b687
 
 
f30e274
bd4b687
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5e5f797
 
 
 
 
 
 
 
 
 
 
bd4b687
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from kokoro import KPipeline
import soundfile as sf
import tempfile

languages = ['American English','British English','Spanish','French','Italian']
flags = ['๐Ÿ‡บ๐Ÿ‡ธ','๐Ÿ‡ฌ๐Ÿ‡ง','๐Ÿ‡ช๐Ÿ‡ธ','๐Ÿ‡ซ๐Ÿ‡ท','๐Ÿ‡ฎ๐Ÿ‡น']
voices = ['af_heart','am_adam','bf_isabella','bm_lewis','ef_dora','em_alex','ff_siwis','if_sara','im_nicola']

@st.cache_resource
def model_setup(lang_code='a'):
    return KPipeline(lang_code=lang_code)
    
### Title
st.title("Convert your text into audio")
st.subheader("with your options of language, speed and voice")

# Text
input_text = st.text_area(
    "Your text:"
)

if input_text:
    st.write(f"{len(input_text)} characters")
    language = st.radio(
        "Language:",
        ['']+[flag+lang for flag,lang in zip(flags,languages)],
    )

    # Language
    if language:
        lang = language[2:]
        if lang == 'American English':
            lang_code = 'a'
        elif lang == 'British English':
            lang_code = 'b'
        elif lang == 'Spanish':
            lang_code = 'e'
        elif lang == 'French':
            lang_code = 'f'
        elif lang == 'Italian':
            lang_code = 'i'

        # Speed
        speed = st.radio(
            "Speed:",
            ['slow','normal','fast'],
            index = 1
        )
        if speed == 'slow':
            sp = 0.8
        elif speed == 'normal':
            sp = 1
        elif speed == 'fast':
            sp = 1.4

        # Voice
        voices_l = [voice for voice in voices if voice[0]==lang_code]
        voices_gender = ['Female' if voice[1]=='f' else 'Male' for voice in voices_l]
        voice = st.radio(
            "Voice:",
            ['']+voices_gender,
        )
        if voice:
            if voice == 'Female':
                voice = voices_l[0]
            else:
                voice = voices_l[1]
                
            pipeline = KPipeline(lang_code=lang_code)
            generator = pipeline(input_text, voice=voice, speed=sp, split_pattern=r'')

            for i,(_, _, audio) in enumerate(generator):
                with tempfile.TemporaryDirectory() as temp_dir:
                    sf.write(temp_dir+'temp.wav', audio, 24000)
            st.audio(temp_dir+'temp.wav')