# 语音转文字 - 树莓派 在本课的这一部分,你将编写代码,将捕获的音频中的语音转换为文字,使用语音服务完成这一任务。 ## 将音频发送到语音服务 可以通过 REST API 将音频发送到语音服务。要使用语音服务,首先需要请求一个访问令牌,然后使用该令牌访问 REST API。这些访问令牌的有效期为10分钟,因此你的代码需要定期请求新的令牌,以确保它们始终是最新的。 ### 任务 - 获取访问令牌 1. 在你的树莓派上打开 `smart-timer` 项目。 1. 删除 `play_audio` 函数。这个函数已经不再需要,因为你不希望智能计时器重复你所说的话。 1. 在 `app.py` 文件的顶部添加以下导入: ```python import requests ``` 1. 在 `while True` 循环的上方添加以下代码,以声明语音服务的一些设置: ```python speech_api_key = '' location = '' language = '' ``` 将 `` 替换为你的语音服务资源的 API 密钥。将 `` 替换为你创建语音服务资源时使用的位置。 将 `` 替换为你将使用的语言的区域名称,例如 `en-GB` 表示英语,或者 `zn-HK` 表示粤语。你可以在 [Microsoft 文档上的语言和语音支持文档](https://docs.microsoft.com/azure/cognitive-services/speech-service/language-support?WT.mc_id=academic-17441-jabenn#speech-to-text) 中找到支持的语言及其区域名称的列表。 1. 在此代码的下方,添加以下函数以获取访问令牌: ```python def get_access_token(): headers = { 'Ocp-Apim-Subscription-Key': speech_api_key } token_endpoint = f'https://{location}.api.cognitive.microsoft.com/sts/v1.0/issuetoken' response = requests.post(token_endpoint, headers=headers) return str(response.text) ``` 该函数调用一个令牌发放端点,并将 API 密钥作为请求头传递。此调用返回一个访问令牌,可用于调用语音服务。 1. 在此代码的下方,声明一个函数,通过 REST API 将捕获的音频中的语音转换为文字: ```python def convert_speech_to_text(buffer): ``` 1. 在此函数内部,设置 REST API 的 URL 和请求头: ```python url = f'https://{location}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1' headers = { 'Authorization': 'Bearer ' + get_access_token(), 'Content-Type': f'audio/wav; codecs=audio/pcm; samplerate={rate}', 'Accept': 'application/json;text/xml' } params = { 'language': language } ``` 这段代码使用语音服务资源的位置构建一个 URL。然后,它将 `get_access_token` 函数返回的访问令牌以及捕获音频时使用的采样率填充到请求头中。最后,它定义了一些参数,这些参数将与 URL 一起传递,包含音频中的语言信息。 1. 在此代码的下方,添加以下代码以调用 REST API 并获取返回的文字: ```python response = requests.post(url, headers=headers, params=params, data=buffer) response_json = response.json() if response_json['RecognitionStatus'] == 'Success': return response_json['DisplayText'] else: return '' ``` 这段代码调用 URL,并解码响应中的 JSON 值。响应中的 `RecognitionStatus` 值指示是否成功将语音提取为文字。如果该值为 `Success`,则函数返回提取的文字,否则返回一个空字符串。 1. 在 `while True:` 循环的上方,定义一个函数来处理语音转文字服务返回的文字。这个函数目前只会将文字打印到控制台。 ```python def process_text(text): print(text) ``` 1. 最后,在 `while True` 循环中,将对 `play_audio` 的调用替换为对 `convert_speech_to_text` 函数的调用,并将返回的文字传递给 `process_text` 函数: ```python text = convert_speech_to_text(buffer) process_text(text) ``` 1. 运行代码。按下按钮并对着麦克风说话。完成后松开按钮,音频将被转换为文字并打印到控制台。 ```output pi@raspberrypi:~/smart-timer $ python3 app.py Hello world. Welcome to IoT for beginners. ``` 尝试不同类型的句子,以及一些单词发音相同但含义不同的句子。例如,如果你使用英语,可以说“我想买两个香蕉和一个苹果”,注意它会根据单词的上下文正确使用 to、two 和 too,而不仅仅是根据发音。 > 💁 你可以在 [code-speech-to-text/pi](../../../../../6-consumer/lessons/1-speech-recognition/code-speech-to-text/pi) 文件夹中找到这段代码。 😀 你的语音转文字程序运行成功了! **免责声明**: 本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们概不负责。