Spaces:
Sleeping
Sleeping
import re | |
import numpy as np | |
import wave | |
class Animalese: | |
def __init__(self, letters_file, onload): | |
with open(letters_file, 'rb') as f: | |
self.letter_library = np.frombuffer(f.read(), dtype=np.uint8) | |
onload() | |
def synthesize(self, script, shorten=False, pitch=1.0): | |
def shorten_word(word): | |
return word[0] + word[-1] if len(word) > 1 else word | |
if shorten: | |
# Replace all non-alphabet characters with spaces and split the script into words | |
words = re.sub(r'[^a-zA-Z]', ' ', script).split() | |
# Shorten each word and join them back into a single string | |
processed_script = "".join(map(shorten_word, words)) | |
else: | |
processed_script = script | |
data = [] | |
sample_freq = 44100 | |
library_letter_secs = 0.15 | |
library_samples_per_letter = int(library_letter_secs * sample_freq) | |
output_letter_secs = 0.075 | |
output_samples_per_letter = int(output_letter_secs * sample_freq) | |
for c in processed_script.upper(): | |
if 'A' <= c <= 'Z': | |
library_letter_start = library_samples_per_letter * (ord(c) - ord('A')) | |
for i in range(output_samples_per_letter): | |
data.append(self.letter_library[44 + library_letter_start + int(i * pitch)]) | |
else: | |
data.extend([127] * output_samples_per_letter) | |
# Create the .wav file data | |
data = np.array(data, dtype=np.uint8) | |
return self.create_wave(data, sample_freq) | |
def create_wave(self, data, sample_rate): | |
output_file = "output.wav" | |
with wave.open(output_file, "wb") as f: | |
f.setnchannels(1) | |
f.setsampwidth(1) | |
f.setframerate(sample_rate) | |
f.writeframes(data.tobytes()) | |
return output_file | |
# Initialize the synthesizer | |
synth = Animalese('animalese.wav', lambda: print("Loaded")) | |
def generate_audio(text, shorten, pitch): | |
return synth.synthesize(text, shorten, pitch) | |
def preview_audio(audio_file): | |
with open(audio_file, 'rb') as f: | |
return f.read() |