Hok*_*ama 6 python flask gunicorn flask-socketio
我有一个可以将音频文件转换为文本的应用程序。使用烧瓶和烧瓶插座。当我使用“python run.py”运行它时,它工作得很好,但是当我使用“gunicorn -k eventlet -b 0.0.0.0:5000 run:app”运行它时,它将停止在调用 google 的部分audio.py 文件中的语音转文本 api。
这些是现在的当前代码。
运行.py:
from ats import socketio, app, db
if __name__ == '__main__':
db.create_all()
socketio.run(app, host='0.0.0.0', port=5001, debug=True)
Run Code Online (Sandbox Code Playgroud)
初始化.py
import logging, json
from flask import Flask, jsonify, render_template, request
from flask_socketio import SocketIO, emit, send
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmall
app = Flask(__name__, instance_relative_config=True, static_folder="templates/static", template_folder="templates")
# Create db instance
db = SQLAlchemy(app)
ma = Marshmallow(app)
@app.route('/')
def index():
return render_template('index.html');
# import models
from ats import models
# set up CORS
CORS(app)
socketio = SocketIO(app, cors_allowed_origins='*', async_mode='eventlet')
# import blueprints
from ats.product.product import product_blueprint
# register blueprints
app.register_blueprint(product_blueprint, url_prefix='/api/product')
from ats import error_handlers
Run Code Online (Sandbox Code Playgroud)
产品.py
import os
import math
import eventlet
from os.path import join
from flask import Blueprint, request, jsonify, abort
from ats.utils import audio as AUDIO
product_blueprint = Blueprint('product', __name__)
@product_blueprint.route('/add', methods=['post'])
def addProduct():
try:
data = request.form
foldername = data['name']
scriptFile = request.files['script']
audioFile = request.files['audio']
# save the script and audio file to uploads folder
FILE.createFolder(foldername)
FILE.save(foldername, scriptFile)
FILE.save(foldername, audioFile)
# list the files in the uploads
audioFiles = FILE.getAudioFileList(foldername)
fileCount = len(audioFiles)
currentFile = 1
# ============ speech to text =============
for file in audioFiles:
recognizedText = AUDIO.convert(foldername, file)
# save to database
newAudio = {
'name': file,
'recognizedText': recognizedText,
'length': duration,
}
Audio.add(newAudio)
# emit event to update the client about the progress
percent = math.floor((currentFile / float(fileCount) ) * 100)
emit('upload_progress', {'data': percent}, room=data['sid'], namespace='/')
eventlet.sleep()
currentFile += 1
# Delete the files in uploads folder
FILE.delete(foldername)
return jsonify({'data': None, 'message': 'Product was added.', 'success': True}), 200
except Exception as e:
abort(500, str(e))
Run Code Online (Sandbox Code Playgroud)
音频.py
import os
from ats import app
# Imports the Google Cloud client library
from google.cloud import speech
from google.cloud.speech import enums
from google.cloud.speech import types
# Instantiates a client
client = speech.SpeechClient()
def convert(foldername, filename):
try:
file = os.path.join(app.config['UPLOAD_FOLDER'], foldername, filename)
# Loads the audio into memory
with io.open(file, 'rb') as audio_file:
content = audio_file.read()
audio = types.RecognitionAudio(content=content)
config = types.RecognitionConfig(
encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
sample_rate_hertz=48000,
language_code='ja-JP')
# Call speech in the audio file
response = client.recognize(config, audio) # The code will stop here, that results to worker timeout in gunicorn
return response
except Exception as e:
raise e
Run Code Online (Sandbox Code Playgroud)
我已经寻找解决方案近一周了,但仍然找不到。谢谢你们的帮助。
小智 7
当您直接使用python run.py没有应用超时的应用程序运行应用程序时,应用程序会花费任何需要的时间来处理,但是当您使用 Gunicorn 运行应用程序时,默认超时为 30 秒,这意味着如果您的应用程序执行此操作,您将收到超时错误30 秒内未回复。为了避免这种情况,您可以通过添加来增加 Gunicorn 设置的默认超时--timeout <timeinterval-in-seconds>
以下命令将超时设置为 10 分钟
gunicorn -k eventlet -b 0.0.0.0:5000 --timeout 600 run:app
| 归档时间: |
|
| 查看次数: |
11790 次 |
| 最近记录: |