rumbleFTW commited on
Commit
f2c3e4e
·
verified ·
1 Parent(s): 46f8efa
Files changed (3) hide show
  1. app.py +278 -0
  2. inference.py +33 -0
  3. utils.py +20 -0
app.py ADDED
@@ -0,0 +1,278 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import numpy as np
3
+ import torch
4
+ from moshi.models.loaders import CheckpointInfo
5
+ from moshi.models.tts import DEFAULT_DSM_TTS_REPO, TTSModel
6
+
7
+ checkpoint_info = CheckpointInfo.from_hf_repo(DEFAULT_DSM_TTS_REPO)
8
+ tts_model = TTSModel.from_checkpoint_info(
9
+ checkpoint_info, n_q=32, temp=0.6, device=torch.device("cpu")
10
+ )
11
+
12
+
13
+ def generate_audio(text, voice):
14
+ entries = tts_model.prepare_script([text], padding_between=1)
15
+ voice_path = tts_model.get_voice_path(voice)
16
+ condition_attributes = tts_model.make_condition_attributes(
17
+ [voice_path], cfg_coef=2.0
18
+ )
19
+
20
+ pcms = []
21
+
22
+ def _on_frame(frame):
23
+ if (frame != -1).all():
24
+ pcm = tts_model.mimi.decode(frame[:, 1:, :]).cpu().numpy()
25
+ pcms.append(np.clip(pcm[0, 0], -1, 1))
26
+
27
+ all_entries = [entries]
28
+ all_condition_attributes = [condition_attributes]
29
+
30
+ with tts_model.mimi.streaming(len(all_entries)):
31
+ tts_model.generate(all_entries, all_condition_attributes, on_frame=_on_frame)
32
+
33
+ if len(pcms) == 0:
34
+ return None
35
+
36
+ audio = np.concatenate(pcms, axis=-1)
37
+ sample_rate = tts_model.mimi.sample_rate
38
+ return (sample_rate, audio)
39
+
40
+
41
+ iface = gr.Interface(
42
+ fn=generate_audio,
43
+ inputs=[
44
+ gr.Textbox(
45
+ label="Input Text",
46
+ placeholder="Enter text to convert to speech...",
47
+ lines=3,
48
+ value="This is a test of the text-to-speech model. Please select a voice and click 'Submit' to generate audio.",
49
+ ),
50
+ gr.Dropdown(
51
+ label="Voice",
52
+ choices=[
53
+ "unmute-prod-website/default_voice.wav",
54
+ "unmute-prod-website/p329_022.wav",
55
+ "unmute-prod-website/degaulle-2.wav",
56
+ "unmute-prod-website/fabieng-enhanced-v2.wav",
57
+ "unmute-prod-website/ex04_narration_longform_00001.wav",
58
+ "unmute-prod-website/developpeuse-3.wav",
59
+ "expresso/ex04-ex02_nonverbal_004_channel2_71s.wav",
60
+ "expresso/ex01-ex02_projected_002_channel2_248s.wav",
61
+ "expresso/ex03-ex01_nonverbal_001_channel2_37s.wav",
62
+ "expresso/ex03-ex01_angry_001_channel1_201s.wav",
63
+ "expresso/ex01-ex02_enunciated_001_channel2_354s.wav",
64
+ "expresso/ex03-ex02_laughing_001_channel1_248s.wav",
65
+ "expresso/ex01-ex02_enunciated_001_channel1_432s.wav",
66
+ "expresso/ex04-ex01_disgusted_001_channel1_130s.wav",
67
+ "expresso/ex01-ex02_whisper_001_channel2_717s.wav",
68
+ "expresso/ex04-ex02_confused_001_channel2_488s.wav",
69
+ "expresso/ex03-ex02_animal-animaldir_003_channel1_32s.wav",
70
+ "expresso/ex04-ex01_narration_001_channel2_686s.wav",
71
+ "expresso/ex01-ex02_fast_001_channel1_104s.wav",
72
+ "expresso/ex01-ex02_fast_001_channel2_73s.wav",
73
+ "expresso/ex03-ex02_animaldir-animal_008_channel1_147s.wav",
74
+ "expresso/ex04-ex02_happy_001_channel1_118s.wav",
75
+ "expresso/ex04-ex02_enunciated_001_channel2_898s.wav",
76
+ "expresso/ex03-ex01_calm_001_channel2_1081s.wav",
77
+ "expresso/ex04-ex03_fast_001_channel2_25s.wav",
78
+ "expresso/ex03-ex01_laughing_002_channel2_232s.wav",
79
+ "expresso/ex03-ex01_disgusted_004_channel1_170s.wav",
80
+ "expresso/ex01-ex02_default_001_channel1_168s.wav",
81
+ "expresso/ex04-ex01_animal-animaldir_006_channel1_196s.wav",
82
+ "expresso/ex01-ex02_default_001_channel2_198s.wav",
83
+ "expresso/ex03-ex02_childdir-child_004_channel2_187s.wav",
84
+ "expresso/ex03-ex01_sarcastic_001_channel2_491s.wav",
85
+ "expresso/ex03-ex01_confused_001_channel2_816s.wav",
86
+ "expresso/ex03-ex02_sympathetic-sad_008_channel1_215s.wav",
87
+ "expresso/ex04-ex02_sarcastic_001_channel1_519s.wav",
88
+ "expresso/ex03-ex01_calm_001_channel1_1143s.wav",
89
+ "expresso/ex04-ex01_child-childdir_003_channel2_283s.wav",
90
+ "expresso/ex03-ex01_sleepy_001_channel1_619s.wav",
91
+ "expresso/ex04-ex02_enunciated_001_channel1_496s.wav",
92
+ "expresso/ex03-ex01_desire_004_channel1_545s.wav",
93
+ "expresso/ex04-ex01_laughing_001_channel1_306s.wav",
94
+ "expresso/ex03-ex01_happy_001_channel2_257s.wav",
95
+ "expresso/ex04-ex01_disgusted_001_channel2_325s.wav",
96
+ "expresso/ex04-ex02_bored_001_channel1_254s.wav",
97
+ "expresso/ex04-ex02_awe_001_channel1_982s.wav",
98
+ "expresso/ex04-ex01_sympathetic-sad_008_channel2_453s.wav",
99
+ "expresso/ex04-ex03_enunciated_001_channel1_86s.wav",
100
+ "expresso/ex01-ex02_whisper_001_channel1_579s.wav",
101
+ "expresso/ex03-ex01_enunciated_001_channel1_388s.wav",
102
+ "expresso/ex04-ex03_whisper_002_channel2_266s.wav",
103
+ "expresso/ex04-ex03_default_001_channel1_3s.wav",
104
+ "expresso/ex04-ex02_calm_002_channel1_480s.wav",
105
+ "expresso/ex04-ex03_whisper_001_channel1_198s.wav",
106
+ "expresso/ex04-ex01_laughing_001_channel2_293s.wav",
107
+ "expresso/ex03-ex01_nonverbal_006_channel1_62s.wav",
108
+ "expresso/ex04-ex02_happy_001_channel2_140s.wav",
109
+ "expresso/ex04-ex02_desire_001_channel2_694s.wav",
110
+ "expresso/ex03-ex02_narration_002_channel2_1136s.wav",
111
+ "expresso/ex04-ex01_animaldir-animal_001_channel1_118s.wav",
112
+ "expresso/ex04-ex03_projected_001_channel2_179s.wav",
113
+ "expresso/ex03-ex01_laughing_001_channel1_188s.wav",
114
+ "expresso/ex04-ex02_laughing_001_channel1_147s.wav",
115
+ "expresso/ex03-ex01_desire_004_channel2_580s.wav",
116
+ "expresso/ex04-ex02_fearful_001_channel2_266s.wav",
117
+ "expresso/ex04-ex01_narration_001_channel1_605s.wav",
118
+ "expresso/ex03-ex01_awe_001_channel1_1323s.wav",
119
+ "expresso/ex04-ex01_childdir-child_001_channel1_228s.wav",
120
+ "expresso/ex04-ex01_animaldir-animal_004_channel2_88s.wav",
121
+ "expresso/ex04-ex01_animal-animaldir_006_channel2_49s.wav",
122
+ "expresso/ex03-ex01_happy_001_channel1_334s.wav",
123
+ "expresso/ex03-ex02_sad-sympathetic_001_channel1_454s.wav",
124
+ "expresso/ex03-ex02_sympathetic-sad_008_channel2_268s.wav",
125
+ "expresso/ex04-ex02_bored_001_channel2_232s.wav",
126
+ "expresso/ex04-ex03_projected_001_channel1_192s.wav",
127
+ "expresso/ex04-ex03_enunciated_001_channel2_342s.wav",
128
+ "expresso/ex04-ex01_sympathetic-sad_008_channel1_415s.wav",
129
+ "expresso/ex04-ex02_laughing_001_channel2_159s.wav",
130
+ "expresso/ex04-ex02_calm_001_channel2_336s.wav",
131
+ "expresso/ex04-ex02_awe_001_channel2_1013s.wav",
132
+ "expresso/ex03-ex02_narration_001_channel1_674s.wav",
133
+ "expresso/ex03-ex01_awe_001_channel2_1290s.wav",
134
+ "expresso/ex03-ex01_sarcastic_001_channel1_435s.wav",
135
+ "expresso/ex04-ex02_disgusted_004_channel1_169s.wav",
136
+ "expresso/ex04-ex02_desire_001_channel1_657s.wav",
137
+ "expresso/ex04-ex02_nonverbal_004_channel1_18s.wav",
138
+ "expresso/ex04-ex03_default_002_channel2_239s.wav",
139
+ "expresso/ex04-ex02_confused_001_channel1_499s.wav",
140
+ "expresso/ex01-ex02_projected_001_channel1_46s.wav",
141
+ "expresso/ex04-ex02_angry_001_channel2_150s.wav",
142
+ "expresso/ex03-ex02_child-childdir_001_channel2_69s.wav",
143
+ "expresso/ex03-ex01_confused_001_channel1_909s.wav",
144
+ "expresso/ex03-ex01_angry_001_channel2_181s.wav",
145
+ "expresso/ex04-ex03_fast_001_channel1_208s.wav",
146
+ "expresso/ex04-ex02_fearful_001_channel1_316s.wav",
147
+ "expresso/ex03-ex02_animaldir-animal_008_channel2_136s.wav",
148
+ "expresso/ex03-ex02_child-childdir_001_channel1_291s.wav",
149
+ "expresso/ex03-ex02_laughing_001_channel2_234s.wav",
150
+ "expresso/ex03-ex02_sad-sympathetic_001_channel2_400s.wav",
151
+ "expresso/ex04-ex01_sad-sympathetic_001_channel1_267s.wav",
152
+ "expresso/ex03-ex01_sleepy_001_channel2_662s.wav",
153
+ "expresso/ex03-ex02_childdir-child_004_channel1_308s.wav",
154
+ "expresso/ex04-ex01_sad-sympathetic_001_channel2_346s.wav",
155
+ "expresso/ex04-ex02_disgusted_001_channel2_98s.wav",
156
+ "expresso/ex03-ex01_enunciated_001_channel2_576s.wav",
157
+ "expresso/ex04-ex02_sarcastic_001_channel2_466s.wav",
158
+ "expresso/ex04-ex01_child-childdir_004_channel1_118s.wav",
159
+ "expresso/ex04-ex02_angry_001_channel1_119s.wav",
160
+ "expresso/ex03-ex02_animal-animaldir_002_channel2_89s.wav",
161
+ "expresso/ex04-ex01_childdir-child_001_channel2_420s.wav",
162
+ "vctk/p323_023.wav",
163
+ "vctk/p333_023.wav",
164
+ "vctk/p280_023.wav",
165
+ "vctk/p239_023.wav",
166
+ "vctk/p341_023.wav",
167
+ "vctk/p229_023.wav",
168
+ "vctk/p351_023.wav",
169
+ "vctk/p264_023.wav",
170
+ "vctk/p274_023.wav",
171
+ "vctk/p299_023.wav",
172
+ "vctk/p230_023.wav",
173
+ "vctk/p252_023.wav",
174
+ "vctk/p305_023.wav",
175
+ "vctk/p315_023.wav",
176
+ "vctk/p231_023.wav",
177
+ "vctk/p288_023.wav",
178
+ "vctk/p298_023.wav",
179
+ "vctk/p253_023.wav",
180
+ "vctk/p243_023.wav",
181
+ "vctk/p376_023.wav",
182
+ "vctk/p314_023.wav",
183
+ "vctk/p304_023.wav",
184
+ "vctk/p228_023.wav",
185
+ "vctk/p238_023.wav",
186
+ "vctk/p281_023.wav",
187
+ "vctk/p275_023.wav",
188
+ "vctk/p265_023.wav",
189
+ "vctk/p339_023.wav",
190
+ "vctk/p241_023.wav",
191
+ "vctk/p329_023.wav",
192
+ "vctk/p251_023.wav",
193
+ "vctk/p233_023.wav",
194
+ "vctk/p306_023.wav",
195
+ "vctk/p316_023.wav",
196
+ "vctk/p364_023.wav",
197
+ "vctk/p374_023.wav",
198
+ "vctk/p283_023.wav",
199
+ "vctk/p293_023.wav",
200
+ "vctk/p258_023.wav",
201
+ "vctk/p330_023.wav",
202
+ "vctk/p248_023.wav",
203
+ "vctk/p267_023.wav",
204
+ "vctk/p277_023.wav",
205
+ "vctk/p292_023.wav",
206
+ "vctk/p282_023.wav",
207
+ "vctk/p343_023.wav",
208
+ "vctk/p249_023.wav",
209
+ "vctk/p259_023.wav",
210
+ "vctk/p276_023.wav",
211
+ "vctk/p266_023.wav",
212
+ "vctk/p250_023.wav",
213
+ "vctk/p240_023.wav",
214
+ "vctk/p232_023.wav",
215
+ "vctk/p317_023.wav",
216
+ "vctk/p307_023.wav",
217
+ "vctk/p302_023.wav",
218
+ "vctk/p312_023.wav",
219
+ "vctk/p360_023.wav",
220
+ "vctk/p245_023.wav",
221
+ "vctk/p255_023.wav",
222
+ "vctk/p227_023.wav",
223
+ "vctk/p237_023.wav",
224
+ "vctk/p263_023.wav",
225
+ "vctk/p273_023.wav",
226
+ "vctk/p287_023.wav",
227
+ "vctk/p297_023.wav",
228
+ "vctk/p334_023.wav",
229
+ "vctk/s5_023.wav",
230
+ "vctk/p272_023.wav",
231
+ "vctk/p262_023.wav",
232
+ "vctk/p347_023.wav",
233
+ "vctk/p286_023.wav",
234
+ "vctk/p335_023.wav",
235
+ "vctk/p313_023.wav",
236
+ "vctk/p303_023.wav",
237
+ "vctk/p361_023.wav",
238
+ "vctk/p254_023.wav",
239
+ "vctk/p244_023.wav",
240
+ "vctk/p236_023.wav",
241
+ "vctk/p226_023.wav",
242
+ "vctk/p318_023.wav",
243
+ "vctk/p260_023.wav",
244
+ "vctk/p308_023.wav",
245
+ "vctk/p270_023.wav",
246
+ "vctk/p345_023.wav",
247
+ "vctk/p284_023.wav",
248
+ "vctk/p294_023.wav",
249
+ "vctk/p363_023.wav",
250
+ "vctk/p301_023.wav",
251
+ "vctk/p279_023.wav",
252
+ "vctk/p311_023.wav",
253
+ "vctk/p269_023.wav",
254
+ "vctk/p234_023.wav",
255
+ "vctk/p246_023.wav",
256
+ "vctk/p256_023.wav",
257
+ "vctk/p310_023.wav",
258
+ "vctk/p278_023.wav",
259
+ "vctk/p300_023.wav",
260
+ "vctk/p225_023.wav",
261
+ "vctk/p257_023.wav",
262
+ "vctk/p247_023.wav",
263
+ "vctk/p271_023.wav",
264
+ "vctk/p261_023.wav",
265
+ "vctk/p336_023.wav",
266
+ "vctk/p326_023.wav",
267
+ "vctk/p285_023.wav",
268
+ ],
269
+ value="expresso/ex03-ex01_happy_001_channel1_334s.wav",
270
+ ),
271
+ ],
272
+ outputs=gr.Audio(label="Generated Audio"),
273
+ title="kyutai/tts-1.6b-en_fr",
274
+ description="Convert text to speech using the kyutai/tts-1.6b-en_fr model. Select a voice and enter text to generate audio.",
275
+ )
276
+
277
+ if __name__ == "__main__":
278
+ iface.launch()
inference.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import numpy as np
3
+ import torch
4
+ from moshi.models.loaders import CheckpointInfo
5
+ from moshi.models.tts import DEFAULT_DSM_TTS_REPO, DEFAULT_DSM_TTS_VOICE_REPO, TTSModel
6
+
7
+ def load_model():
8
+ checkpoint_info = CheckpointInfo.from_hf_repo(DEFAULT_DSM_TTS_REPO)
9
+ tts_model = TTSModel.from_checkpoint_info(
10
+ checkpoint_info, n_q=32, temp=0.6, device=torch.device("cpu")
11
+ )
12
+ return tts_model
13
+
14
+ def generate_audio(tts_model, text, voice):
15
+ entries = tts_model.prepare_script([text], padding_between=1)
16
+ voice_path = tts_model.get_voice_path(voice)
17
+ condition_attributes = tts_model.make_condition_attributes(
18
+ [voice_path], cfg_coef=2.0
19
+ )
20
+
21
+ pcms = []
22
+ def _on_frame(frame):
23
+ if (frame != -1).all():
24
+ pcm = tts_model.mimi.decode(frame[:, 1:, :]).cpu().numpy()
25
+ pcms.append(np.clip(pcm[0, 0], -1, 1))
26
+
27
+ all_entries = [entries]
28
+ all_condition_attributes = [condition_attributes]
29
+ with tts_model.mimi.streaming(len(all_entries)):
30
+ tts_model.generate(all_entries, all_condition_attributes, on_frame=_on_frame)
31
+
32
+ audio = np.concatenate(pcms, axis=-1)
33
+ return audio
utils.py ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+
3
+ def load_voice_path(voice):
4
+ """Load the voice path from the given voice identifier."""
5
+ return os.path.join("path_to_voice_repo", voice)
6
+
7
+ def load_configuration(config_file):
8
+ """Load configuration settings from a specified file."""
9
+ import json
10
+ with open(config_file, 'r') as f:
11
+ return json.load(f)
12
+
13
+ def save_audio_file(audio, file_path):
14
+ """Save the generated audio to a specified file path."""
15
+ from scipy.io.wavfile import write
16
+ write(file_path, 22050, audio) # Assuming a sample rate of 22050 Hz
17
+
18
+ def clip_audio(audio):
19
+ """Clip audio to the range [-1, 1]."""
20
+ return np.clip(audio, -1, 1)