利用AssemblyAI的API实现简单的语音识别

本文介绍了AssemblyAI语音识别API的使用。包括前期准备,如参数配置与库导入;录制音频、上传本地文件,向终端请求获取参数;转录时指定语言发送请求获响应;通过poll操作询问转录状态,最终得到识别结果。该接口免费但有时间限制,非实时识别较准确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方文档:AssemblyAI | Overview

 

前期准备

参数配置以及相关库的导入

#导入第三方库
import requests
import pyaudio
import wave
from tqdm import tqdm 
​
#设置参数
FRAME_PER_BUFFER = 4096  #每个缓冲区的帧数
FORMAT = pyaudio.paInt32    #字节类型
CHANNELS = 2
RATE: int = 44100

终端

upload_endpoint = "https://api.assemblyai.com/v2/upload"  #上传终端
transcript_endpoint = "https://api.assemblyai.com/v2/transcript"  #转录终端

请求头

这里的API_KRY_ASSEMBLYAI为每个用户独有的密钥,位于官网主页

AssemblyAI Speech-to-Text API | Automatic Speech Recognition

ae9635e0570a47b49a8360c04406dc3b.png

 headers = {'authorization': API_KRY_ASSEMBLYAI}

录制音频

def record_audio(wave_out_path,record_second):
​
    #实例化
    p = pyaudio.PyAudio()
​
    stream = p.open(
        channels=CHANNELS,
        rate=RATE,
        format=FORMAT,
        input=True,
        frames_per_buffer=FRAME_PER_BUFFER
    )
​
    print("开始录制:")
​
    frames = []
    for i in tqdm(range(0, int(RATE/FRAME_PER_BUFFER * record_second ))):
        data = stream.read(FRAME_PER_BUFFER)
        frames.append(data)
​
    stream.stop_stream()
    stream.close()
    p.terminate()
​
    audio_obj = wave.open(wave_out_path, "wb")
    audio_obj.setnchannels(CHANNELS)
    audio_obj.setsampwidth(p.get_sample_size(FORMAT))
    audio_obj.setframerate(RATE)
    audio_obj.writeframes(b"".join(frames))         #将frames里面的所有元素合成二进制字符串的形式
    audio_obj.close()

上传本地文件

#上传本地文件
def upload(filename):
    def read_file(filename, chunk_size=5242880):
        with open(filename, 'rb') as _file:
            while True:
                data = _file.read(chunk_size)
                if not data:
                    break
                yield data
    try:
​
        upload_response = requests.post(upload_endpoint,
                                headers=headers,
                                data=read_file(filename))
​
        audio_url = upload_response.json()['upload_url']
        return audio_url
    except:
        print("请再次尝试")
        return

向endpoint请求后得到响应中的参数

{
  "upload_url": "https://bit.ly/3yxKEIY"
}

转录

带着从上传终端得到的upload_url以及language_code(可以指定转录的语言,每种语言都对应一种language_code,详情请看官方文档)两个参数,向转录终端发送请求得到响应json,只需要获取id

#转录
def transcribe(audio_url):
    transcript_request_json = { 
        "audio_url": audio_url,
        "language_code": "es"
                              }
    transcript_response = requests.post(
        transcript_endpoint, 
        json=transcript_request_josn, 
        headers=headers)
    
    id = transcript_response.json()['id']
    return id

响应json:

{
    "id": "5551722-f677-48a6-9287-39c0aafd9ac1"
    ...
}   

poll操作以及获取结果

poll操作:询问转录的状态,检查有关转录状态的更新。"status""queued" "processing" "completed"

等待状态更新为"completed",从json中得到转录结果text

官方文档里的poll终端:

endpoint = "https://api.assemblyai.com/v2/transcript/YOUR-TRANSCRIPT-ID-HERE"

polling_endpoint = transcript_endpoint + '/' + id

代码:

#poll操作
def poll(id):
    polling_endpoint = transcript_endpoint + '/' + id
    polling_response = requests.get(polling_endpoint,headers=headers)
    return polling_response.json()
#获取结果
def get_transcription_result_url(audio_url):
    id = transcribe(audio_url)
    print("转录中······")
    time_start = time.time()
    while True:  #一直询问转录的状态,直到转录成功
        data = poll(id)
        
        if data['status'] == 'completed':
            time_end = time.time()
            return data['text'], None, time_end-time_start  #查看转录时间
        elif data['status'] == 'error':
            return data['text'], data["error"], None

json: 这里的text就是转录结果

{
    "acoustic_model": "assemblyai_default",
    "audio_duration": 12.0960090702948,
    "audio_url": "https://bit.ly/3yxKEIY",
    "confidence": 0.956,
    "dual_channel": null,
    "format_text": true,
    "id": "5551722-f677-48a6-9287-39c0aafd9ac1",
    "language_model": "assemblyai_default",
    "language_code": "es",
    "punctuate": true,
    "status": "completed",
    "text": "Ya sabes Demonios en la tele así y para que la gente se exponga a ser rechazada en la tele o humillada por el factor miedo o.",
    ...
}

小结

