【问题标题】:Movie py : importing audio from text-to-speech in memory电影py:从内存中的文本到语音导入音频
【发布时间】:2021-05-08 01:58:49
【问题描述】:

我正在尝试结合使用来自 Azure 的文本到语音转换和 movie.py 来为视频创建音频流。

result = synthesizer.speak_ssml_async(xml_string).get()
stream = AudioDataStream(result)

这个过程的输出是:

<azure.cognitiveservices.speech.AudioDataStream at 0x2320cb87ac0>

但是,movie.py 无法使用以下命令导入它:

audioClip = AudioFileClip(stream)

这给了我错误:

AudioDataStream' 对象没有属性 'endswith'

是否需要将 Azure Stream 转换为 .wav?我怎么做?我需要完成整个过程,而不需要在本地写入 .wav 文件(例如 stream.save_to_wav_file),而只使用内存流。

请问有人能找到灯吗?

【问题讨论】:

  • 基于AudioFileClip的源代码:zulko.github.io/moviepy/_modules/moviepy/audio/io/…,必须指定文件名,它不提供从流中初始化的方法。您可以将流写入 .wav 文件并在本地使用后将其删除。
  • @StanleyGong 我发现有一种方法可以使用“from moviepy.audio.AudioClip import AudioArrayClip”并使用 AudioArrayClip instad of AudioFileClip,但它似乎不喜欢我的音频流。它告诉我“'numpy.uint8' 对象不可迭代”。我无法在本地保存 .wav 文件,因为这是使用 azure 函数运行的,没有存储空间,只有内存
  • 其实Azure函数有自己的文件系统,可以保存临时文件。我认为这篇文章可能会有所帮助:stackoverflow.com/questions/63265669/…
  • @StanleyGong 感谢您的意见。我在我的 azurefunction 中使用 dir_path = tempfile.gettempdir() 来获取临时文件位置。但是,当我尝试执行 stream.save_to_wav_file(dir_path+ "temp.wav") 时,天蓝色函数失败

标签: azure memory text-to-speech moviepy


【解决方案1】:

我给你写了一个HTTP触发Python函数,试试下面的代码:

import azure.functions as func
import azure.cognitiveservices.speech as speechsdk
import tempfile
import imageio
imageio.plugins.ffmpeg.download()
from moviepy.editor import AudioFileClip



speech_key="<speech service key>"
service_region="<speech service region>"
temp_file_path = tempfile.gettempdir() + "/result.wav"
text = 'hello, this is a test'

def main(req: func.HttpRequest) -> func.HttpResponse:
    speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)

    auto_detect_source_language_config = speechsdk.languageconfig.AutoDetectSourceLanguageConfig()

    speech_synthesizer = speechsdk.SpeechSynthesizer(
        speech_config=speech_config, auto_detect_source_language_config=auto_detect_source_language_config,audio_config=None)

    result = speech_synthesizer.speak_text_async(text).get();
    if result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted:
            stream = speechsdk.AudioDataStream(result)
            stream.save_to_wav_file(temp_file_path)
    
    myclip = AudioFileClip(temp_file_path)

    return func.HttpResponse(str(myclip.duration))

逻辑很简单,从语音服务获取语音流并保存到临时文件并使用AudioDataStream 获取其持续时间。

结果:

如果您仍然遇到一些错误,您可以在此处获取错误详细信息:

如果您还有其他问题,请告诉我。

【讨论】:

  • 感谢您的投入,我设法使用 azure 函数文件系统来解决问题。我遇到了我在回复中提到的问题。 Python 错误代码 137,我想知道是不是因为我的 azure 函数被某些进程杀死了,它发生在视频渲染的最后。
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
相关资源
最近更新 更多