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)
posted on 2025-04-18 22:36  leapss  阅读(8)  评论(0)    收藏  举报