I have a Python Flask app with the method shown below. In the method I'm synthesizing voice from text using Azure text to speech.
@app.route("/retrieve_speech", methods=['POST'])
def retrieve_speech():
text= request.form.get('text')
start = time.time()
speech_key = "my key"
speech_region = "my region"
speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=speech_region)
speech_config.endpoint_id = "my endpoint"
speech_config.speech_synthesis_voice_name = "voice name"
speech_config.set_speech_synthesis_output_format(
speechsdk.SpeechSynthesisOutputFormat.Audio24Khz160KBitRateMonoMp3)
synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=None)
result = synthesizer.speak_text_async(text=text).get()
if result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted:
# Convert to wav
audio = AudioSegment.from_file(io.BytesIO(result.audio_data))
duration = audio.duration_seconds
data = io.BytesIO()
audio.export(data, format='wav')
data.seek(0)
# Convert binary data to base64 string
data = base64.b64encode(data.read()).decode('utf-8')
speech_timing = time.time() - start
elif result.reason == speechsdk.ResultReason.Canceled:
cancellation_details = result.cancellation_details
if cancellation_details.reason == speechsdk.CancellationReason.Error:
logging.error("Azure speech synthesis failed: {}".format(cancellation_details.error_details))
return jsonify(audio_data=data, speech_timing=str(speech_timing), other="other strings")
I'm using the Flask method in my frontend (webpage) using Javascript as follows:
$.post("/retrieve_speech", { text: "This is a test" }).done(function (data) {
var audio_data= data.audio_data;
var speech_timing = data.speech_timing;
var other = data.other;
// Decode base64 string to binary
var binaryData = atob(audioData);
// Create an array of 8-bit unsigned integers
var byteArray = new Uint8Array(binaryData.length);
for(var i = 0; i < binaryData.length; i++) {
byteArray[i] = binaryData.charCodeAt(i);
}
// Create a blob object from the byte array
var blob = new Blob([byteArray], {type: 'audio/wav'});
// Create a URL for the blob object
var url = URL.createObjectURL(blob);
// Play the audio
var audio = new Audio(url);
audio.play();
The problem now is that the audio is not playing. In addition in the Flask app I'm getting the following message: Numba: Attempted to fork from a non-main thread, the TBB library may be in an invalid state in the child process.
Synthesizing the speech works, so the problem must be the conversion to wav or to string in the Flask app and/or the decoding of the string in Javascript.
Is something wrong with my code?
Via Active questions tagged javascript - Stack Overflow https://ift.tt/FqXm5gC
Comments
Post a Comment