我正在try 使用生成器/yield 在Flask 中一个接一个地传输两个音频文件.然而,它只播放第一个文件,而不播放另一个文件.以下是我的代码:

from flask import Flask, send_file, Response
import random
import time
import wave

# Flask constructor takes the name of
# current module (__name__) as argument.
app = Flask(__name__)
 
# The route() function of the Flask class is a decorator,
# which tells the application which URL should call
# the associated function.
@app.route('/')
# ‘/’ URL is bound with paadas() function.
def paadas():
    Approach 2: not working
    def generate(files):
        for file in files:
            yield file.read()

    files = []
    number = random.randint(1,10)
    f1 = open("../numbers/" + str(number) + ".wav", 'rb')
    files.append(f1)
    times = random.randint(1,10)
    f2 = open("../times/" + str(times) + ".wav", 'rb')
    files.append(f2)
    return Response(generate(files), mimetype='audio/wav')

# main driver function
if __name__ == '__main__':
 
    # run() method of Flask class runs the application
    # on the local development server.
    app.run()

我错过了什么吗?你可以看到我在https://github.com/sameermahajan/PaadasMLFlaskApp米时try 了三种方法,只有第一种有效,但不是很优雅.如果你想试用这个程序,你可以从https://github.com/sameermahajan/Paadas得到预先录制的"Numbers"和"Times"的音频.这些都是背诵表格格式的马拉提语(一种印度语言)中的数字.

推荐答案

流传输时,无法正确解释第二个文件的标题,这可能会导致第二个文件无法播放.

我们可以使用wave模块从第二个文件中删除头文件,然后连接音频文件,请注意,如果文件没有相同的采样率、采样宽度和声道数量,它可能无法工作.

from flask import Flask, Response
import random
import wave
import io

app = Flask(__name__)

@app.route('/')
def paadas():
    def generate(files):
        with wave.open(files[0], 'rb') as f:
            params = f.getparams()
            frames = f.readframes(f.getnframes())
        
        for file in files[1:]:
            with wave.open(file, 'rb') as f:
                frames += f.readframes(f.getnframes())
        
        buffer = io.BytesIO()
        with wave.open(buffer, 'wb') as f:
            f.setparams(params)
            f.writeframes(frames)
        
        buffer.seek(0)
        return buffer.read()

    files = []
    number = random.randint(1,10)
    files.append("../numbers/" + str(number) + ".wav")
    times = random.randint(1,10)
    files.append("../times/" + str(times) + ".wav")
    
    return Response(generate(files), mimetype='audio/wav')

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

Python相关问答推荐

如何在Python中使用io.BytesIO写入现有缓冲区?

比较两个二元组列表,NP.isin

运行回文查找器代码时发生错误:[类型错误:builtin_index_or_system对象不可订阅]

'discord.ext. commanders.cog没有属性监听器'

rame中不兼容的d类型

_repr_html_实现自定义__getattr_时未显示

如何找到满足各组口罩条件的第一行?

如何在虚拟Python环境中运行Python程序?

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

OR—Tools中CP—SAT求解器的IntVar设置值

索引到 torch 张量,沿轴具有可变长度索引

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

Pandas:填充行并删除重复项,但保留不同的值

在电影中向西北方向对齐""

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

python的文件. truncate()意外地没有截断'

Regex用于匹配Python中逗号分隔的AWS区域

将数字数组添加到Pandas DataFrame的单元格依赖于初始化

随机森林n_估计器的计算

多索引数据帧到标准索引DF