Spaces:
Build error
Build error
test with states
Browse files
app.py
CHANGED
@@ -2,83 +2,133 @@ import os
|
|
2 |
import csv
|
3 |
import pandas as pd
|
4 |
import gradio as gr
|
5 |
-
import
|
6 |
import scipy.io.wavfile as wavf
|
7 |
-
from huggingface_hub import Repository
|
|
|
|
|
|
|
8 |
|
9 |
HF_TOKEN = os.environ.get("HF_TOKEN")
|
10 |
|
11 |
|
12 |
DATASET_REPO_URL = "https://huggingface.co/datasets/chrisjay/crowd-speech-africa"
|
13 |
-
DATA_FILENAME = "data.csv"
|
14 |
-
|
15 |
-
|
16 |
-
|
|
|
17 |
# Get a dropdown of all African languages
|
18 |
-
DEFAULT_LANGS = {'Igbo':'ibo','Yoruba':'yor','Hausa':'hau'}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
|
20 |
repo = Repository(
|
21 |
local_dir="data", clone_from=DATASET_REPO_URL, use_auth_token=HF_TOKEN
|
22 |
)
|
23 |
repo.git_pull()
|
24 |
|
25 |
-
os.makedirs(AUDIO_PATH,exist_ok=True)
|
26 |
|
27 |
|
28 |
-
def push_record():
|
29 |
-
# Push the wav to a folder and reference the location
|
30 |
-
commit_url = repo.push_to_hub()
|
31 |
-
output = f'Recordings successfully pushed!'
|
32 |
-
output_string = "<html> <body> <div class='output' style='color:green; font-size:13px'>"+output+"</div> </body> </html>"
|
33 |
-
return output_string
|
34 |
-
|
35 |
|
|
|
|
|
36 |
|
37 |
-
def save_record(language,text,record):
|
38 |
# Save text and its corresponding record to flag
|
39 |
-
|
40 |
-
if
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
lang_id = DEFAULT_LANGS[language]
|
42 |
text =text.strip()
|
43 |
|
44 |
# Write audio to file
|
45 |
-
|
46 |
-
|
|
|
|
|
47 |
wavf.write(audio_output_filename,record[0],record[1])
|
48 |
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
writer.writerow(
|
59 |
-
{"language": lang_id, "audio": audio_output_filename,"text": text}
|
60 |
-
)
|
61 |
|
62 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
|
|
|
|
|
64 |
if record is None:
|
65 |
output="No recording found!"
|
66 |
if language is None or language=='Choose language':
|
67 |
output = 'Language must be specified!'
|
68 |
output_string = "<html> <body> <div class='output' style='color:green; font-size:13px'>"+output+"</div> </body> </html>"
|
|
|
|
|
69 |
return output_string
|
70 |
|
71 |
|
72 |
def display_records():
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
79 |
|
80 |
html = """<div>
|
81 |
-
<table>
|
82 |
<tr>
|
83 |
<th>language</th>
|
84 |
<th>audio</th>
|
@@ -93,20 +143,17 @@ def display_records():
|
|
93 |
html+="</table></div>"
|
94 |
return html
|
95 |
|
|
|
|
|
96 |
|
|
|
97 |
|
98 |
|
99 |
-
title = 'African Crowdsource Speech'
|
100 |
-
description = 'A platform to contribute to your African language by recording your voice'
|
101 |
-
|
102 |
-
markdown = """# Africa Crowdsource Speech
|
103 |
|
104 |
-
|
|
|
105 |
|
106 |
|
107 |
-
GENDER = ['Choose Gender','Male','Female','Other','Prefer not to say']
|
108 |
-
NUMBERS = [i for i in range(21)]
|
109 |
-
|
110 |
# Interface design begins
|
111 |
block = gr.Blocks()
|
112 |
with block:
|
@@ -114,26 +161,24 @@ with block:
|
|
114 |
with gr.Tabs():
|
115 |
|
116 |
with gr.TabItem('Record'):
|
117 |
-
#with gr.Row():
|
118 |
-
language = gr.inputs.Dropdown(choices = list(DEFAULT_LANGS.keys()),label="Choose language",default="Choose language")
|
119 |
-
|
120 |
with gr.Row():
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
|
|
129 |
|
130 |
output_result = gr.outputs.HTML()
|
131 |
-
|
132 |
-
|
133 |
-
|
|
|
134 |
|
135 |
-
save.click(save_record, inputs=[language,text,record],outputs=output_result)
|
136 |
-
push.click(push_record, inputs=[],outputs=output_result)
|
137 |
|
138 |
with gr.TabItem('Listen') as listen_tab:
|
139 |
gr.Markdown("Listen to the recordings contributed. You can find them <a href='https://huggingface.co/datasets/chrisjay/crowd-speech-africa' target='blank'>here</a>.")
|
|
|
2 |
import csv
|
3 |
import pandas as pd
|
4 |
import gradio as gr
|
5 |
+
from utils import *
|
6 |
import scipy.io.wavfile as wavf
|
7 |
+
from huggingface_hub import Repository, upload_file
|
8 |
+
|
9 |
+
|
10 |
+
|
11 |
|
12 |
HF_TOKEN = os.environ.get("HF_TOKEN")
|
13 |
|
14 |
|
15 |
DATASET_REPO_URL = "https://huggingface.co/datasets/chrisjay/crowd-speech-africa"
|
16 |
+
#DATA_FILENAME = "data.csv"
|
17 |
+
REPOSITORY_DIR = "data"
|
18 |
+
LOCAL_DIR = 'data_local'
|
19 |
+
#DATA_FILE = os.path.join("data", DATA_FILENAME)
|
20 |
+
os.makedirs(LOCAL_DIR,exist_ok=True)
|
21 |
# Get a dropdown of all African languages
|
22 |
+
#DEFAULT_LANGS = {'Igbo':'ibo','Yoruba':'yor','Hausa':'hau'}
|
23 |
+
|
24 |
+
GENDER = ['Choose Gender','Male','Female','Other','Prefer not to say']
|
25 |
+
NUMBERS = [i for i in range(21)]
|
26 |
+
|
27 |
+
|
28 |
+
#------------------Work on Languages--------------------
|
29 |
+
DEFAULT_LANGS = {}
|
30 |
+
languages = read_json_lines('clean_languages.json')
|
31 |
+
languages_lower=[l for l in languages]
|
32 |
+
|
33 |
+
_ = [DEFAULT_LANGS.update({l['full'].lower():l['id'].lower()}) for l in languages_lower]
|
34 |
+
#_ = [DEFAULT_LANGS.update({l_other.lower():[l['id'].lower()]}) for l in languages_lower for l_other in l['others'] if l_other.lower()!=l['full'].lower()]
|
35 |
+
|
36 |
+
#------------------Work on Languages--------------------
|
37 |
|
38 |
repo = Repository(
|
39 |
local_dir="data", clone_from=DATASET_REPO_URL, use_auth_token=HF_TOKEN
|
40 |
)
|
41 |
repo.git_pull()
|
42 |
|
|
|
43 |
|
44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
|
46 |
+
def save_record(language,text,record,number,age,gender,accent,number_history):
|
47 |
+
number_history = number_history or [0]
|
48 |
|
|
|
49 |
# Save text and its corresponding record to flag
|
50 |
+
speaker_metadata={}
|
51 |
+
speaker_metadata['gender'] = gender if gender!=GENDER[0] else ''
|
52 |
+
speaker_metadata['age'] = age if age !='' else ''
|
53 |
+
speaker_metadata['accent'] = accent if accent!='' else ''
|
54 |
+
|
55 |
+
|
56 |
+
if language!=None and language!='Choose language' and record is not None and number is not None:
|
57 |
+
language = language.lower()
|
58 |
lang_id = DEFAULT_LANGS[language]
|
59 |
text =text.strip()
|
60 |
|
61 |
# Write audio to file
|
62 |
+
audio_name = get_unique_name()
|
63 |
+
SAVE_FILE_DIR = os.path.join(LOCAL_DIR,audio_name)
|
64 |
+
os.makedirs(SAVE_FILE_DIR,exist_ok=True)
|
65 |
+
audio_output_filename = os.path.join(SAVE_FILE_DIR,'audio.wav')
|
66 |
wavf.write(audio_output_filename,record[0],record[1])
|
67 |
|
68 |
+
# Write metadata.json to file
|
69 |
+
json_file_path = os.path.join(SAVE_FILE_DIR,'metadata.jsonl')
|
70 |
+
metadata= {'id':audio_name,'file_name':'audio.wav',
|
71 |
+
'language_name':language,'language_id':lang_id,
|
72 |
+
'number':number, 'text':text,'frequency':record[0],
|
73 |
+
'age': speaker_metadata['age'],'gender': speaker_metadata['gender'],
|
74 |
+
'accent': speaker_metadata['accent']
|
75 |
+
}
|
|
|
|
|
|
|
|
|
76 |
|
77 |
+
dump_json(metadata,json_file_path)
|
78 |
+
|
79 |
+
# Simply upload the audio file and metadata using the hub's upload_file
|
80 |
+
# Upload the audio
|
81 |
+
repo_audio_path = os.path.join(REPOSITORY_DIR,os.path.join(audio_name,'audio.wav'))
|
82 |
+
|
83 |
+
_ = upload_file(path_or_fileobj = audio_output_filename,
|
84 |
+
path_in_repo =repo_audio_path,
|
85 |
+
repo_id='chrisjay/crowd-speech-africa',
|
86 |
+
repo_type='dataset',
|
87 |
+
token=HF_TOKEN
|
88 |
+
)
|
89 |
+
|
90 |
+
# Upload the metadata
|
91 |
+
repo_json_path = os.path.join(REPOSITORY_DIR,os.path.join(audio_name,'metadata.jsonl'))
|
92 |
+
_ = upload_file(path_or_fileobj = json_file_path,
|
93 |
+
path_in_repo =repo_json_path,
|
94 |
+
repo_id='chrisjay/crowd-speech-africa',
|
95 |
+
repo_type='dataset',
|
96 |
+
token=HF_TOKEN
|
97 |
+
)
|
98 |
+
|
99 |
+
output = f'Recording successfully saved!'
|
100 |
|
101 |
+
if number is None:
|
102 |
+
output = "Number must be specified!"
|
103 |
if record is None:
|
104 |
output="No recording found!"
|
105 |
if language is None or language=='Choose language':
|
106 |
output = 'Language must be specified!'
|
107 |
output_string = "<html> <body> <div class='output' style='color:green; font-size:13px'>"+output+"</div> </body> </html>"
|
108 |
+
|
109 |
+
# return output_string, next image and state
|
110 |
return output_string
|
111 |
|
112 |
|
113 |
def display_records():
|
114 |
+
repo.git_pull()
|
115 |
+
REPOSITORY_DATA_DIR = os.path.join(REPOSITORY_DIR,'data')
|
116 |
+
repo_recordings = [os.path.join(REPOSITORY_DATA_DIR,f.name) for f in os.scandir(REPOSITORY_DATA_DIR)] if os.path.isdir(REPOSITORY_DATA_DIR) else []
|
117 |
+
|
118 |
+
audio_repo = [os.path.join(f,'audio.wav') for f in repo_recordings]
|
119 |
+
audio_repo = [a.replace('data/data/','https://huggingface.co/datasets/chrisjay/crowd-speech-africa/resolve/main/data/') for a in audio_repo]
|
120 |
+
metadata_repo = [read_json_lines(os.path.join(f,'metadata.jsonl'))[0] for f in repo_recordings]
|
121 |
+
audios_all = audio_repo
|
122 |
+
metadata_all = metadata_repo
|
123 |
+
|
124 |
+
|
125 |
+
langs=[m['language_name'] for m in metadata_all]
|
126 |
+
audios = [a for a in audios_all]
|
127 |
+
texts = [m['text'] for m in metadata_all]
|
128 |
+
|
129 |
|
130 |
html = """<div>
|
131 |
+
<table style="width:100%; text-align:center">
|
132 |
<tr>
|
133 |
<th>language</th>
|
134 |
<th>audio</th>
|
|
|
143 |
html+="</table></div>"
|
144 |
return html
|
145 |
|
146 |
+
NUMBER_DIR = './number'
|
147 |
+
number_files = [f.name for f in os.scandir(NUMBER_DIR)]
|
148 |
|
149 |
+
NUMBERS = [{'image':os.path.join(NUMBER_DIR,f),'number':int(f.split('.')[0])} for f in number_files]
|
150 |
|
151 |
|
|
|
|
|
|
|
|
|
152 |
|
153 |
+
markdown = """<div style="text-align: center"><p style="font-size: 40px"> Africa Crowdsource Speech </p> <br>
|
154 |
+
This is a platform to contribute to your African language by recording your voice </div>"""
|
155 |
|
156 |
|
|
|
|
|
|
|
157 |
# Interface design begins
|
158 |
block = gr.Blocks()
|
159 |
with block:
|
|
|
161 |
with gr.Tabs():
|
162 |
|
163 |
with gr.TabItem('Record'):
|
|
|
|
|
|
|
164 |
with gr.Row():
|
165 |
+
language = gr.inputs.Dropdown(choices = sorted([lang_.title() for lang_ in list(DEFAULT_LANGS.keys())]),label="Choose language",default="Choose language")
|
166 |
+
age = gr.inputs.Textbox(placeholder='e.g. 21',label="Your age (optional)",default='')
|
167 |
+
gender = gr.inputs.Dropdown(choices=GENDER, type="value", default=None, label="Gender (optional)")
|
168 |
+
accent = gr.inputs.Textbox(label="Accent (optional)",default='')
|
169 |
+
|
170 |
+
number = gr.Image('number/0.jpg',image_mode="L")
|
171 |
+
#number = gr.inputs.Radio(choices=NUMBERS, type="value", default=None, label="Choose your number")
|
172 |
+
text = gr.inputs.Textbox(placeholder='e.g. `one` is `otu` in Igbo or `ọkan` in Yoruba',label="Number in your language")
|
173 |
+
record = gr.inputs.Audio(source="microphone",label='Record your voice')
|
174 |
|
175 |
output_result = gr.outputs.HTML()
|
176 |
+
state = gr.inputs.State()
|
177 |
+
|
178 |
+
save = gr.Button("Submit")
|
179 |
+
|
180 |
|
181 |
+
save.click(save_record, inputs=[language,text,record,number,age,gender,accent,state],outputs=[output_result,number,state])
|
|
|
182 |
|
183 |
with gr.TabItem('Listen') as listen_tab:
|
184 |
gr.Markdown("Listen to the recordings contributed. You can find them <a href='https://huggingface.co/datasets/chrisjay/crowd-speech-africa' target='blank'>here</a>.")
|