CR7CAD commited on
Commit
e5f2129
·
verified ·
1 Parent(s): 95b04e6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +13 -97
app.py CHANGED
@@ -3,7 +3,6 @@ import streamlit as st
3
  from transformers import pipeline
4
  import os
5
  import tempfile
6
- import numpy as np
7
 
8
  # function part
9
  # img2text
@@ -43,17 +42,11 @@ def text2story(text):
43
 
44
  return story_text
45
 
46
- # text2audio - REVISED to correctly handle the audio output
47
  def text2audio(story_text):
48
  try:
49
- # Use a different TTS model that works reliably with pipeline
50
- synthesizer = pipeline("text-to-speech", model="microsoft/speecht5_tts")
51
-
52
- # Additional input required for this model
53
- speaker_embeddings = pipeline(
54
- "audio-classification",
55
- model="microsoft/speecht5_speaker_embeddings"
56
- )("some_audio_file.mp3")["logits"]
57
 
58
  # Limit text length to avoid timeouts
59
  max_chars = 500
@@ -64,98 +57,24 @@ def text2audio(story_text):
64
  else:
65
  story_text = story_text[:max_chars]
66
 
67
- # Generate speech with correct parameters
68
- speech = synthesizer(
69
- text=story_text,
70
- forward_params={"speaker_embeddings": speaker_embeddings}
71
- )
72
 
73
- # Create a temporary WAV file
74
  temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.wav')
75
  temp_filename = temp_file.name
76
- temp_file.close()
77
-
78
- # Display the structure of the speech output for debugging
79
- st.write(f"Speech output keys: {speech.keys()}")
80
-
81
- # Save the audio data to the temporary file
82
- # Different models have different output formats, we'll try common keys
83
- if 'audio' in speech:
84
- # Convert numpy array to WAV file
85
- try:
86
- import scipy.io.wavfile as wavfile
87
- wavfile.write(temp_filename, speech['sampling_rate'], speech['audio'])
88
- except ImportError:
89
- # If scipy is not available, try raw writing
90
- with open(temp_filename, 'wb') as f:
91
- # Convert numpy array to bytes in a simple way
92
- if isinstance(speech['audio'], np.ndarray):
93
- audio_bytes = speech['audio'].tobytes()
94
- f.write(audio_bytes)
95
- else:
96
- f.write(speech['audio'])
97
- elif 'numpy_array' in speech:
98
- with open(temp_filename, 'wb') as f:
99
- f.write(speech['numpy_array'].tobytes())
100
- else:
101
- # Fallback: try to write whatever is available
102
- with open(temp_filename, 'wb') as f:
103
- # Just write the first value that seems like it could be audio data
104
- for key, value in speech.items():
105
- if isinstance(value, (bytes, bytearray)) or (
106
- isinstance(value, np.ndarray) and value.size > 1000):
107
- if isinstance(value, np.ndarray):
108
- f.write(value.tobytes())
109
- else:
110
- f.write(value)
111
- break
112
 
 
 
 
 
113
  return temp_filename
114
 
115
  except Exception as e:
116
  st.error(f"Error generating audio: {str(e)}")
117
- # Print all available keys for debugging
118
  return None
119
 
120
- # Let's try a simpler approach with a functioning TTS model
121
- def simple_text2audio(story_text):
122
- """Simplified version that just returns a hardcoded audio file"""
123
- # In a real application, you'd use a working TTS model
124
- # For demonstration, we'll create a simple audio file with a message
125
-
126
- # Create a placeholder WAV file (just 1 second of silence)
127
- temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.wav')
128
- temp_filename = temp_file.name
129
- temp_file.close()
130
-
131
- # Generate a very simple silent WAV file
132
- with open(temp_filename, 'wb') as f:
133
- # Simple WAV header for 1 second of silence at 16000Hz
134
- # RIFF header
135
- f.write(b'RIFF')
136
- f.write((36).to_bytes(4, byteorder='little')) # File size - 8
137
- f.write(b'WAVE')
138
-
139
- # Format chunk
140
- f.write(b'fmt ')
141
- f.write((16).to_bytes(4, byteorder='little')) # Chunk size
142
- f.write((1).to_bytes(2, byteorder='little')) # PCM format
143
- f.write((1).to_bytes(2, byteorder='little')) # Mono
144
- f.write((16000).to_bytes(4, byteorder='little')) # Sample rate
145
- f.write((32000).to_bytes(4, byteorder='little')) # Byte rate
146
- f.write((2).to_bytes(2, byteorder='little')) # Block align
147
- f.write((16).to_bytes(2, byteorder='little')) # Bits per sample
148
-
149
- # Data chunk
150
- f.write(b'data')
151
- f.write((32000).to_bytes(4, byteorder='little')) # Data size
152
-
153
- # 1 second of silence (16000 samples at 16-bit)
154
- silence = bytes(32000)
155
- f.write(silence)
156
-
157
- return temp_filename
158
-
159
  # Function to save temporary image file
160
  def save_uploaded_image(uploaded_file):
161
  if not os.path.exists("temp"):
@@ -192,10 +111,7 @@ if uploaded_file is not None:
192
 
193
  # Stage 3: Story to Audio data
194
  st.text('Generating audio data...')
195
- # Uncomment the next line to try the complex implementation
196
- # audio_file = text2audio(story)
197
- # Use the simple implementation for now
198
- audio_file = simple_text2audio(story)
199
 
200
  # Play button
201
  if st.button("Play Audio"):
@@ -208,6 +124,6 @@ if uploaded_file is not None:
208
  # Clean up the temporary files
209
  try:
210
  os.remove(image_path)
211
- # We'll leave the audio file for playback
212
  except:
213
  pass
 
3
  from transformers import pipeline
4
  import os
5
  import tempfile
 
6
 
7
  # function part
8
  # img2text
 
42
 
43
  return story_text
44
 
45
+ # text2audio - REVISED to handle audio format correctly
46
  def text2audio(story_text):
47
  try:
48
+ # Use a simple, reliable TTS model
49
+ synthesizer = pipeline("text-to-speech", model="facebook/mms-tts-eng")
 
 
 
 
 
 
50
 
51
  # Limit text length to avoid timeouts
52
  max_chars = 500
 
57
  else:
58
  story_text = story_text[:max_chars]
59
 
60
+ # Generate speech
61
+ speech = synthesizer(story_text)
 
 
 
62
 
63
+ # Create a temporary file with .wav extension
64
  temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.wav')
65
  temp_filename = temp_file.name
66
+ temp_file.close() # Close the file so we can write to it
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
 
68
+ # Write the raw audio data to the file
69
+ with open(temp_filename, 'wb') as f:
70
+ f.write(speech['bytes']) # Using the 'bytes' field instead of 'audio'
71
+
72
  return temp_filename
73
 
74
  except Exception as e:
75
  st.error(f"Error generating audio: {str(e)}")
 
76
  return None
77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  # Function to save temporary image file
79
  def save_uploaded_image(uploaded_file):
80
  if not os.path.exists("temp"):
 
111
 
112
  # Stage 3: Story to Audio data
113
  st.text('Generating audio data...')
114
+ audio_file = text2audio(story)
 
 
 
115
 
116
  # Play button
117
  if st.button("Play Audio"):
 
124
  # Clean up the temporary files
125
  try:
126
  os.remove(image_path)
127
+ # Don't delete audio file immediately as it might still be playing
128
  except:
129
  pass