Spaces:
Running
Running
clementruhm
commited on
Commit
·
8749790
1
Parent(s):
6c2c3a2
app.py: introduce free tier
Browse files
app.py
CHANGED
@@ -7,6 +7,8 @@ Voice Conversion service interactive demo
|
|
7 |
import glob
|
8 |
import logging
|
9 |
import os
|
|
|
|
|
10 |
|
11 |
import gradio as gr
|
12 |
|
@@ -14,6 +16,25 @@ from vc_service_request import vc_service_request
|
|
14 |
|
15 |
script_dir = os.path.dirname(os.path.abspath(__file__))
|
16 |
counter = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
|
18 |
def main():
|
19 |
logging.basicConfig(level=logging.INFO)
|
@@ -56,7 +77,10 @@ def main():
|
|
56 |
"""
|
57 |
)
|
58 |
gr.Markdown(badges)
|
59 |
-
|
|
|
|
|
|
|
60 |
with gr.Row():
|
61 |
with gr.Column(variant="panel"):
|
62 |
src_audio_mic = gr.Audio(source="microphone", label="Record your voice")
|
@@ -81,7 +105,7 @@ def main():
|
|
81 |
with gr.Row():
|
82 |
result_audio = gr.Audio()
|
83 |
|
84 |
-
def voice_conversion(src_from_mic_, src_from_file_, tgt_from_file_):
|
85 |
"""
|
86 |
helper function which checks where source come from
|
87 |
"""
|
@@ -93,15 +117,28 @@ def main():
|
|
93 |
tgt_ = tgt_from_file_
|
94 |
if not src_ or not tgt_:
|
95 |
logging.warning("source or target are not provided")
|
|
|
96 |
return
|
97 |
-
global counter
|
98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
counter += 1
|
100 |
-
|
|
|
101 |
|
102 |
convert_btn.click(
|
103 |
voice_conversion,
|
104 |
-
inputs=[src_audio_mic, src_audio_file, tgt_audio_file],
|
105 |
outputs=result_audio,
|
106 |
)
|
107 |
|
|
|
7 |
import glob
|
8 |
import logging
|
9 |
import os
|
10 |
+
import socket
|
11 |
+
from typing import Dict
|
12 |
|
13 |
import gradio as gr
|
14 |
|
|
|
16 |
|
17 |
script_dir = os.path.dirname(os.path.abspath(__file__))
|
18 |
counter = 0
|
19 |
+
# dict to limit max numer of usages per user without API key
|
20 |
+
# clears up on demo restart, but thats ok for now
|
21 |
+
users: Dict[str, int] = {}
|
22 |
+
FREE_TIER = 3
|
23 |
+
|
24 |
+
|
25 |
+
def get_ip(request: gr.Request) -> str:
|
26 |
+
"""
|
27 |
+
returns user IP from request
|
28 |
+
as in https://huggingface.co/spaces/radames/gradio-request-get-client-ip/blob/main/app.py
|
29 |
+
"""
|
30 |
+
client_ip = request.client.host
|
31 |
+
local_ip = socket.gethostbyname(socket.gethostbyname(""))
|
32 |
+
headers = request.kwargs['headers']
|
33 |
+
if headers and 'x-forwarded-for' in headers:
|
34 |
+
x_forwarded_for = headers['x-forwarded-for']
|
35 |
+
client_ip = x_forwarded_for.split(' ')[0] if x_forwarded_for else ""
|
36 |
+
return client_ip
|
37 |
+
|
38 |
|
39 |
def main():
|
40 |
logging.basicConfig(level=logging.INFO)
|
|
|
77 |
"""
|
78 |
)
|
79 |
gr.Markdown(badges)
|
80 |
+
with gr.Row():
|
81 |
+
apikey = gr.Textbox(label="API key", placeholder="Enter API key or leave empty for a free tier")
|
82 |
+
with gr.Row():
|
83 |
+
apisecret = gr.Textbox(label="API secret", placeholder="Enter API secret or leave empty for a free tier")
|
84 |
with gr.Row():
|
85 |
with gr.Column(variant="panel"):
|
86 |
src_audio_mic = gr.Audio(source="microphone", label="Record your voice")
|
|
|
105 |
with gr.Row():
|
106 |
result_audio = gr.Audio()
|
107 |
|
108 |
+
def voice_conversion(src_from_mic_, src_from_file_, tgt_from_file_, api_key_, api_secret_, request_: gr.Request):
|
109 |
"""
|
110 |
helper function which checks where source come from
|
111 |
"""
|
|
|
117 |
tgt_ = tgt_from_file_
|
118 |
if not src_ or not tgt_:
|
119 |
logging.warning("source or target are not provided")
|
120 |
+
gr.Warning("Source or target audio are not provided")
|
121 |
return
|
122 |
+
global counter, users
|
123 |
+
ip_ = get_ip(request_)
|
124 |
+
past_requests_ = users.get(ip_, 0)
|
125 |
+
free_tier_ = False
|
126 |
+
if not api_key_ or not api_secret_:
|
127 |
+
free_tier = True
|
128 |
+
api_key_ = os.environ["api_key"]
|
129 |
+
api_secret_ = os.environ["api_secret"]
|
130 |
+
if free_tier and past_requests_ >= FREE_TIER:
|
131 |
+
gr.Warning("Free tier exceeded, please reach out to get your API key")
|
132 |
+
logging.info(f"Free tier exceeded for {ip_}")
|
133 |
+
return None
|
134 |
+
logging.info(f"Total number of requests: {counter}. {past_requests_} for {ip_}")
|
135 |
counter += 1
|
136 |
+
users[ip_] = past_requests_ + 1
|
137 |
+
return vc_service_request(src_, tgt_, api_key_, api_secret_)
|
138 |
|
139 |
convert_btn.click(
|
140 |
voice_conversion,
|
141 |
+
inputs=[src_audio_mic, src_audio_file, tgt_audio_file, apikey, apisecret],
|
142 |
outputs=result_audio,
|
143 |
)
|
144 |
|