cadasme commited on
Commit
eb3cdc8
1 Parent(s): 6fab247

first commit

Browse files
Files changed (3) hide show
  1. .gitignore +165 -0
  2. app.py +111 -0
  3. requirements.txt +8 -0
.gitignore ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Custom
2
+ *.mp3
3
+ *.wav
4
+ temp/
5
+
6
+ # Byte-compiled / optimized / DLL files
7
+ __pycache__/
8
+ *.py[cod]
9
+ *$py.class
10
+
11
+ # C extensions
12
+ *.so
13
+
14
+ # Distribution / packaging
15
+ .Python
16
+ build/
17
+ develop-eggs/
18
+ dist/
19
+ downloads/
20
+ eggs/
21
+ .eggs/
22
+ lib/
23
+ lib64/
24
+ parts/
25
+ sdist/
26
+ var/
27
+ wheels/
28
+ share/python-wheels/
29
+ *.egg-info/
30
+ .installed.cfg
31
+ *.egg
32
+ MANIFEST
33
+
34
+ # PyInstaller
35
+ # Usually these files are written by a python script from a template
36
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
37
+ *.manifest
38
+ *.spec
39
+
40
+ # Installer logs
41
+ pip-log.txt
42
+ pip-delete-this-directory.txt
43
+
44
+ # Unit test / coverage reports
45
+ htmlcov/
46
+ .tox/
47
+ .nox/
48
+ .coverage
49
+ .coverage.*
50
+ .cache
51
+ nosetests.xml
52
+ coverage.xml
53
+ *.cover
54
+ *.py,cover
55
+ .hypothesis/
56
+ .pytest_cache/
57
+ cover/
58
+
59
+ # Translations
60
+ *.mo
61
+ *.pot
62
+
63
+ # Django stuff:
64
+ *.log
65
+ local_settings.py
66
+ db.sqlite3
67
+ db.sqlite3-journal
68
+
69
+ # Flask stuff:
70
+ instance/
71
+ .webassets-cache
72
+
73
+ # Scrapy stuff:
74
+ .scrapy
75
+
76
+ # Sphinx documentation
77
+ docs/_build/
78
+
79
+ # PyBuilder
80
+ .pybuilder/
81
+ target/
82
+
83
+ # Jupyter Notebook
84
+ .ipynb_checkpoints
85
+
86
+ # IPython
87
+ profile_default/
88
+ ipython_config.py
89
+
90
+ # pyenv
91
+ # For a library or package, you might want to ignore these files since the code is
92
+ # intended to run in multiple environments; otherwise, check them in:
93
+ # .python-version
94
+
95
+ # pipenv
96
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
97
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
98
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
99
+ # install all needed dependencies.
100
+ #Pipfile.lock
101
+
102
+ # poetry
103
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
104
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
105
+ # commonly ignored for libraries.
106
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
107
+ #poetry.lock
108
+
109
+ # pdm
110
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
111
+ #pdm.lock
112
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
113
+ # in version control.
114
+ # https://pdm.fming.dev/#use-with-ide
115
+ .pdm.toml
116
+
117
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
118
+ __pypackages__/
119
+
120
+ # Celery stuff
121
+ celerybeat-schedule
122
+ celerybeat.pid
123
+
124
+ # SageMath parsed files
125
+ *.sage.py
126
+
127
+ # Environments
128
+ .env
129
+ .venv
130
+ env/
131
+ venv/
132
+ ENV/
133
+ env.bak/
134
+ venv.bak/
135
+
136
+ # Spyder project settings
137
+ .spyderproject
138
+ .spyproject
139
+
140
+ # Rope project settings
141
+ .ropeproject
142
+
143
+ # mkdocs documentation
144
+ /site
145
+
146
+ # mypy
147
+ .mypy_cache/
148
+ .dmypy.json
149
+ dmypy.json
150
+
151
+ # Pyre type checker
152
+ .pyre/
153
+
154
+ # pytype static type analyzer
155
+ .pytype/
156
+
157
+ # Cython debug symbols
158
+ cython_debug/
159
+
160
+ # PyCharm
161
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
162
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
163
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
164
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
165
+ #.idea/
app.py ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Import the required libraries
2
+ import streamlit as st
3
+ import whisper
4
+ import speech_recognition as sr
5
+ from pydub import AudioSegment
6
+ import os
7
+ import sounddevice as sd
8
+ import numpy as np
9
+ from scipy.io.wavfile import write
10
+ import os
11
+
12
+
13
+ # Function to transcribe audio using OpenAI Whisper
14
+ def transcribe_whisper(model_name, file_path):
15
+ model = whisper.load_model(model_name)
16
+ result = model.transcribe(file_path)
17
+ return result["text"]
18
+
19
+ # Function to transcribe audio using Google Speech API
20
+ def transcribe_speech_recognition(file_path):
21
+ r = sr.Recognizer()
22
+ with sr.AudioFile(file_path) as source:
23
+ r.adjust_for_ambient_noise(source, duration=0.5) # Adjust ambient noise threshold
24
+ audio = r.record(source)
25
+
26
+ try:
27
+ result = r.recognize_google(audio, language='es')
28
+ return result
29
+ except sr.UnknownValueError:
30
+ return "No se pudo reconocer ningún texto en el audio."
31
+
32
+ # Function to convert mp3 file to wav
33
+ def convert_mp3_to_wav(mp3_path):
34
+ audio = AudioSegment.from_mp3(mp3_path)
35
+ wav_path = mp3_path.replace('.mp3', '.wav')
36
+ audio.export(wav_path, format="wav")
37
+ return wav_path
38
+
39
+ # Function to record audio
40
+ def record_audio(filename, duration):
41
+ fs = 44100 # Sample rate
42
+ channels = 2 # Number of channels (1 for mono, 2 for stereo)
43
+
44
+ # Start recording
45
+ recording = sd.rec(int(duration * fs), samplerate=fs, channels=channels)
46
+ sd.wait() # Wait until recording is finished
47
+ # Create temp directory if it doesn't exist
48
+ if not os.path.exists(os.path.dirname(filename)):
49
+ os.makedirs(os.path.dirname(filename))
50
+
51
+ # Save as WAV file
52
+ write(filename, fs, recording)
53
+
54
+ def main():
55
+ st.title('Transcriptor de Audio')
56
+
57
+ # Choose the transcription method and model
58
+ transcription_method = st.selectbox('Escoge el método de transcripción', ('OpenAI Whisper', 'Google Speech API'))
59
+ if transcription_method == 'OpenAI Whisper':
60
+ model_name = st.selectbox('Escoge el modelo de Whisper', ('base', 'small', 'medium', 'large', 'tiny'))
61
+
62
+ option = st.selectbox('Escoge la opción', ('Subir un archivo', 'Grabar audio en tiempo real'))
63
+
64
+ if option == 'Subir un archivo':
65
+ uploaded_file = st.file_uploader("Sube tu archivo de audio para transcribir", type=['wav', 'mp3'])
66
+
67
+ if uploaded_file is not None:
68
+ file_details = {"FileName": uploaded_file.name, "FileType": uploaded_file.type, "FileSize": uploaded_file.size}
69
+ st.write(file_details)
70
+
71
+ # Save uploaded file to temp directory
72
+ file_path = os.path.join("temp", uploaded_file.name)
73
+ with open(file_path, "wb") as f:
74
+ f.write(uploaded_file.getbuffer())
75
+
76
+ st.write("Archivo de audio cargado correctamente. Transcribiendo...")
77
+ with st.spinner('Transcribiendo...'):
78
+ if uploaded_file.name.endswith('.mp3') and transcription_method != 'OpenAI Whisper':
79
+ # Convert mp3 to wav if Google Speech API is selected and file is in mp3 format
80
+ file_path = convert_mp3_to_wav(file_path)
81
+
82
+ # Perform transcription
83
+ if transcription_method == 'OpenAI Whisper':
84
+ transcript = transcribe_whisper(model_name, file_path)
85
+ else:
86
+ transcript = transcribe_speech_recognition(file_path)
87
+
88
+ st.text_area('Resultado de la Transcripción:', transcript, height=200)
89
+
90
+ elif option == 'Grabar audio en tiempo real':
91
+ duration = st.slider("Selecciona la duración de la grabación (segundos)", 1, 10, 5)
92
+ start_recording = st.button('Empezar a grabar')
93
+
94
+ if start_recording:
95
+ filename = "temp/recorded_audio.wav"
96
+ st.write("Grabación en progreso...")
97
+ with st.spinner('Grabando...'):
98
+ record_audio(filename, duration)
99
+
100
+ st.write("Grabación finalizada. Transcribiendo...")
101
+ with st.spinner('Transcribiendo...'):
102
+ # Perform transcription
103
+ if transcription_method == 'OpenAI Whisper':
104
+ transcript = transcribe_whisper(model_name, filename)
105
+ else:
106
+ transcript = transcribe_speech_recognition(filename)
107
+
108
+ st.text_area('Resultado de la Transcripción:', transcript, height=200)
109
+
110
+ if __name__ == "__main__":
111
+ main()
requirements.txt ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ sounddevice
2
+ numpy
3
+ scipy
4
+ pydub
5
+ streamlit
6
+ python-dotenv
7
+ whisper-openai
8
+ SpeechRecognition