Spaces:
Sleeping
Sleeping
new gradio commit
Browse files
app.py
CHANGED
@@ -3,7 +3,6 @@ import threading
|
|
3 |
import os
|
4 |
import requests
|
5 |
import string
|
6 |
-
import pygame
|
7 |
import time
|
8 |
from pydub import AudioSegment
|
9 |
from nltk.tokenize import word_tokenize
|
@@ -11,13 +10,24 @@ import nltk
|
|
11 |
from nltk.corpus import words, stopwords
|
12 |
from dotenv import load_dotenv
|
13 |
|
14 |
-
# Initialize pygame mixer for sound playback
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
# Download resource NLTK (hanya sekali)
|
18 |
-
|
19 |
-
nltk.download('
|
20 |
-
nltk.download('
|
|
|
|
|
|
|
21 |
|
22 |
load_dotenv()
|
23 |
API_TRANSCRIBE = os.getenv("API_TRANSCRIBE")
|
@@ -27,8 +37,13 @@ API_TEXT = os.getenv("API_TEXT")
|
|
27 |
NOTIFICATION_SOUND_PATH = "Berhenti.mp3" # Sound ketika recording selesai
|
28 |
START_RECORDING_SOUND_PATH = "Dimulai.mp3" # Sound ketika mulai recording
|
29 |
|
30 |
-
|
31 |
-
|
|
|
|
|
|
|
|
|
|
|
32 |
|
33 |
def load_indonesian_wordlist(filepath='wordlist.lst'):
|
34 |
try:
|
@@ -47,14 +62,18 @@ indonesian_words = load_indonesian_wordlist()
|
|
47 |
valid_words = english_words.union(indonesian_words)
|
48 |
|
49 |
def contains_medical_terms_auto_threshold(text, medical_words):
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
|
|
|
|
|
|
|
|
58 |
|
59 |
medical_words = load_indonesian_wordlist('wordlist.lst')
|
60 |
|
@@ -72,6 +91,10 @@ def validate_audio_duration(audio_file):
|
|
72 |
|
73 |
def play_notification_sound():
|
74 |
"""Function untuk memainkan sound notification ketika recording selesai"""
|
|
|
|
|
|
|
|
|
75 |
try:
|
76 |
if os.path.exists(NOTIFICATION_SOUND_PATH):
|
77 |
pygame.mixer.music.load(NOTIFICATION_SOUND_PATH)
|
@@ -84,6 +107,10 @@ def play_notification_sound():
|
|
84 |
|
85 |
def play_start_recording_sound():
|
86 |
"""Function untuk memainkan sound ketika mulai recording"""
|
|
|
|
|
|
|
|
|
87 |
try:
|
88 |
if os.path.exists(START_RECORDING_SOUND_PATH):
|
89 |
# Menggunakan Sound effect untuk play bersamaan tanpa interrupt music
|
@@ -532,10 +559,11 @@ with gr.Blocks(
|
|
532 |
) as app:
|
533 |
|
534 |
# Header
|
535 |
-
|
|
|
536 |
<div class="main-header">
|
537 |
<h1>ποΈ Realtime Recording</h1>
|
538 |
-
<p>High Quality Audio Recording
|
539 |
</div>
|
540 |
""")
|
541 |
|
@@ -667,9 +695,13 @@ with gr.Blocks(
|
|
667 |
)
|
668 |
|
669 |
# Footer
|
670 |
-
|
|
|
|
|
|
|
|
|
671 |
<div style="text-align: center; padding: 2rem; color: rgba(255,255,255,0.7);">
|
672 |
-
<p>Use via API π₯ β’
|
673 |
</div>
|
674 |
""")
|
675 |
|
@@ -757,28 +789,32 @@ if __name__ == "__main__":
|
|
757 |
print("5. Set up your .env file with API_TRANSCRIBE and API_TEXT")
|
758 |
print()
|
759 |
|
760 |
-
#
|
761 |
-
|
762 |
-
|
763 |
-
|
764 |
-
sounds_status
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
|
769 |
-
|
770 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
771 |
else:
|
772 |
-
print(
|
773 |
-
|
774 |
-
if not sounds_status:
|
775 |
-
print("π Note: Add sound files to enable audio notifications for realtime recording")
|
776 |
-
elif len(sounds_status) == 1:
|
777 |
-
print("π Note: Add the missing sound file for complete audio experience")
|
778 |
|
779 |
print("\nπ Application will start at: http://localhost:7860")
|
780 |
print("ποΈ Make sure to allow microphone access when using Realtime Recording!")
|
781 |
print("β¨ New Modern UI with enhanced visual experience!")
|
782 |
-
print()
|
783 |
-
|
784 |
-
app.launch()
|
|
|
3 |
import os
|
4 |
import requests
|
5 |
import string
|
|
|
6 |
import time
|
7 |
from pydub import AudioSegment
|
8 |
from nltk.tokenize import word_tokenize
|
|
|
10 |
from nltk.corpus import words, stopwords
|
11 |
from dotenv import load_dotenv
|
12 |
|
13 |
+
# Initialize pygame mixer for sound playback (with error handling)
|
14 |
+
AUDIO_AVAILABLE = False
|
15 |
+
try:
|
16 |
+
import pygame
|
17 |
+
pygame.mixer.init()
|
18 |
+
AUDIO_AVAILABLE = True
|
19 |
+
print("β
Audio system initialized successfully")
|
20 |
+
except Exception as e:
|
21 |
+
print(f"β οΈ Audio system not available: {e}")
|
22 |
+
print("π Note: Sound notifications will be disabled")
|
23 |
|
24 |
# Download resource NLTK (hanya sekali)
|
25 |
+
try:
|
26 |
+
nltk.download('punkt', quiet=True)
|
27 |
+
nltk.download('words', quiet=True)
|
28 |
+
nltk.download('stopwords', quiet=True)
|
29 |
+
except Exception as e:
|
30 |
+
print(f"β οΈ NLTK download warning: {e}")
|
31 |
|
32 |
load_dotenv()
|
33 |
API_TRANSCRIBE = os.getenv("API_TRANSCRIBE")
|
|
|
37 |
NOTIFICATION_SOUND_PATH = "Berhenti.mp3" # Sound ketika recording selesai
|
38 |
START_RECORDING_SOUND_PATH = "Dimulai.mp3" # Sound ketika mulai recording
|
39 |
|
40 |
+
try:
|
41 |
+
english_words = set(words.words())
|
42 |
+
indonesian_stopwords = set(stopwords.words('indonesian'))
|
43 |
+
except Exception as e:
|
44 |
+
print(f"β οΈ NLTK data warning: {e}")
|
45 |
+
english_words = set()
|
46 |
+
indonesian_stopwords = set()
|
47 |
|
48 |
def load_indonesian_wordlist(filepath='wordlist.lst'):
|
49 |
try:
|
|
|
62 |
valid_words = english_words.union(indonesian_words)
|
63 |
|
64 |
def contains_medical_terms_auto_threshold(text, medical_words):
|
65 |
+
try:
|
66 |
+
tokens = word_tokenize(text.lower())
|
67 |
+
tokens = [w.strip(string.punctuation) for w in tokens if w.isalpha()]
|
68 |
+
if not tokens:
|
69 |
+
return False
|
70 |
+
medical_count = sum(1 for w in tokens if w in medical_words)
|
71 |
+
ratio = medical_count / len(tokens)
|
72 |
+
threshold = 0.4 if len(tokens) <= 5 else 0.1
|
73 |
+
return ratio >= threshold
|
74 |
+
except Exception as e:
|
75 |
+
print(f"β οΈ Medical terms detection warning: {e}")
|
76 |
+
return len(text.strip()) > 0 # Fallback: accept non-empty text
|
77 |
|
78 |
medical_words = load_indonesian_wordlist('wordlist.lst')
|
79 |
|
|
|
91 |
|
92 |
def play_notification_sound():
|
93 |
"""Function untuk memainkan sound notification ketika recording selesai"""
|
94 |
+
if not AUDIO_AVAILABLE:
|
95 |
+
print("π Audio system not available - notification sound skipped")
|
96 |
+
return
|
97 |
+
|
98 |
try:
|
99 |
if os.path.exists(NOTIFICATION_SOUND_PATH):
|
100 |
pygame.mixer.music.load(NOTIFICATION_SOUND_PATH)
|
|
|
107 |
|
108 |
def play_start_recording_sound():
|
109 |
"""Function untuk memainkan sound ketika mulai recording"""
|
110 |
+
if not AUDIO_AVAILABLE:
|
111 |
+
print("π Audio system not available - start recording sound skipped")
|
112 |
+
return
|
113 |
+
|
114 |
try:
|
115 |
if os.path.exists(START_RECORDING_SOUND_PATH):
|
116 |
# Menggunakan Sound effect untuk play bersamaan tanpa interrupt music
|
|
|
559 |
) as app:
|
560 |
|
561 |
# Header
|
562 |
+
audio_status = "π With Sound Notifications" if AUDIO_AVAILABLE else "π Silent Mode"
|
563 |
+
gr.HTML(f"""
|
564 |
<div class="main-header">
|
565 |
<h1>ποΈ Realtime Recording</h1>
|
566 |
+
<p>High Quality Audio Recording {audio_status}</p>
|
567 |
</div>
|
568 |
""")
|
569 |
|
|
|
695 |
)
|
696 |
|
697 |
# Footer
|
698 |
+
footer_text = "Built with Gradio π"
|
699 |
+
if not AUDIO_AVAILABLE:
|
700 |
+
footer_text += " β’ Running in Silent Mode (No Audio Hardware Detected)"
|
701 |
+
|
702 |
+
gr.HTML(f"""
|
703 |
<div style="text-align: center; padding: 2rem; color: rgba(255,255,255,0.7);">
|
704 |
+
<p>Use via API π₯ β’ {footer_text}</p>
|
705 |
</div>
|
706 |
""")
|
707 |
|
|
|
789 |
print("5. Set up your .env file with API_TRANSCRIBE and API_TEXT")
|
790 |
print()
|
791 |
|
792 |
+
# Audio system status
|
793 |
+
if AUDIO_AVAILABLE:
|
794 |
+
print("β
Audio system: ENABLED")
|
795 |
+
# Cek apakah file sound ada
|
796 |
+
sounds_status = []
|
797 |
+
if os.path.exists(START_RECORDING_SOUND_PATH):
|
798 |
+
print(f"β
Start recording sound found: {START_RECORDING_SOUND_PATH}")
|
799 |
+
sounds_status.append("start")
|
800 |
+
else:
|
801 |
+
print(f"β οΈ Start recording sound not found: {START_RECORDING_SOUND_PATH}")
|
802 |
+
|
803 |
+
if os.path.exists(NOTIFICATION_SOUND_PATH):
|
804 |
+
print(f"β
Completion sound found: {NOTIFICATION_SOUND_PATH}")
|
805 |
+
sounds_status.append("completion")
|
806 |
+
else:
|
807 |
+
print(f"β οΈ Completion sound not found: {NOTIFICATION_SOUND_PATH}")
|
808 |
+
|
809 |
+
if not sounds_status:
|
810 |
+
print("π Note: Add sound files to enable audio notifications for realtime recording")
|
811 |
+
elif len(sounds_status) == 1:
|
812 |
+
print("π Note: Add the missing sound file for complete audio experience")
|
813 |
else:
|
814 |
+
print("π Audio system: DISABLED (No audio hardware detected)")
|
815 |
+
print("π Note: Running in silent mode - sound notifications are disabled")
|
|
|
|
|
|
|
|
|
816 |
|
817 |
print("\nπ Application will start at: http://localhost:7860")
|
818 |
print("ποΈ Make sure to allow microphone access when using Realtime Recording!")
|
819 |
print("β¨ New Modern UI with enhanced visual experience!")
|
820 |
+
print()
|
|
|
|