tester1hf commited on
Commit
29232db
·
verified ·
1 Parent(s): 8105b9f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +86 -3
app.py CHANGED
@@ -2,9 +2,30 @@ import gradio as gr
2
  from g4f.client import Client
3
  import re
4
  import json
 
 
 
 
 
 
5
 
 
6
  client = Client()
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  def get_task(prompt):
9
  return f'''Ты генерируешь скрипт продолжения прямой линии с Владимиром Владимировичем Путиным. Вопросы телезрителей передаёт Киселёв - он максимально подобострастен, поддерживает Путина и Россию. Пиши в духе пропаганды пророссийской. Каждая реплика - не менее 150-200 символов. Английские названия при необходимости всегда транскрибируй кириллицей. Числительные также записывай кириллицей. Пиши в стиле кремлёвской пропаганды. Пиши в стереотипном стиле. Киселёв задаёт вопросы, обрашается к Путину как "Владимир Владимирович" или "Господин Президент". Путин отвечает. Всё максимально аутентично. Фразы Киселёва: {{"Киселёв":"фраза"}} Фразы Путина: {{"Путин":"фраза"}} Ответ дай в формате JSON без дополнительных символов: [{{"Киселёв":"фраза"}}, {{"Путин":"фраза"}} . . . ].
10
  Вопрос от пользователя поступил: "{prompt}"'''
@@ -34,6 +55,68 @@ def generate_text(prompt):
34
  # If all retries fail, return a placeholder
35
  return '[{"Киселёв":"К сожалению, не удалось расслышать вопрос. Пожалуйста, попробуйте еще раз."}, {"Путин":"Мы работаем над улучшением системы. Спасибо за понимание."}]'
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  examples = [
38
  "Почему такие высокие налоги?",
39
  "Какие цели СВО?",
@@ -51,18 +134,18 @@ with gr.Blocks() as demo:
51
  )
52
 
53
  generate_btn = gr.Button("Generate", variant="primary")
54
- output = gr.Textbox(label="Generated Text", interactive=False)
55
 
56
  gr.Examples(
57
  examples=examples,
58
  inputs=prompt_input,
59
  outputs=output,
60
- fn=generate_text,
61
  cache_examples=False
62
  )
63
 
64
  generate_btn.click(
65
- fn=generate_text,
66
  inputs=prompt_input,
67
  outputs=output
68
  )
 
2
  from g4f.client import Client
3
  import re
4
  import json
5
+ import torch
6
+ import soundfile as sf
7
+ from openvoice_cli.__main__ import tune_one
8
+ import os
9
+ import uuid
10
+ import zipfile
11
 
12
+ # Initialize G4F client
13
  client = Client()
14
 
15
+ # Silero TTS configuration
16
+ language = 'ru'
17
+ model_id = 'ru_v3'
18
+ speaker = 'baya' # Russian voice
19
+ sample_rate = 48000 # Sample rate for Russian model
20
+ device = torch.device('cpu')
21
+
22
+ # Load Silero TTS model
23
+ model, _ = torch.hub.load(repo_or_dir='snakers4/silero-models',
24
+ model='silero_tts',
25
+ language=language,
26
+ speaker=model_id)
27
+ model.to(device)
28
+
29
  def get_task(prompt):
30
  return f'''Ты генерируешь скрипт продолжения прямой линии с Владимиром Владимировичем Путиным. Вопросы телезрителей передаёт Киселёв - он максимально подобострастен, поддерживает Путина и Россию. Пиши в духе пропаганды пророссийской. Каждая реплика - не менее 150-200 символов. Английские названия при необходимости всегда транскрибируй кириллицей. Числительные также записывай кириллицей. Пиши в стиле кремлёвской пропаганды. Пиши в стереотипном стиле. Киселёв задаёт вопросы, обрашается к Путину как "Владимир Владимирович" или "Господин Президент". Путин отвечает. Всё максимально аутентично. Фразы Киселёва: {{"Киселёв":"фраза"}} Фразы Путина: {{"Путин":"фраза"}} Ответ дай в формате JSON без дополнительных символов: [{{"Киселёв":"фраза"}}, {{"Путин":"фраза"}} . . . ].
31
  Вопрос от пользователя поступил: "{prompt}"'''
 
55
  # If all retries fail, return a placeholder
56
  return '[{"Киселёв":"К сожалению, не удалось расслышать вопрос. Пожалуйста, попробуйте еще раз."}, {"Путин":"Мы работаем над улучшением системы. Спасибо за понимание."}]'
57
 
58
+ def generate_audio(text, speaker_name):
59
+ # Generate speech using Silero TTS
60
+ audio = model.apply_tts(ssml_text=f"<speak>{text}</speak>",
61
+ speaker=speaker,
62
+ sample_rate=sample_rate,
63
+ put_accent=True,
64
+ put_yo=True)
65
+
66
+ # Save to a temporary file
67
+ temp_filename = f"temp_{speaker_name}.wav"
68
+ sf.write(temp_filename, audio, sample_rate)
69
+ return temp_filename
70
+
71
+ def generate_cover(base_audio, ref_audio):
72
+ # Create unique output filename
73
+ output_filename = f"output_{uuid.uuid4().hex[:6]}.wav"
74
+
75
+ # Process the audio with OpenVoice
76
+ tune_one(
77
+ input_file=base_audio,
78
+ ref_file=ref_audio,
79
+ output_file=output_filename,
80
+ device='cpu'
81
+ )
82
+
83
+ return output_filename
84
+
85
+ def process_prompt(prompt):
86
+ # Generate the script
87
+ script = generate_text(prompt)
88
+ script_data = json.loads(script)
89
+
90
+ # Prepare a list to store the generated audio files
91
+ audio_files = []
92
+
93
+ for i, item in enumerate(script_data):
94
+ for speaker, text in item.items():
95
+ # Generate the base audio using Silero TTS
96
+ base_audio_file = generate_audio(text, speaker)
97
+
98
+ # Determine the reference audio file based on the speaker
99
+ ref_audio_file = "kisel.mp3" if speaker == "Киселёв" else "putin.mp3"
100
+
101
+ # Generate the covered audio using OpenVoice
102
+ covered_audio_file = generate_cover(base_audio_file, ref_audio_file)
103
+
104
+ # Rename the file to include the speaker and sequence number
105
+ final_filename = f"t{i+1}-{speaker}.wav"
106
+ os.rename(covered_audio_file, final_filename)
107
+
108
+ # Add the final file to the list
109
+ audio_files.append(final_filename)
110
+
111
+ # Create a zip file containing all the audio files
112
+ zip_filename = "output_audio_files.zip"
113
+ with zipfile.ZipFile(zip_filename, 'w') as zipf:
114
+ for audio_file in audio_files:
115
+ zipf.write(audio_file)
116
+
117
+ return zip_filename
118
+
119
+ # Gradio interface
120
  examples = [
121
  "Почему такие высокие налоги?",
122
  "Какие цели СВО?",
 
134
  )
135
 
136
  generate_btn = gr.Button("Generate", variant="primary")
137
+ output = gr.File(label="Generated Audio Files")
138
 
139
  gr.Examples(
140
  examples=examples,
141
  inputs=prompt_input,
142
  outputs=output,
143
+ fn=process_prompt,
144
  cache_examples=False
145
  )
146
 
147
  generate_btn.click(
148
+ fn=process_prompt,
149
  inputs=prompt_input,
150
  outputs=output
151
  )