pradeep4321 commited on
Commit
f4be530
·
verified ·
1 Parent(s): cdc2464

Update src/app.py

Browse files
Files changed (1) hide show
  1. src/app.py +23 -23
src/app.py CHANGED
@@ -1,21 +1,15 @@
1
- import os
2
- os.environ["STREAMLIT_CONFIG_DIR"] = "/tmp/.streamlit"
3
- os.makedirs("/tmp/.streamlit", exist_ok=True)
4
-
5
- import tempfile
6
- from gtts import gTTS
7
  from docx import Document
8
  from PyPDF2 import PdfReader
9
- import streamlit as st
10
- import base64
11
  from io import BytesIO
 
 
 
12
 
13
- def text_to_speech(text):
14
- tts = gTTS(text)
15
- audio_buffer = BytesIO()
16
- tts.write_to_fp(audio_buffer)
17
- audio_buffer.seek(0)
18
- return audio_buffer
19
 
20
  def convert_docx_to_text(docx_file):
21
  doc = Document(docx_file)
@@ -25,19 +19,26 @@ def convert_pdf_to_text(pdf_file):
25
  reader = PdfReader(pdf_file)
26
  return "\n".join([page.extract_text() or '' for page in reader.pages])
27
 
28
- def get_download_link(audio_data, filename="output.mp3"):
29
- b64 = base64.b64encode(audio_data).decode()
30
- href = f'<a href="data:audio/mp3;base64,{b64}" download="{filename}">Download {filename}</a>'
 
 
 
 
 
 
 
 
31
  return href
32
 
33
  def main():
34
- st.title("Text to Speech Converter (No File Write)")
35
 
36
  uploaded_file = st.file_uploader("Upload a text, docx, or pdf file", type=["txt", "docx", "pdf"])
37
 
38
  if uploaded_file:
39
  ext = uploaded_file.name.split('.')[-1].lower()
40
- text = ""
41
 
42
  if ext == 'txt':
43
  text = uploaded_file.read().decode("utf-8")
@@ -53,12 +54,11 @@ def main():
53
  st.warning("No readable text found.")
54
  return
55
 
56
- with st.spinner("Converting to speech..."):
57
  audio_buffer = text_to_speech(text)
58
- audio_bytes = audio_buffer.read()
59
 
60
- st.audio(audio_bytes, format="audio/mp3")
61
- st.markdown(get_download_link(audio_bytes), unsafe_allow_html=True)
62
 
63
  if __name__ == "__main__":
64
  main()
 
1
+ import streamlit as st
 
 
 
 
 
2
  from docx import Document
3
  from PyPDF2 import PdfReader
 
 
4
  from io import BytesIO
5
+ from TTS.api import TTS
6
+ from scipy.io.wavfile import write
7
+ import numpy as np
8
 
9
+ # Load offline TTS model once
10
+ @st.cache_resource
11
+ def load_tts_model():
12
+ return TTS(model_name="tts_models/en/ljspeech/tacotron2-DDC", progress_bar=False, gpu=False)
 
 
13
 
14
  def convert_docx_to_text(docx_file):
15
  doc = Document(docx_file)
 
19
  reader = PdfReader(pdf_file)
20
  return "\n".join([page.extract_text() or '' for page in reader.pages])
21
 
22
+ def text_to_speech(text):
23
+ tts = load_tts_model()
24
+ wav = tts.tts(text)
25
+ buffer = BytesIO()
26
+ write(buffer, 22050, np.array(wav)) # Save as WAV
27
+ buffer.seek(0)
28
+ return buffer
29
+
30
+ def get_download_link(audio_data, filename="output.wav"):
31
+ b64 = st.base64.b64encode(audio_data.getvalue()).decode()
32
+ href = f'<a href="data:audio/wav;base64,{b64}" download="{filename}">Download {filename}</a>'
33
  return href
34
 
35
  def main():
36
+ st.title("Text to Speech Converter (Offline - Hugging Face Safe)")
37
 
38
  uploaded_file = st.file_uploader("Upload a text, docx, or pdf file", type=["txt", "docx", "pdf"])
39
 
40
  if uploaded_file:
41
  ext = uploaded_file.name.split('.')[-1].lower()
 
42
 
43
  if ext == 'txt':
44
  text = uploaded_file.read().decode("utf-8")
 
54
  st.warning("No readable text found.")
55
  return
56
 
57
+ with st.spinner("Generating speech..."):
58
  audio_buffer = text_to_speech(text)
 
59
 
60
+ st.audio(audio_buffer, format="audio/wav")
61
+ st.markdown(get_download_link(audio_buffer), unsafe_allow_html=True)
62
 
63
  if __name__ == "__main__":
64
  main()