from flask import Flask, request, jsonify, send_file
import os
import ffmpeg
from Text.teacher import teach
app = Flask(__name__)
AUDIO_FOLDER_PATH = "data/voice"
PPT_FOLDER_PATH = "data/ppt/"
@app.route('/files', methods=['GET'])
def list_files():
try:
# 获取文件夹中的所有文件并去掉文件扩展名
files = [os.path.splitext(f)[0] for f in os.listdir(AUDIO_FOLDER_PATH) if os.path.isfile(os.path.join(AUDIO_FOLDER_PATH, f))]
return jsonify({"files": files})
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/voiceList',methods=['GET'])
def list_voice():
try:
# 获取文件夹中的所有文件并去掉文件扩展名
voiceList = [os.path.splitext(f)[0] for f in os.listdir(AUDIO_FOLDER_PATH) if os.path.isfile(os.path.join(AUDIO_FOLDER_PATH, f))]
return jsonify({"voiceList": voiceList})
except Exception as e:
print(str(e))
return jsonify({"error": str(e)}), 500
@app.route('/getAudio', methods=['GET'])
def get_audio():
try:
file_name = request.args.get('fileName') # 从请求参数获取音频文件名
if not file_name:
return jsonify({"error": "缺少 fileName 参数"}), 400
# 构建完整的文件路径(假设文件扩展名为 mp3)
audio_file_path = os.path.join(AUDIO_FOLDER_PATH, f"{file_name}.mp3")
# 检查文件是否存在
if not os.path.exists(audio_file_path):
return jsonify({"error": "音频文件未找到"}), 404
# 发送音频文件
return send_file(audio_file_path, mimetype="audio/mpeg", as_attachment=False)
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/cutAudio', methods=['POST'])
def cut_audio():
try:
data = request.get_json()
file_name = data.get('fileName')
start_time = data.get('startTime')
end_time = data.get('endTime')
# 构建音频文件的完整路径
audio_file_path = os.path.join(AUDIO_FOLDER_PATH, file_name + ".mp3")
output_file_path = os.path.join(AUDIO_FOLDER_PATH, f"cut_{file_name}.mp3")
# 使用 FFmpeg 剪切音频
ffmpeg.input(audio_file_path, ss=start_time, t=end_time-start_time).output(output_file_path).run()
# 返回剪切后的音频文件URL
return jsonify({
'audioUrl': f"/audio/{file_name}_cut.mp3"
})
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/reUploadAudio', methods=['POST'])
defre_upload_audio():
try:
if 'audio' not in request.files:
return jsonify({"error": "未找到文件"}), 400
audio = request.files['audio']
# 检查文件是否有名称
if audio.filename == '':
return jsonify({"error": "文件名不能为空"}), 400
# 只允许特定格式的音频文件
allowed_extensions = {'mp3', 'wav'}
if audio.filename.split('.')[-1].lower() not in allowed_extensions:
return jsonify({"error": "不支持的文件格式"}), 400
fileName = request.form.get('fileName', audio.filename)
file_path = os.path.join(AUDIO_FOLDER_PATH, fileName)
audio.save(file_path)
return jsonify({
"message": "文件上传成功"
}), 200
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route("/addAudio", methods=["POST"])
def add_audio():
try:
audio_file = request.files['audioFile']
file_name = request.form['fileName']
# 检查文件是否有名称
wav_path = os.path.join(AUDIO_FOLDER_PATH, "temp/", file_name+'.wav')
mp3_path = os.path.join(AUDIO_FOLDER_PATH, file_name+'.mp3')
audio_file.save(wav_path)
try:
# 使用 FFmpeg 转换 WAV 为 MP3
ffmpeg.input(wav_path).output(mp3_path, format="mp3", audio_bitrate="192k").run(overwrite_output=True)
return jsonify({"message": "文件上传成功", "wav_path": wav_path, "mp3_path": mp3_path}), 200
except Exception as e:
return jsonify({"error": f"音频转换失败: {str(e)}"}), 500
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route("/generateAudioCourseware",methods=["POST"])
def generate_audio_courseware():
try:
# 检查是否有文件被上传
if 'ppt' not in request.files:
return jsonify({"error": "未接收到PPT文件"}), 400
ppt = request.files['ppt']
# 检查文件扩展名(确保是PPT文件)
allowed_extensions = {'ppt', 'pptx'}
if '.' in ppt.filename:
extension = ppt.filename.rsplit('.', 1)[1].lower()
if extension not in allowed_extensions:
return jsonify({"error": "仅支持PPT/PPTX格式文件"}), 400
save_path = os.path.join(PPT_FOLDER_PATH, ppt.filename)
ppt.save(save_path)
voice = request.form['voice']
print(voice)
"""
# 避免文件名冲突(可选)
counter = 1
while os.path.exists(save_path):
name, ext = os.path.splitext(filename)
save_path = os.path.join(PPT_FOLDER, f"{name}_{counter}{ext}")
counter += 1
file.save(save_path)
# 获取语音参数(如果有)
voice = request.form.get('voice', 'default')
# 这里可以添加PPT转音频的逻辑
"""
return jsonify({
"success": True,
"message": "PPT上传成功",
}), 200
except Exception as e:
return jsonify({"error": f"音频转换失败: {str(e)}"}), 500
""" @app.route("/translate",methods=["GET"])
def translate(): """
@app.route("/teach",methods=["GET"])
def gen_teach():
teach()
return jsonify({
"success": True,
}), 200
if __name__ == '__main__':
app.run(host='127.0.0.1', port=7860, debug=False)
浙公网安备 33010602011771号