Skip to content

Commit

Permalink
Merge branch 'main' into fix/tts-install-mac-asset-url-unboundlocalerror
Browse files Browse the repository at this point in the history
  • Loading branch information
tyfiero authored Mar 28, 2024
2 parents 13b001f + 2d3c3fd commit 5f35f68
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 20 deletions.
43 changes: 26 additions & 17 deletions software/source/server/services/stt/local-whisper/stt.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

import os
import subprocess
import platform
import urllib.request


class Stt:
Expand All @@ -23,7 +25,6 @@ def stt(self, audio_file_path):
return stt(self.service_directory, audio_file_path)



def install(service_dir):

### INSTALL
Expand All @@ -42,27 +43,31 @@ def install(service_dir):
# Check if whisper-rust executable exists before attempting to build
if not os.path.isfile(os.path.join(WHISPER_RUST_PATH, "target/release/whisper-rust")):
# Check if Rust is installed. Needed to build whisper executable
rust_check = subprocess.call('command -v rustc', shell=True)
if rust_check != 0:

rustc_path = shutil.which("rustc")

if rustc_path is None:
print("Rust is not installed or is not in system PATH. Please install Rust before proceeding.")
exit(1)

# Build Whisper Rust executable if not found
subprocess.call('cargo build --release', shell=True)
subprocess.run(['cargo', 'build', '--release'], check=True)
else:
print("Whisper Rust executable already exists. Skipping build.")

WHISPER_MODEL_PATH = os.path.join(service_dir, "model")

WHISPER_MODEL_NAME = os.getenv('WHISPER_MODEL_NAME', 'ggml-tiny.en.bin')
WHISPER_MODEL_URL = os.getenv('WHISPER_MODEL_URL', 'https://huggingface.co/ggerganov/whisper.cpp/resolve/main/')

if not os.path.isfile(os.path.join(WHISPER_MODEL_PATH, WHISPER_MODEL_NAME)):
os.makedirs(WHISPER_MODEL_PATH, exist_ok=True)
subprocess.call(f'curl -L "{WHISPER_MODEL_URL}{WHISPER_MODEL_NAME}" -o "{os.path.join(WHISPER_MODEL_PATH, WHISPER_MODEL_NAME)}"', shell=True)
urllib.request.urlretrieve(f"{WHISPER_MODEL_URL}{WHISPER_MODEL_NAME}",
os.path.join(WHISPER_MODEL_PATH, WHISPER_MODEL_NAME))
else:
print("Whisper model already exists. Skipping download.")


def convert_mime_type_to_format(mime_type: str) -> str:
if mime_type == "audio/x-wav" or mime_type == "audio/wav":
return "wav"
Expand All @@ -73,6 +78,7 @@ def convert_mime_type_to_format(mime_type: str) -> str:

return mime_type


@contextlib.contextmanager
def export_audio_to_wav_ffmpeg(audio: bytearray, mime_type: str) -> str:
temp_dir = tempfile.gettempdir()
Expand Down Expand Up @@ -105,10 +111,12 @@ def export_audio_to_wav_ffmpeg(audio: bytearray, mime_type: str) -> str:
os.remove(input_path)
os.remove(output_path)


def run_command(command):
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
return result.stdout, result.stderr


def get_transcription_file(service_directory, wav_file_path: str):
local_path = os.path.join(service_directory, 'model')
whisper_rust_path = os.path.join(service_directory, 'whisper-rust', 'target', 'release')
Expand All @@ -124,14 +132,15 @@ def get_transcription_file(service_directory, wav_file_path: str):


def stt_wav(service_directory, wav_file_path: str):
temp_dir = tempfile.gettempdir()
output_path = os.path.join(temp_dir, f"output_stt_{datetime.now().strftime('%Y%m%d%H%M%S%f')}.wav")
ffmpeg.input(wav_file_path).output(output_path, acodec='pcm_s16le', ac=1, ar='16k').run()
try:
transcript = get_transcription_file(service_directory, output_path)
finally:
os.remove(output_path)
return transcript
temp_dir = tempfile.gettempdir()
output_path = os.path.join(temp_dir, f"output_stt_{datetime.now().strftime('%Y%m%d%H%M%S%f')}.wav")
ffmpeg.input(wav_file_path).output(output_path, acodec='pcm_s16le', ac=1, ar='16k').run()
try:
transcript = get_transcription_file(service_directory, output_path)
finally:
os.remove(output_path)
return transcript


def stt(service_directory, input_data):
return stt_wav(service_directory, input_data)
return stt_wav(service_directory, input_data)
7 changes: 4 additions & 3 deletions software/source/server/services/tts/piper/tts.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def install(self, service_directory):
return
elif OS == "windows":
if ARCH == "AMD64":
ARCH = "x64"
ARCH = "amd64"
else:
print("Piper: unsupported architecture")
return
Expand All @@ -60,13 +60,14 @@ def install(self, service_directory):
asset_url = f"{PIPER_URL}{PIPER_ASSETNAME}"

if OS == "windows":

asset_url = asset_url.replace(".tar.gz", ".zip")

# Download and extract Piper
urllib.request.urlretrieve(asset_url, os.path.join(PIPER_FOLDER_PATH, PIPER_ASSETNAME))

# Extract the downloaded file
if OS == "windows":
if OS == "Windows":
import zipfile
with zipfile.ZipFile(os.path.join(PIPER_FOLDER_PATH, PIPER_ASSETNAME), 'r') as zip_ref:
zip_ref.extractall(path=PIPER_FOLDER_PATH)
Expand Down Expand Up @@ -107,4 +108,4 @@ def install(self, service_directory):

print("Piper setup completed.")
else:
print("Piper already set up. Skipping download.")
print("Piper already set up. Skipping download.")
5 changes: 5 additions & 0 deletions software/source/server/utils/kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ def custom_filter(message):

def check_filtered_kernel():
messages = get_kernel_messages()
if messages is None:
return "" # Handle unsupported platform or error in fetching kernel messages

global last_messages
messages.replace(last_messages, "")
messages = messages.split("\n")

Expand All @@ -55,6 +59,7 @@ def check_filtered_kernel():

return "\n".join(filtered_messages)


async def put_kernel_messages_into_queue(queue):
while True:
text = check_filtered_kernel()
Expand Down

0 comments on commit 5f35f68

Please sign in to comment.