文本转语音-RaspberryPi


文档摘要

文本转语音 - Raspberry Pi 在这节课的这一部分,你将编写代码,使用语音服务将文本转换为语音。 使用语音服务将文本转换为语音 可以使用REST API将文本发送到语音服务,以获取可以回放的音频文件。在请求语音时,需要提供要使用的语音,因为可以使用多种不同的语音来生成语音。 每种语言都支持一系列不同的语音,你可以向语音服务发出REST请求,以获取每种语言支持的语音列表。 任务 - 获取语音 在VS Code中打开 项目。 在 函数上方添加以下代码,以请求特定语言的语音列表: 这段代码定义了一个名为 的函数,该函数使用语音服务获取语音列表,并找到匹配所用语言的第一个语音。 然后调用此函数以存储第一个语音,并将语音名称打印到控制台。这个语音可以在每次转换文本为语音时重复使用。

文本转语音 - Raspberry Pi

在这节课的这一部分,你将编写代码,使用语音服务将文本转换为语音。

使用语音服务将文本转换为语音

可以使用REST API将文本发送到语音服务,以获取可以回放的音频文件。在请求语音时,需要提供要使用的语音,因为可以使用多种不同的语音来生成语音。

每种语言都支持一系列不同的语音,你可以向语音服务发出REST请求,以获取每种语言支持的语音列表。

任务 - 获取语音

  1. 在VS Code中打开smart-timer项目。

  2. say函数上方添加以下代码,以请求特定语言的语音列表:

    def get_voice(): url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/voices/list' headers = { 'Authorization': 'Bearer ' + get_access_token() } response = requests.get(url, headers=headers) voices_json = json.loads(response.text) first_voice = next(x for x in voices_json if x['Locale'].lower() == language.lower() and x['VoiceType'] == 'Neural') return first_voice['ShortName'] voice = get_voice() print(f'Using voice {voice}')

    这段代码定义了一个名为get_voice的函数,该函数使用语音服务获取语音列表,并找到匹配所用语言的第一个语音。

    然后调用此函数以存储第一个语音,并将语音名称打印到控制台。这个语音可以在每次转换文本为语音时重复使用。

    你可以从Microsoft Docs上的语言和语音支持文档中获取所有支持的语音列表。如果你想使用特定的语音,可以删除这个函数并硬编码语音名称,例如:

    voice = 'hi-IN-SwaraNeural'

任务 - 将文本转换为语音

  1. 在这之下,定义一个常量用于从语音服务检索音频格式。当你请求音频时,可以使用多种不同的格式。

    playback_format = 'riff-48khz-16bit-mono-pcm'

    可用的格式取决于你的硬件。如果遇到Invalid sample rate errors when playing the audio then change this to another value. You can find the list of supported values in the Text to speech REST API documentation on Microsoft Docs. You will need to use riff format audio, and the values to try are riff-16khz-16bit-mono-pcm, riff-24khz-16bit-mono-pcm and riff-48khz-16bit-mono-pcm.

  2. Below this, declare a function called get_speech,则使用语音服务REST API将文本转换为语音:

    def get_speech(text):
  3. get_speech函数中,定义要调用的URL和要传递的头部信息:

    url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/v1' headers = { 'Authorization': 'Bearer ' + get_access_token(), 'Content-Type': 'application/ssml+xml', 'X-Microsoft-OutputFormat': playback_format }

    这个设置将头部信息设为使用生成的访问令牌,内容设为SSML,并定义所需的音频格式。

  4. 在这之下,定义要发送给REST API的SSML:

    ssml = f'<speak version=\'1.0\' xml:lang=\'{language}\'>' ssml += f'<voice xml:lang=\'{language}\' name=\'{voice}\'>' ssml += text ssml += '</voice>' ssml += '</speak>'

    这个SSML设置了语言、要使用的语音以及要转换的文本。

  5. 最后,在这个函数中添加代码,发起REST请求并返回二进制音频数据:

    response = requests.post(url, headers=headers, data=ssml.encode('utf-8')) return io.BytesIO(response.content)

任务 - 播放音频

  1. get_speech函数下面,定义一个新的函数来播放通过REST API调用返回的音频:

    def play_speech(speech):
  2. 传递给此函数的speech将是通过REST API返回的二进制音频数据。使用以下代码将其作为波形文件打开,并将其传递给PyAudio以播放音频:

    def play_speech(speech): with wave.open(speech, 'rb') as wave_file: stream = audio.open(format=audio.get_format_from_width(wave_file.getsampwidth()), channels=wave_file.getnchannels(), rate=wave_file.getframerate(), output_device_index=speaker_card_number, output=True) data = wave_file.readframes(4096) while len(data) > 0: stream.write(data) data = wave_file.readframes(4096) stream.stop_stream() stream.close()

    这段代码使用PyAudio流,就像捕获音频一样。不同之处在于这里设置的流是输出流,数据从音频数据中读取并推送到流中。

    而不是硬编码流细节(如采样率),而是从音频数据中读取这些细节。

  3. say函数的内容替换为以下内容:

    speech = get_speech(text) play_speech(speech)

    这段代码将文本转换为二进制音频数据,并播放音频。

  4. 运行应用程序,并确保函数应用也在运行。设置一些计时器,你会听到一段语音提示说你的计时器已设置好,然后在计时器结束时会听到另一段语音提示。

    如果遇到Invalid sample rate errors, change the playback_format,请参阅上面的描述。

你可以在code-spoken-response/pi文件夹中找到这段代码。

你的计时器程序成功了!

声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。


发布者: 作者: 转发
评论区 (0)
U