如何组合几个 base64 音频块(来自麦克风)

How can combine few base64 audio chunks (from microphone)

我从麦克风获取 base64 块。

我需要将它们连接起来并作为一个 base64 string 发送到 Google API 以进行语音识别。粗略地说,在第一个块中单词 Hello 被编码,在第二个块中编码 world!。我需要粘合两个块,将它们发送到一行的 google api 并接收 Hello world! 作为响应

你可以看Google Speech-to-Text作为例子。 Google 还使用 websockets 从 base64 string 中的麦克风发送数据(参见 Network)。

很遗憾,我手边没有麦克风 - 我无法查看。我们必须现在就做。

假设我得到

chunk1 = "TgvsdUvK ...."
chunk2 = "UZZxgh5V ...."

我是不是理解错了就够了

base64.b64encode (chunk1 + chunk2))

或者您还需要了解其他信息吗?不幸的是,一切都取决于缺少麦克风(

您的编码示例 chunk1 + chunk2 将不起作用,因为 base64 字符串末尾有填充。如果您只是将两个 base64 字符串连接在一起,则无法对其进行解码。

例如,字符串 StringAStringB,当它们的 ascii 或 utf-8 表示以 base64 编码时,如下所示:U3RyaW5nQQ==U3RyaW5nQg== .每一个都可以很好地解码。但是,如果您将它们连接起来,您的结果将是 U3RyaW5nQQ==U3RyaW5nQg==,这是无效的:

concatenated_b64_strings = 'U3RyaW5nQQ==U3RyaW5nQg=='
concatenated_b64_strings_bytes = concatenated_b64_strings.encode('ascii')
decoded_strings = base64.b64decode(concatenated_b64_strings_bytes)
print(decoded_strings.decode('ascii')) # just outputs 'StringA', which is incorrect

因此,为了获取这两个字符串(我将其用作代替二进制数据的示例)并将它们连接在一起,仅从它们的 base64 表示开始,您必须对它们进行解码:

import base64

string1_base64 = 'U3RyaW5nQQ=='
string2_base64 = 'U3RyaW5nQg=='

# need to convert the strings to bytes first in order to decode them
base64_string1_bytes = string1_base64.encode('ascii')
base64_string2_bytes = string2_base64.encode('ascii')

# now, decode them into the actual bytes the base64 represents
base64_string1_bytes_decoded = base64.decodebytes(base64_string1_bytes)
base64_string2_bytes_decoded = base64.decodebytes(base64_string2_bytes)

# combine the bytes together
combined_bytes = base64_string1_bytes_decoded + base64_string2_bytes_decoded

# now, encode these bytes as base64
combined_bytes_base64 = base64.encodebytes(combined_bytes)

# finally, decode these bytes so you're left with a base64 string:
combined_bytes_base64_string = combined_bytes_base64.decode('ascii')
print(combined_bytes_base64_string) # output: U3RyaW5nQVN0cmluZ0I=

# let's prove that it concatenated successfully (you wouldn't do this in your actual code)
base64_combinedstring_bytes = combined_bytes_base64_string.encode('ascii')
base64_combinedstring_bytes_decoded_bytes = base64.decodebytes(base64_combinedstring_bytes)
base64_combinedstring_bytes_decoded_string = base64_combinedstring_bytes_decoded_bytes.decode('ascii')
print(base64_combinedstring_bytes_decoded_string) # output: StringAStringB

在您的情况下,您要合并的不仅仅是两个输入的 base64 字符串,但过程是相同的。获取所有字符串,将每个字符串编码为 ascii 字节,通过 base64.decodebytes() 解码它们,然后通过 += 运算符将它们全部加在一起:

import base64

input_strings = ['U3RyaW5nQQ==', 'U3RyaW5nQg==']
input_strings_bytes = [input_string.encode('ascii') for input_string in input_strings]
input_strings_bytes_decoded = [base64.decodebytes(input_string_bytes) for input_string_bytes in input_strings_bytes]
combined_bytes = bytes()
for decoded in input_strings_bytes_decoded:
    combined_bytes += decoded
combined_bytes_base64 = base64.encodebytes(combined_bytes)
combined_bytes_base64_string = combined_bytes_base64.decode('ascii')
print(combined_bytes_base64_string) # output: U3RyaW5nQVN0cmluZ0I=