- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从亚马逊流媒体 API 收到此响应。谁能帮我解决我在这里做错了什么。
b'\x00\x00\x00\xa3\x00\x00\x00ah\x10k\xe1\x0f:异常类型\x07\x00\x13BadRequestException\r:内容类型\x07\x00\x10application/json\r:message-type\x07\x00\texception{"Message":"收到意外的 WebSocket 帧。"}\xbd\xceK\x8a'
: 消息类型异常{"消息":"收到意外的 WebSocket 帧。"}½ÈK
我正在使用下面的代码
导入所有库
import asyncio
import websockets
import json
import sys, os, base64, datetime, hashlib, hmac, urllib
import pyaudio
import struct
import numpy as np
import wave
import argparse
import tempfile
import queue
import sys
import sounddevice as sd
import soundfile as sf
import numpy # Make sure NumPy is loaded before it is used in the callback
assert numpy # avoid "imported but unused" message (W0611)
使用 Soundevice 流式传输音频的代码
def int_or_str(text):
"""Helper function for argument parsing."""
try:
return int(text)
except ValueError:
return text
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-l', '--list-devices', action='store_true', help='show list of audio devices and exit')
args, remaining = parser.parse_known_args()
if args.list_devices:
print(sd.query_devices())
parser.exit(0)
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, parents=[parser])
parser.add_argument('filename', nargs='?', metavar='FILENAME',help='audio file to store recording to')
parser.add_argument('-d', '--device', type=int_or_str,help='input device (numeric ID or substring)')
parser.add_argument('-r', '--samplerate', type=int, help='sampling rate')
parser.add_argument('-c', '--channels', type=int, default=1, help='number of input channels')
parser.add_argument('-t', '--subtype', type=str, help='sound file subtype (e.g. "PCM_24")')
args = parser.parse_args(remaining)
q = queue.Queue()
def callback(indata, frames, time, status):
"""This is called (from a separate thread) for each audio block."""
if status:
print(status, file=sys.stderr)
q.put(indata.copy())
根据 amazon transcribe 的要求创建用于连接的 URl
def createPresignedUrl(data):
method = 'GET'
service = 'transcribe'
region = data['region']
host = 'transcribestreaming.' + region + '.amazonaws.com:8443'
endpoint = "wss://" + host
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
def getSignatureKey(key, dateStamp, regionName, serviceName):
kDate = sign(('AWS4' + key).encode('utf-8'), dateStamp)
kRegion = sign(kDate, regionName)
kService = sign(kRegion, serviceName)
kSigning = sign(kService, 'aws4_request')
return kSigning
access_key = data['key']
secret_key = data['secret']
if access_key == '' or secret_key == '':
print('No access key is available.')
sys.exit()
# Create a date for headers and the credential string
t = datetime.datetime.utcnow()
amz_date = t.strftime('%Y%m%dT%H%M%SZ') # Format date as YYYYMMDD'T'HHMMSS'Z'
datestamp = t.strftime('%Y%m%d') # Date w/o time, used in credential scope
canonical_uri = '/stream-transcription-websocket'
canonical_headers = 'host:' + host + '\n'
signed_headers = 'host'
algorithm = 'AWS4-HMAC-SHA256'
credential_scope = datestamp + '/' + region + '/' + service + '/' + 'aws4_request'
canonical_querystring = 'X-Amz-Algorithm=AWS4-HMAC-SHA256'
canonical_querystring += '&X-Amz-Credential=' + urllib.parse.quote_plus(access_key + '/' + credential_scope)
canonical_querystring += '&X-Amz-Date=' + amz_date
canonical_querystring += '&X-Amz-Expires=300'
canonical_querystring += '&X-Amz-SignedHeaders=' + signed_headers
canonical_querystring += '&language-code=' + data['languageCode']
canonical_querystring += '&media-encoding=pcm'
canonical_querystring += '&sample-rate=' + str(data['sampleRate'])
payload_hash = hashlib.sha256(('').encode('utf-8')).hexdigest()
# Step 6: Combine elements to create canonical request
canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
string_to_sign = algorithm + '\n' + amz_date + '\n' + credential_scope + '\n' + hashlib.sha256(canonical_request.encode('utf-8')).hexdigest()
# Create the signing key
signing_key = getSignatureKey(secret_key, datestamp, region, service)
# Sign the string_to_sign using the signing_key
signature = hmac.new(signing_key, (string_to_sign).encode("utf-8"), hashlib.sha256).hexdigest()
canonical_querystring += '&X-Amz-Signature=' + signature
request_url = endpoint + canonical_uri + "?" + canonical_querystring
return request_url
data = {
'key': 'Add your key',
'secret': 'Add your secret key',
'region': 'us-east-1',
'languageCode': 'en-US',
'sampleRate': 44100
}
PCM编码代码
url = createPresignedUrl(data)
# FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 16000
frames = []
# stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
def pcmEncode(in_data):
offset = 0
input_len = len(in_data)
buffer = []
for i in range(input_len):
offset += 2
s = max(-1, min(1, in_data[i]))
b = (s * 32768) if (s < 0) else (s * 32767)
buffer.insert(offset, b)
buffer = np.array(buffer)
return buffer
def downsampleBuffer(buffer, outputSampleRate = 16000) :
if outputSampleRate == RATE :
return buffer
sampleRateRatio = RATE / outputSampleRate
newLength = round( len(buffer) / sampleRateRatio )
result = []
offsetResult = 0
offsetBuffer = 0
while offsetResult < newLength :
nextOffsetBuffer = round((offsetResult + 1) * sampleRateRatio)
accum = 0
count = 0
len_buffer = nextOffsetBuffer if nextOffsetBuffer < len(buffer) else len(buffer)
for i in range( offsetBuffer, len_buffer):
accum += buffer[i]
count += 1
result.append(accum / count)
offsetResult += 1
offsetBuffer = nextOffsetBuffer
return result
与 AWS 建立连接以进行转录
async def start_stream():
try:
connection = websockets.connect(url)
stream = sd.Stream(samplerate=args.samplerate, blocksize=None, device=args.device,
channels=args.channels, dtype=None, latency=None, extra_settings=None,
callback=None, finished_callback=None, clip_off=None, dither_off=None,
never_drop_input=None, prime_output_buffers_using_stream_callback=None)
stream.start()
while True:
a = stream.read(200)
buffer = downsampleBuffer(a[0])
result = pcmEncode(buffer)
async with connection as ws:
sent_data = {
"headers": {
":message-type": {"type": "string", "value": "event"},
":event-type": {"type": "string", "value": "AudioEvent"},
":content-type": {"type": "string", "value": "application/octet-stream"}
},
"body": str(result)
}
await ws.send(json.dumps(sent_data))
response = await ws.recv()
print(response)
print(response.decode('latin1'))
except KeyboardInterrupt:
parser.exit('\nInterrupted by user')
except Exception as e:
parser.exit(type(e).__name__ + ': ' + str(e))
if status:
parser.exit('Error during playback: ' + str(status))
asyncio.get_event_loop().run_until_complete(start_stream())
stream.stop()
stream.close()
最佳答案
我现在相信 BadRequestException
指的是帧编码不正确,而不是音频数据错误。我发现您的代码存在一些问题:
您需要以特殊方式对 header /正文进行编码:https://docs.aws.amazon.com/transcribe/latest/dg/event-stream.html
您需要非常熟练地处理您发送的缓冲区。音频需要是 16 位/无符号 (int)/little-endian ( See here )。现在您只是将 float (您的麦克风数据是 float 吗??)转换为 16 位友好值,但将其存储在位大小由系统决定的缓冲区中(可能是 32 位或 64 位)并且您正在使用 JSON 字符串编码器对其进行编码。之后不太可能是正确的格式。基本上,您需要一个缓冲区库,它可以让您设置具有指定位大小 (16) 和字节序值(小)的 int。例如,这是我的飞镖代码:
for (var i=0; i<audioChunk.length; i++) {
messageBytes.setInt16(offset, audioChunk[i], Endian.little);
offset += 2;
}
继续的最佳方法是编写 AWS 响应无论如何都需要的解码函数,然后解码您的 编码帧并查看结果是否相同。为音频使用测试数据,例如 [-32000, -100, 0, 200 31000] 或类似的东西,这样您就可以测试字节顺序等是否全部正确。
关于python - 在 AWS Transcribe 中实时获取 BadRequestException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63137516/
我有 wav 格式的 6 秒录音 (ar-01.wav)。我想使用亚马逊服务将音频文件转录为文本。为此,我创建了一个名为 test-voip 的存储桶,并将音频文件上传到存储桶。当我尝试将语音转换为文
我目前有代码: public class ProviderTranscribeController { private AmazonTranscribe client = Amazon
我从亚马逊流媒体 API 收到此响应。谁能帮我解决我在这里做错了什么。 b'\x00\x00\x00\xa3\x00\x00\x00ah\x10k\xe1\x0f:异常类型\x07\x00\x13Ba
嗨,我是AWS的新手。我的应用程序是使用AWS transcribe录制音频并将语音转换为文本。 因此,我正在从Web浏览器录制音频,然后将其保存到AWS S3。稍后,当我尝试在该音频文件上使用AWS
我想使用 AWS Transcribe API 将用户的实时语音转换为文本。出于某种原因,没有关于如何在 android 中完成的适当文档。 这是以低效方式执行此操作的链接 Speech to tex
我是否需要删除使用 Amazon Transcribe 服务创建的一些转录作业? 我第一次使用 amazon transcribe 从视频中获取文本,它工作正常,但我没有找到任何如何删除特定转录作业的
我是 AWS 服务的新手,我们想要构建一个简单的演示来检测一个特殊的词,并且:[1] 触发一个 Action [2] 响应(作为通话期间的语音)。 例如,如果用户说:“帮助”,我想回复“确定”并进行操
我使用无服务器 Lambda 服务通过 Amazon Transcribe 将语音转录为文本。我当前的脚本能够从 S3 转录文件并将结果作为 JSON 文件存储在 S3 中。 是否有可能直接获取结果,
我使用无服务器 Lambda 服务通过 Amazon Transcribe 将语音转录为文本。我当前的脚本能够从 S3 转录文件并将结果作为 JSON 文件存储在 S3 中。 是否有可能直接获取结果,
当 AWS Transcribe 仍在进行流式传输时,isPartial 标志将设置为 True。我想在 isPartial 标志设置为 False 后停止流传输,该怎么做? 有人做过吗? https
我已将 AWS Java SDK 集成到我的应用程序中。不幸的是,我收到“内部故障。请重试您的请求”作为响应。 这就是我实现它的方式。 使用 Maven,在 pom.xml 中添加此内容
我正在尝试使用 aws-sdk-ios 在 iOS 应用程序中使用 AWS Transcribe。该应用程序启动转录作业,我可以在 AWS 控制台上看到该作业。但应用程序无法列出作业或获取特定作业,因
我无法在 AWS .NET SDK 中找到任何关于转录流服务(从语音到文本)的引用。 它在 .NET SDK Amazon Transcribe Streaming Service 中可用吗?任何引用
尝试找到一个包来转换来自 Amazon AWS Transcribe 服务的 json 响应,但没有成功。 您可以看到an example of the JSON in the JavaScript
我正在尝试使用 AWS Java 开发工具包开发一个使用 Amazon Transcribe 服务的 ColdFusion 应用程序。不幸的是,我对 Java 的了解很少(更不用说 SDK 本身了),
我正在使用 IBM Watson speech to text iOS SDK 来转录实时音频。我已经通过 cocoa pod 安装了它。我在将音频转录为文本时遇到问题(身份验证)。 安装的STT S
我正在尝试使用来自 Go 1.11 的 Amazon 新的流式转录 API。目前亚马逊只提供Java SDK,所以我正在尝试低级方式。 唯一相关的文档是 here但它没有显示端点。我在 Java ex
我正在尝试确定 AWS Lex 是否使用 AWS Transcribe 进行提示确认。例如,Lex 询问“你的电话号码是什么?”,用户回答“1-2-3-4”。 Lex 然后问道:“你是说 1-2-3-
我正在尝试确定 AWS Lex 是否使用 AWS Transcribe 进行提示确认。例如,Lex 询问“你的电话号码是什么?”,用户回答“1-2-3-4”。 Lex 然后问道:“你是说 1-2-3-
我正在尝试将 Amazon Transcribe Streaming Service 与来自 Node.js 的 http2 请求一起使用,这是我正在关注的文档链接 Streaming request
我是一名优秀的程序员,十分优秀!