import streamlit as st import subprocess import tempfile import sys import os from os.path import exists import requests import tarfile from PIL import Image # Set base path BASE_PATH = os.getcwd() # /home/user/app BASE_PATH_MODEL = os.path.join(BASE_PATH, "Model") # Piper TTS download url URL_PIPER_DOWNLOAD = "https://github.com/rhasspy/piper/releases/download/v1.2.0/piper_amd64.tar.gz" ONNX = "https://huggingface.co/Rikels/piper-dutch/resolve/main/anna.onnx" TMP_PIPER_FILENAME = os.path.join(BASE_PATH, "piper.tgz") ########################## # CHECK OR INSTALL PIPER # ########################## if os.path.exists(os.path.join(BASE_PATH,"piper")) == False: # Piper not downloaded and extracted yet, let's do this first. response = requests.get(URL_PIPER_DOWNLOAD) if response.status_code == 200: with open(TMP_PIPER_FILENAME, 'wb') as f: f.write(response.content) with tarfile.open(TMP_PIPER_FILENAME, 'r:gz') as tar: tar.extractall(BASE_PATH) else: st.markdown(f"Failed to download Piper TTS from {URL_PIPER_DOWNLOAD} (Status code: {response.status_code})") ##################################################### # CHECK OR DOWNLOAD: All Thorsten-Voice model files # ##################################################### # Create "Model" path if not existing if os.path.exists(BASE_PATH_MODEL) == False: os.makedirs(BASE_PATH_MODEL) # --- Download "NEUTRAL" TTS model --- # response = requests.get(ONNX) if response.status_code == 200: with open(os.path.join(BASE_PATH_MODEL, "anna.onnx"), 'wb') as f: f.write(response.content) response = requests.get(ONNX + ".json") if response.status_code == 200: with open(os.path.join(BASE_PATH_MODEL, "anna.onnx.json"), 'wb') as f: f.write(response.content) ########################### # MODEL DOWNLOAD FINISHED # ########################### hide_streamlit_style = """ """ st.markdown(hide_streamlit_style, unsafe_allow_html=True) st.title('Guude! Thorsten-Voice clone hier 👋') st.header('Clone van Thorsten-voice's App (TTS)') #st.subheader('Hoi?') st.markdown('Mehr Infos auf der [Projektwebseite](https://www.Thorsten-Voice.de) und auf meinem [Youtube Kanal](https://www.youtube.com/c/thorstenmueller)') with st.form("my_form"): text = st.text_area("Wat wil je dit model laten zeggen?",max_chars=500) submitted = st.form_submit_button("Zeg dan!") if submitted: with st.spinner("ekkes wachten..."): filename = tempfile.NamedTemporaryFile(suffix=".wav", delete=False) # Set Piper TTS command based on choice PIPER_CMD = os.path.join(BASE_PATH,"piper","piper") SPEAKER_ID = "0" MODEL = "anna.onnx" cmd = "echo '" + text + "' | " + BASE_PATH + "/piper/piper --model " + os.path.join(BASE_PATH_MODEL, MODEL) + " --speaker " + SPEAKER_ID + " --output_file " + filename.name result = subprocess.run(cmd, shell=True) audio_file = open(filename.name, 'rb') audio_bytes = audio_file.read() st.audio(audio_bytes,format="audio/wav") try: st.download_button('Downloaden', audio_bytes, file_name='Thorsten-Voice-clone.wav') except: pass