-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnatural_tts.py
More file actions
45 lines (39 loc) · 1.4 KB
/
natural_tts.py
File metadata and controls
45 lines (39 loc) · 1.4 KB
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
from kokoro import KPipeline
import soundfile as sf
from moviepy.audio.AudioClip import concatenate_audioclips
from moviepy import AudioFileClip
class Natural_TTS:
# # pip install misaki[en]
# a='American English',
# b='British English',
# # espeak-ng
# e='es',
# f='fr-fr',
# h='hi',
# i='it',
# p='pt-br',
# # pip install misaki[ja]
# j='Japanese',
# # pip install misaki[zh]
# z='Mandarin Chinese',
def __init__(self, language = "a"):
self.pipeline = KPipeline(lang_code=language, repo_id='hexgrad/Kokoro-82M') # <= make sure lang_code matches voice
def concat_audio(self, n):
clips = [AudioFileClip(f"{i}.mp3") for i in range(n)]
final_clip = concatenate_audioclips(clips)
final_clip.write_audiofile("./static/output/output.mp3")
def text_to_speech(self, text, vspeed=1):
generator = self.pipeline(
text, voice='af_heart', # <= change voice here
speed=vspeed , split_pattern=r'\n+'
)
# audio_number = len(tuple(generator))
# print(audio_number)
j = 1
for i, (gs, ps, audio) in enumerate(generator):
# print(i) # i => index
# print(gs) # gs => graphemes/text
# print(ps) # ps => phonemes
sf.write(f'{i}.mp3', audio, 24000) # save each audio file
j = max(j, i)
self.concat_audio(j)