Download stream.py from Hev832/hex-rvc: direct link, hf CLI and curl.
- Browser
- Download file 5.24 kB
-
https://huggingface.co/Hev832/hex-rvc/resolve/main/stream.py
- Command line
-
hf download hf://Hev832/hex-rvc/stream.py
-
curl -L -o stream.py https://huggingface.co/Hev832/hex-rvc/resolve/main/stream.py
5.24 kB
| import os | |
| import re | |
| import random | |
| from scipy.io.wavfile import write, read | |
| import numpy as np | |
| import yt_dlp | |
| import subprocess | |
| from pydub import AudioSegment | |
| from audio_separator.separator import Separator | |
| from lib.infer import infer_audio | |
| import edge_tts | |
| import tempfile | |
| import anyio | |
| from pathlib import Path | |
| from lib.language_tts import language_dict | |
| import zipfile | |
| import shutil | |
| import urllib.request | |
| import gdown | |
| import streamlit as st | |
| main_dir = Path().resolve() | |
| print(main_dir) | |
| os.chdir(main_dir) | |
| models_dir = "models" | |
| # Download audio using yt-dlp | |
| def download_audio(url): | |
| ydl_opts = { | |
| 'format': 'bestaudio/best', | |
| 'outtmpl': 'ytdl/%(title)s.%(ext)s', | |
| 'postprocessors': [{'key': 'FFmpegExtractAudio', 'preferredcodec': 'wav', 'preferredquality': '192'}], | |
| } | |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
| info_dict = ydl.extract_info(url, download=True) | |
| file_path = ydl.prepare_filename(info_dict).rsplit('.', 1)[0] + '.wav' | |
| sample_rate, audio_data = read(file_path) | |
| audio_array = np.asarray(audio_data, dtype=np.int16) | |
| return sample_rate, audio_array | |
| def separate_audio(input_audio, output_dir, model_voc_inst, model_deecho, model_back_voc): | |
| if not os.path.exists(output_dir): | |
| os.makedirs(output_dir) | |
| separator = Separator(output_dir=output_dir) | |
| vocals = os.path.join(output_dir, 'Vocals.wav') | |
| instrumental = os.path.join(output_dir, 'Instrumental.wav') | |
| vocals_reverb = os.path.join(output_dir, 'Vocals (Reverb).wav') | |
| vocals_no_reverb = os.path.join(output_dir, 'Vocals (No Reverb).wav') | |
| lead_vocals = os.path.join(output_dir, 'Lead Vocals.wav') | |
| backing_vocals = os.path.join(output_dir, 'Backing Vocals.wav') | |
| separator.load_model(model_filename=model_voc_inst) | |
| voc_inst = separator.separate(input_audio) | |
| os.rename(os.path.join(output_dir, voc_inst[0]), instrumental) | |
| os.rename(os.path.join(output_dir, voc_inst[1]), vocals) | |
| separator.load_model(model_filename=model_deecho) | |
| voc_no_reverb = separator.separate(vocals) | |
| os.rename(os.path.join(output_dir, voc_no_reverb[0]), vocals_no_reverb) | |
| os.rename(os.path.join(output_dir, voc_no_reverb[1]), vocals_reverb) | |
| separator.load_model(model_filename=model_back_voc) | |
| backing_voc = separator.separate(vocals_no_reverb) | |
| os.rename(os.path.join(output_dir, backing_voc[0]), backing_vocals) | |
| os.rename(os.path.join(output_dir, backing_voc[1]), lead_vocals) | |
| return instrumental, vocals, vocals_reverb, vocals_no_reverb, lead_vocals, backing_vocals | |
| async def text_to_speech_edge(text, language_code): | |
| voice = language_dict.get(language_code, "default_voice") | |
| communicate = edge_tts.Communicate(text, voice) | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmp_file: | |
| tmp_path = tmp_file.name | |
| await communicate.save(tmp_path) | |
| return tmp_path | |
| # Streamlit UI | |
| st.title("Hex RVC") | |
| tabs = st.tabs(["Inference", "Download RVC Model", "Audio Separation"]) | |
| # Inference Tab | |
| with tabs[0]: | |
| st.header("Inference") | |
| model_name = st.text_input("Model Name", placeholder="Enter model name") | |
| sound_path = st.text_input("Audio Path (Optional)", placeholder="Leave blank to upload audio") | |
| uploaded_audio = st.file_uploader("Upload Audio", type=["wav", "mp3"]) | |
| if uploaded_audio is not None: | |
| with open("uploaded_audio.wav", "wb") as f: | |
| f.write(uploaded_audio.read()) | |
| sound_path = "uploaded_audio.wav" | |
| f0_change = st.number_input("Pitch Change (semitones)", value=0) | |
| f0_method = st.selectbox("F0 Method", ["crepe", "harvest", "mangio-crepe", "rmvpe", "rmvpe+", "fcpe", "hybrid[rmvpe+fcpe]"], index=5) | |
| if st.button("Run Inference"): | |
| st.write("Running inference...") | |
| # Download RVC Model Tab | |
| with tabs[1]: | |
| st.header("Download RVC Model") | |
| url = st.text_input("Model URL") | |
| dir_name = st.text_input("Model Name") | |
| if st.button("Download Model"): | |
| try: | |
| download_online_model(url, dir_name) | |
| st.success(f"Model {dir_name} downloaded successfully!") | |
| except Exception as e: | |
| st.error(str(e)) | |
| # Audio Separation Tab | |
| with tabs[2]: | |
| st.header("Audio Separation") | |
| input_audio = st.file_uploader("Upload Audio for Separation", type=["wav", "mp3"]) | |
| if input_audio is not None: | |
| with open("input_audio.wav", "wb") as f: | |
| f.write(input_audio.read()) | |
| st.write("Audio uploaded successfully.") | |
| if st.button("Separate Audio"): | |
| st.write("Separating audio...") | |
| output_dir = "./separated_audio" | |
| inst, voc, voc_rev, voc_no_rev, lead_voc, back_voc = separate_audio("input_audio.wav", output_dir, | |
| 'model_bs_roformer.ckpt', | |
| 'UVR-DeEcho-DeReverb.pth', | |
| 'mel_band_karaoke.ckpt') | |
| st.audio(inst) | |
| st.audio(voc) | |
| st.audio(voc_rev) | |
| st.audio(voc_no_rev) | |
| st.audio(lead_voc) | |
| st.audio(back_voc) | |