gpt4 book ai didi

python - 在Python中给定NumPy数组的情况下,如何流式传输MP3 block ?

转载 作者:行者123 更新时间:2023-12-03 01:20:20 29 4
gpt4 key购买 nike

我正在努力寻找一种解决方案,用于从Python服务器流式传输合成音频。合成的音频将增量生成,并作为np.float32 NumPy数组返回。然后需要将其从NumPy数组转换为MP3块。最后,MP3块通过flask提供服务。

这是一些伪代码:

import numpy

from flask import Flask
from flask import Response

app = Flask(__name__)
sample_rate = 24000


def pcm_to_mp3():
raise NotImplementedError()


def get_synthetic_audio():
""" Mock function for synthetic audio. """
while True:
yield numpy.random.rand(1024) * 2 - 1 # Return: 32-bit Floating Point PCM


@app.route('/stream', methods=['GET'])
def get_stream():
""" Stream synthetic audio. """

def response():
for numpy_array in get_synthetic_audio():
# NOTE: The raw audio needs additional metadata to be playable like sample rate.
yield pcm_to_mp3(numpy_array, sample_rate=sample_rate)

return Response(
response(),
headers={
# NOTE: Ensure stream is not cached.
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0',
# NOTE: Enable streaming.
'Transfer-Encoding': 'chunked'
},
mimetype='audio/mpeg')


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

虽然类似的设置适用于WAV文件,但我无法弄清楚如何对MP3文件执行类似的操作。

谢谢!

来源
  • 通过PyDub将NumPy数组转换为MP3文件:How to read a MP3 audio file into a numpy array / save a numpy array to MP3?
  • 带有 flask 的
  • 流音频WAV文件:HTTP realtime audio streaming server
  • 使用PyAudio流音频WAV文件:Python: realtime audio streaming with PyAudio (or something else)?
  • 带有FFMpeg和Flask的
  • 流:https://gist.github.com/anthonyeden/f3b3bdf6f62badd8f87bb574283f488a
  • 最佳答案

    我能够找出一种可行的方法:

    import select
    import subprocess

    import numpy

    from flask import Flask
    from flask import Response

    app = Flask(__name__)


    def get_synthetic_audio(num_samples):
    audio = numpy.random.rand(num_samples).astype(numpy.float32) * 2 - 1
    assert audio.max() <= 1.0
    assert audio.min() >= -1.0
    assert audio.dtype == numpy.float32
    return audio


    def response():
    pipe = subprocess.Popen(
    'ffmpeg -f f32le -acodec pcm_f32le -ar 24000 -ac 1 -i pipe: -f mp3 pipe:'
    .split(),
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)
    poll = select.poll()
    poll.register(pipe.stdout, select.POLLIN)
    while True:
    pipe.stdin.write(get_synthetic_audio(24000).tobytes())
    while poll.poll(0):
    yield pipe.stdout.readline()


    @app.route('/stream.mp3', methods=['GET'])
    def stream():
    return Response(
    response(),
    headers={
    # NOTE: Ensure stream is not cached.
    'Cache-Control': 'no-cache, no-store, must-revalidate',
    'Pragma': 'no-cache',
    'Expires': '0',
    },
    mimetype='audio/mpeg')


    if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8000, debug=True)

    在探索过程中,我了解到 flask不支持分块传输编码。这是令人惊讶的,因为分块传输编码是1997年作为HTTP 1.1的一部分引入的。

    无论如何,令我惊讶的是, ffmpeg的流与 flask兼容,并且Safari,Firefox和Chrome支持该流。

    关于python - 在Python中给定NumPy数组的情况下,如何流式传输MP3 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61351764/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com