当前位置: 首页 > 知识库问答 >
问题:

如何从谷歌云文本到语音API获取SSML时间戳

哈泰
2023-03-14

我想通过Google Cloud文本到语音API使用SSML标记来请求音频流中这些标记的计时。这些时间戳是必要的,以便为效果、单词/部分突出显示和用户反馈提供线索。

我发现这个问题是相关的,尽管这个问题指的是每个单词的时间戳,而不是SSML

下面的API请求返回OK,但显示缺少请求的标记数据。这是使用云文本语音API v1

{
 "voice": {
  "languageCode": "en-US"
 },
 "input": {
  "ssml": "<speak>First, <mark name=\"a\"/> second, <mark name=\"b\"/> third.</speak>"
 },
 "audioConfig": {
  "audioEncoding": "mp3"
 }
} 

答复:

{
 "audioContent":"//NExAAAAANIAAAAABcFAThYGJqMWA..."
}

它只提供合成音频,没有任何上下文信息。

我是否忽略了一个API请求,它可以公开关于这些标记的信息,比如IBM Watson和Amazon Polly的情况?


共有2个答案

柯波娃
2023-03-14

在撰写本文时,时间点数据可在Google cloud text-to-speech的v1beta1版本中找到。

除了默认访问权限,我不需要登录任何额外的开发人员程序就可以访问beta版。

在Python中导入(例如)源于:

from google.cloud import texttospeech as tts

至:

from google.cloud import texttospeech_v1beta1 as tts

又好又简单。

我需要修改发送合成请求的默认方式,以包含enable_time_pointing标志。

我发现这是通过在这里浏览机器可读的应用编程接口描述和阅读我已经下载的Python库代码来实现的。

谢天谢地,通用版本中的源代码还包括v1beta版本-谢谢谷歌!

我在下面放了一个可运行的示例。运行它需要与一般语音文字转换示例相同的认证和设置,您可以通过遵循官方留档获得。

以下是它对我的作用(为了可读性,稍微设置了一些格式):

$ python tools/try-marks.py
Marks content written to file: .../demo.json
Audio content written to file: .../demo.mp3

$ cat demo.json
[
  {"sec": 0.4300000071525574, "name": "here"},
  {"sec": 0.9234582781791687, "name": "there"}
]

这是样本:

import json
from pathlib import Path
from google.cloud import texttospeech_v1beta1 as tts


def go_ssml(basename: Path, ssml):
    client = tts.TextToSpeechClient()
    voice = tts.VoiceSelectionParams(
        language_code="en-AU",
        name="en-AU-Wavenet-B",
        ssml_gender=tts.SsmlVoiceGender.MALE,
    )

    response = client.synthesize_speech(
        request=tts.SynthesizeSpeechRequest(
            input=tts.SynthesisInput(ssml=ssml),
            voice=voice,
            audio_config=tts.AudioConfig(audio_encoding=tts.AudioEncoding.MP3),
            enable_time_pointing=[
                tts.SynthesizeSpeechRequest.TimepointType.SSML_MARK]
        )
    )

    # cheesy conversion of array of Timepoint proto.Message objects into plain-old data
    marks = [dict(sec=t.time_seconds, name=t.mark_name)
             for t in response.timepoints]

    name = basename.with_suffix('.json')
    with name.open('w') as out:
        json.dump(marks, out)
        print(f'Marks content written to file: {name}')

    name = basename.with_suffix('.mp3')
    with name.open('wb') as out:
        out.write(response.audio_content)
        print(f'Audio content written to file: {name}')


go_ssml(Path.cwd() / 'demo', """
    <speak>
    Go from <mark name="here"/> here, to <mark name="there"/> there!
    </speak>
    """)
阎乐池
2023-03-14

看起来这在云文本到语音API v1beta1中是受支持的:https://cloud.google.com/text-to-speech/docs/reference/rest/v1beta1/text/synthesize#TimepointType

您可以使用https://texttospeech.googleapis.com/v1beta1/text:合成。将Timepoint Type设置为SSML_MARK。如果未设置此字段,则默认情况下不返回时间点。

 类似资料:
  • 我正在使用谷歌云语音到文本AP,并试图转录长音频文件。但是,无法检测到桶中的音频文件。我得到一个错误,说明:IOError:[Errno 2]没有这样的文件或目录: transcribe_gcs(gcs_uri):

  • Android谷歌语音转文本SDK,语音录制由SDK控制。我需要将其设置为手动按钮,用于启动和停止语音录制,以便将语音转换为文本。例如:当单击按钮开始语音识别时,它会继续录制音频,直到单击停止按钮。但在android SDK中,它会自动停止录制并将录制的音频传递给处理。

  • 我正在尝试从扬声器转录音频 我正在将声音从扬声器传送到节点。js文件(https://askubuntu.com/a/850174) 这是我的抄本。js公司 但谷歌云语音到文本在1分钟内对流媒体识别有一个限制。所以我有一个错误“超过了允许的最大流持续时间65秒” 如何将流拆分为以静默为拆分器的块,或拆分为持续30秒的块?

  • 我能够使用链接中包含的教程转录音频(https://cloud.google.com/speech-to-text/docs/async-recognize),但它仅适用于WAV格式的音频。我想让它与MP3或M4A格式的音频一起工作。 我已经测试了链接中包含的所有可能性(https://github.com/GoogleCloudPlatform/java-docs-samples/blob/ma

  • 新的谷歌云语音文本转换API据说是市场上最好的。它是否提供了说话人注释(或其他说话人信息)?比如谁在什么时候说什么。我似乎在它的文档或提供的例子中找不到任何提到它的地方。 IBM和亚马逊都这样做。 如果有人能告诉我,我将不胜感激,谢谢!

  • 我正在努力寻找使用谷歌云语音API进行实时连续语音识别的例子。我的要求是使用麦克风,检测语音,并在用户说话时进行转录。 我知道他们的RESTAPI没有这种支持,所以我研究了grpc示例,包括他们提供的示例。但它们似乎都是用户可以上传音频并检测语音的例子。 我在Java,谷歌grpc也支持java。有人遇到一个很好的例子,展示了如何通过麦克风持续进行这种识别吗?