整个过程比较繁琐(转录的时长大约在10秒左右,要看自己的网速),总的来说实现起来比较简单,最终的识别结果比较准确,但是不能做到实时(实时的要付费),虽然这个接口是免费的,但是也会有时间限制。详情请看官方文档。

 

<think>好的,我现在需要回答用户关于如何在langchain4j中使用语音识别的示例和教程的问题。首先,我需要回顾用户提供的引用内容,看看是否有相关的信息。 引用[1]提到了AssemblyAI和LangChain的结合,用于语音转文本和文档处理。虽然这是Python的例子,但用户现在询问的是Java的langchain4j。可能用户希望类似的功能在Java中的实现方式。 接下来,引用[2]和[3]主要讨论langchain4j的聊天模型和代理功能,没有直接提到语音识别。不过,用户的问题是关于语音识别,所以可能需要结合外部服务,如AssemblyAI,然后在langchain4j中集成这些API。 由于langchain4j本身可能没有内置的语音识别模块,所以通常的做法是通过调用外部API,比如AssemblyAI或Google Speech-to-Text,然后在Java应用中处理返回的文本。用户可能需要一个示例代码,展示如何将语音文件上传到AssemblyAI,获取转录结果,并将其加载到langchain4j的文档处理流程中。 我需要确保示例代码使用Java,并且符合langchain4j的结构。例如,使用HttpClient发送请求到AssemblyAIAPI,处理响应,然后将转录文本封装成langchain4j的Document对象,以便后续处理。 另外,用户可能需要了解如何配置API密钥、处理异步响应以及错误处理。此外,可能还需要说明如何将转录后的文本用于聊天模型或其他处理步骤,比如结合引用[3]中的代理示例。 需要验证AssemblyAIAPI是否支持Java客户端调用,或者是否需要自定义实现。根据引用[1]中的Python示例,可能用户期望类似的流程在Java中实现,所以需要调整代码结构。 最后,生成相关问题,帮助用户深入理解集成方法、处理长音频、错误处理等。</think>关于在langchain4j中实现语音识别,目前langchain4j库(Java版)暂未直接提供原生的语音识别模块。但可以通过集成第三方语音识别API(如AssemblyAI实现该功能,结合文档处理能力进行后续分析。以下是实现方案和示例: --- ### 分步实现方案 1. **调用语音识别API** 使用Java的HTTP客户端调用AssemblyAI的语音转文本API,获取原始音频转录结果 2. **创建文档加载器** 将转录文本封装为langchain4j的`Document`对象,便于后续使用langchain4j的RAG等功能 3. **集成到处理流程** 结合聊天模型进行文本分析或问答 --- ### 完整示例代码 ```java import dev.langchain4j.data.document.Document; import dev.langchain4j.data.segment.TextSegment; import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel; import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; import okhttp3.*; import java.io.File; import java.io.IOException; public class AudioProcessor { // 步骤1:语音转文本 private static String transcribeAudio(String apiKey, File audioFile) throws IOException { OkHttpClient client = new OkHttpClient().newBuilder().build(); // 上传音频文件 RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", audioFile.getName(), RequestBody.create(audioFile, MediaType.parse("audio/mpeg"))) .build(); Request uploadRequest = new Request.Builder() .url("https://api.assemblyai.com/v2/upload") .addHeader("Authorization", apiKey) .post(requestBody) .build(); Response uploadResponse = client.newCall(uploadRequest).execute(); String uploadUrl = uploadResponse.body().string(); // 获取上传后的URL // 发起转录请求 RequestBody transcriptBody = RequestBody.create( "{\"audio_url\": \"" + uploadUrl + "\"}", MediaType.parse("application/json")); Request transcriptRequest = new Request.Builder() .url("https://api.assemblyai.com/v2/transcript") .addHeader("Authorization", apiKey) .post(transcriptBody) .build(); Response transcriptResponse = client.newCall(transcriptRequest).execute(); String transcriptId = transcriptResponse.body().string(); // 获取转录任务ID // 轮询获取结果(实际需实现异步轮询逻辑) return pollForTranscriptResult(apiKey, transcriptId); } // 步骤2:创建langchain4j文档 private static Document createDocument(String transcript) { return Document.from(transcript); } // 步骤3:构建检索增强生成流程 private static void processWithLangChain(Document document) { EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>(); AllMiniLmL6V2EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); // 生成嵌入并存储 TextSegment segment = TextSegment.from(document.text()); embeddingStore.add(embeddingModel.embed(segment).content(), segment); // 后续可连接聊天模型进行问答... } public static void main(String[] args) throws IOException { String apiKey = "your_assemblyai_api_key"; File audioFile = new File("audio.mp3"); // 执行语音转文本 String transcript = transcribeAudio(apiKey, audioFile); System.out.println("转录结果:" + transcript); // 创建langchain4j文档 Document document = createDocument(transcript); // 进入处理流程 processWithLangChain(document); } } ``` --- ### 关键配置说明 1. **API密钥获取** 需在[AssemblyAI官网](https://www.assemblyai.com/)注册并获取API密钥[^1] 2. **音频格式要求** 支持MP3、WAV等常见格式,单文件最长3小时 3. **异步处理优化** 实际生产环境中建议使用Webhook或异步线程池处理转录结果轮询 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值