Как заставить веб-приложение автоматически загружать mp3-файл [Flask в Google App Engine] - PullRequest
0 голосов
/ 21 января 2020

Я новичок в кодировании. Я хотел бы создать простое веб-приложение, использующее Google Cloud Text to Speech API.

  1. веб-сайт с текстовым полем
  2. , введите предложение в текстовое поле и щелкните с помощью кнопки «отправить»
  3. вы можете загрузить mp3-файл, созданный Google Cloud Text, в Speech API

Я учитель английского языка Engli sh, поэтому я бы хотел Я хотел бы, чтобы мои студенты использовали этот веб-сайт для улучшения своего произношения на английском языке sh.

Во-первых, я хотел бы показать вам свой код. Я использую Flask в стандартной среде Google App Engine Python3 .7.

Это структура каталогов.

.
├── app.yaml
├── credentials.json
├── main.py
├── requirements.txt
└── templates
    └── hello_form.html

Это main.py.

from flask import Flask
from flask import render_template
from flask import request
from flask import send_file

app = Flask(__name__)

@app.route("/", methods=['POST', 'GET'])
def index():
    if request.method == "POST":
        text = request.form['text']

        import os
        os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="credentials.json"

        from google.cloud import texttospeech
        client = texttospeech.TextToSpeechClient()
        input_text = texttospeech.types.SynthesisInput(text=text)
        voice = texttospeech.types.VoiceSelectionParams(
            language_code='en-US',
            name='en-US-Standard-C',
            ssml_gender=texttospeech.enums.SsmlVoiceGender.FEMALE)

        audio_config = texttospeech.types.AudioConfig(
            audio_encoding=texttospeech.enums.AudioEncoding.MP3)

        response = client.synthesize_speech(input_text, voice, audio_config)

        # The response's audio_content is binary.
        with open('/tmp/output.mp3', 'wb') as out:
            out.write(response.audio_content)

        return send_file("/tmp/output.mp3")
    else:
        return render_template("hello_form.html")

if __name__ == "__main__":
    app.run()

Это hello_form. html

<html>
    <head>
        <title>Sample Web Form</title>
    </head>
<body>
<h1>Fill Out This Form</h1>
<form action="/" method="POST">

    text: <input type="text" name="text">
    <br/>
    <input type="submit">
</form>
</body>
</html>

Это needs.txt.

Flask==1.1.1
future==0.18.2
google-cloud-texttospeech==0.5.0
grpcio==1.26.0
gunicorn

Это app.yaml.

runtime: python37
entrypoint: gunicorn -b :$PORT main:app

Когда я развернуло это приложение на Google App Engine, оно работало довольно хорошо. Тем не менее, я не мог скачать mp3 файл напрямую. Я покажу вам, что я имею в виду.

Шаг 1: Если я введу URL-адрес моего приложения в браузере (Google Chrome на Windows10), я вижу эту простую форму. form Шаг 2: Я ввожу текст и пу sh «отправить». submit

Шаг 3: Сервер отправляет mp3-файл клиенту, но загрузка не начинается. download1

Шаг 4: щелкните правой кнопкой мыши в браузере и выберите команду «Сохранить как». save_as

Шаг 5: Менеджер загрузок начинает работать и дает имя mp3-файлу. download2

Шаг 6: Загрузите mp3-файл в локальную папку загрузки. download3

Мне не нужны шаги 3 и 4. Когда я пу sh "отправляю", я хочу, чтобы браузер автоматически запускал менеджер загрузок.

Не могли бы вы дать мне какую-либо информацию или предложение?

Заранее спасибо.

С уважением, Казу


Благодаря Кэмерон Робертс я преодолел свои трудности.

Передача as_attachment = True в send_file решила проблему.

Однако теперь я столкнулся с другой проблемой. Это решение отлично работало, когда я обращался к своему веб-приложению из P C (Google Chrome). Но когда я получил доступ к своему веб-приложению из iPhone (Google Chrome), загрузка не началась. Для меня это большая проблема, потому что на iPhone я не могу щелкнуть правой кнопкой мыши и выполнить операцию «Сохранить как».

Это скриншот.

enter image description here

Не могли бы вы дать мне какую-либо информацию или предложение?

Заранее спасибо.

С уважением, Казу

1 Ответ

2 голосов
/ 21 января 2020

Вы должны установить «content-disposition» файла в «attachment». С flask вы можете достичь этого, передав «as_attachment = True» для отправки файла.

return send_file("/tmp/output.mp3",as_attachment=True)

Документация flask гласит:

as_attachment - установлено в True если вы хотите отправить этот файл с заголовком вложения Content-Disposition:

https://flask.palletsprojects.com/en/1.1.x/api/#flask .send_file

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...