使用 GPT-4o 实时 API 构建一个语音机器人

语音技术正在改变我们与机器互动的方式,使与AI的对话感觉比以往任何时候都更加自然。随着 GPT-4o 实时API的公开测试版发布,开发人员现在可以使用这些工具在应用程序中创建低延迟、多模态的语音体验,从而为创新开辟了无限的可能性。

过去构建语音机器人需要将多个模型拼接在一起,用于语音识别、推理和文本转语音等操作。而现在借助实时API,开发者只需通过一个API调用即可完成整个过程,从而实现流畅、自然的语音对话。这对于客户支持、教育和实时语言翻译等行业来说是一个重大变革,因为在这些行业中,快速、无缝的交互至关重要。

……

阅读全文

检索增强微调:使用 GPT-4o 微调 GPT-4o mini 模型以适用于特定领域应用

对企业来说,生成式AI最具影响力的应用之一是创建自然语言界面,这些界面已根据特定领域和使用场景的数据进行了定制,以提供更准确、更准确的响应。这意味着回答与银行、法律和医疗等特定领域相关的问题。

我们经常谈到实现这一目标的两种方法:

  1. 检索增强生成(RAG):将这些文档存储在向量数据库中,在查询时根据它们与问题的语义相似度来检索文档,然后将它们作为LLM的上下文。
  2. 监督微调(SFT):在一组代表特定领域知识的提示和响应上对现有的基线模型进行训练。

虽然大多数尝试使用RAG的组织都试图通过其内部知识库来扩展LLM的知识,但许多组织在没有进行显著优化的情况下未能达到预期效果。同样,精心挑选一个足够大且高质量的数据集用于微调也是一项具有挑战性的任务。这两种方法都有局限性:微调将模型限制在其已训练的数据上,使其容易受到近似和幻觉的影响,而RAG虽然可以使模型落地,但它仅根据查询与文档的语义接近程度来检索文档——这可能与查询无关,并导致给出的解释不充分。

……

阅读全文

语音识别与合成中的延迟问题及解决策略

语音识别和合成的延迟可能是创建无缝和高效应用程序的一个重大障碍。减少延迟不仅可以改善用户体验,还可以提升实时应用程序的整体性能。本文将探讨在一般转录、实时转录、文件转录和语音合成中减少延迟的策略。

1. 网络延迟:将语音资源移近应用程序

导致语音识别延迟的主要因素之一是网络延迟。为了减轻这一延迟,关键是减少应用程序与语音识别资源之间的距离。以下是一些建议:

……

阅读全文

LLM 是脑,RPA 是手

LLM 是脑,RPA 是手——大模型与自动化技术的深度融合分析

一、引言

在数字化转型的浪潮中,人工智能(AI)技术正以前所未有的速度改变着我们的世界。其中,大模型(LLM,Large Language Model)和机器人流程自动化(RPA,Robotic Process Automation)作为两大关键技术,正在各自领域发挥着巨大的作用。LLM以其强大的语言理解和生成能力,被誉为“智能的大脑”,而RPA则以其高效的自动化执行能力,被称为“数字的手”。当这两者结合在一起,会擦出怎样的火花?本文将从多个维度深入探讨大模型LLM与RPTA结合的必要性与可行性,并分析其带来的变革与挑战。

……

阅读全文

使用 Azure 机器学习对小型语言模型 Phi-3 进行微调

Phi-3 是由微软研究团队开发的小型语言模型。在多个公开基准测试(例如在 MMLU 上 Phi-3 达到了69%的成绩)中,Phi-3 表现良好并且可以支持长达128k的上下文。Phi-3-mini 3.8B版于2024年4月末首次发布,而 Phi-3-small、Phi-3-medium 和 Phi-3-vision 于5月在微软 Build 大会上揭晓。

……

阅读全文

Azure OpenAI 语音聊天

本文介绍使用 Azure AI 语音与 Azure OpenAI 服务实现全语音对话聊天,以及如何改进非阻塞式的对话。

要点

  • Azure AI 语音服务识别文本
  • 将文本发送到 Azure OpenAI,获取流式回复
  • Azure AI 语音服务对流式响应的文本合成语音

代码示例(Python)

以下是 Python 版本的示例,想要了解更多语言的示例,请参考 OpenAI-Speech

安装依赖

1
2
pip install azure-cognitiveservices-speech
pip install openai

添加代码

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import os
import azure.cognitiveservices.speech as speechsdk
from openai import AzureOpenAI

# This example requires environment variables named 
# "OPEN_AI_KEY", "OPEN_AI_ENDPOINT" and "OPEN_AI_DEPLOYMENT_NAME"

# Your endpoint should look like the following:
# https://YOUR_OPEN_AI_RESOURCE_NAME.openai.azure.com/
client = AzureOpenAI(
azure_endpoint=os.environ.get('OPEN_AI_ENDPOINT'),
api_key=os.environ.get('OPEN_AI_KEY'),
api_version="2024-05-01-preview"
)

# This will correspond to the custom name you chose for 
# your deployment when you deployed a model.
deployment_id=os.environ.get('OPEN_AI_DEPLOYMENT_NAME')

# This example requires environment variables 
# named "SPEECH_KEY" and "SPEECH_REGION"
speech_config = speechsdk.SpeechConfig(subscription=os.environ.get('SPEECH_KEY'), 
                                       region=os.environ.get('SPEECH_REGION'))
audio_output_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True)
audio_config = speechsdk.audio.AudioConfig(use_default_microphone=True)

# Should be the locale for the speaker's language.
speech_config.speech_recognition_language="zh-CN"
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, 
                                               audio_config=audio_config)

# The language of the voice that responds on behalf of Azure OpenAI.
speech_config.speech_synthesis_voice_name='zh-CN-YunyiMultilingualNeural'
speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, 
                                                 audio_config=audio_output_config)
# tts sentence end mark
tts_sentence_end = [ ".", "!", "?", ";", "。", "!", "?", ";", "\n" ]

# Prompts Azure OpenAI with a request and synthesizes the response.
def ask_openai(prompt):
    # Ask Azure OpenAI in streaming way
    response = client.chat.completions.create(model=deployment_id, 
                                              max_tokens=200, 
                                              stream=True, 
                                              messages=[
                                                {"role": "user", "content": prompt}
                                              ])
    collected_messages = []
    last_tts_request = None

    # iterate through the stream response stream
    for chunk in response:
        if len(chunk.choices) > 0:
            # extract the message
            chunk_message = chunk.choices[0].delta.content  
            if chunk_message is not None:
                # save the message
                collected_messages.append(chunk_message)  
                # sentence end found
                if chunk_message in tts_sentence_end: 
                    # join the recieved message together to build a sentence
                    text = ''.join(collected_messages).strip() 
                    if text != '': 
                        # if sentence only have \n or space, we could skip
                        print(f"Speech synthesized to speaker for: {text}")
                        last_tts_request = speech_synthesizer
                                                    .speak_text_async(text)
                        collected_messages.clear()
    if last_tts_request:
        last_tts_request.get()

# Continuously listens for speech input to recognize 
# and send as text to Azure OpenAI
def chat_with_open_ai():
    while True:
        print("""Azure OpenAI is listening. 
               Say 'Stop' or press Ctrl-Z to end the conversation.""")
        try:
            # Get audio from the microphone and 
            # then send it to the TTS service.
            speech_recognition_result = speech_recognizer.
                                           recognize_once_async().get()

            # If speech is recognized, send it to Azure OpenAI 
            # and listen for the response.
            if speech_recognition_result.reason == speechsdk.ResultReason
                                                         .RecognizedSpeech:
                if speech_recognition_result.text == "Stop." 
                             or speech_recognition_result.text == "Stop。":
                    print("Conversation ended.")
                    break
                print("Recognized speech: {}".format(
                                            speech_recognition_result.text))
                ask_openai(speech_recognition_result.text)
            elif speech_recognition_result.reason == speechsdk.ResultReason
                                                                  .NoMatch:
                print("No speech could be recognized: {}".format(
                                speech_recognition_result.no_match_details))
                break
            elif speech_recognition_result.reason == speechsdk.ResultReason
                                                                  .Canceled:
                cancellation_details = speech_recognition_result
                                                      .cancellation_details
                print("Speech Recognition canceled: {}".format(
                                               cancellation_details.reason))
                if cancellation_details.reason == speechsdk.CancellationReason
                                                                    .Error:
                    print("Error details: {}".format(
                                        cancellation_details.error_details))
        except EOFError:
            break

# Main
try:
    chat_with_open_ai()
except Exception as err:
    print("Encountered exception. {}".format(err))

非阻塞式改进

前面的示例运行起来的效果是固定一问一答交流的,如果希望实现对话的过程是可以被打断的,可以改变识别语音的代码为非阻塞式。 即把调用 ask_openai 的地方改为创建另一个线程来执行。

……

阅读全文

为什么大模型难落地?

以大模型为核心的 AIGC,在推广普及的早期阶段,观望者是多数。大模型难落地的话题屡见不鲜,同时各类充满创意和创新的项目不断在互联网上涌现,大家不禁会产生疑问,到底大模型落地有多难?

我尝试深追了一下,和身边的同事、好友以及合作伙伴谈及这个话题,慢慢有了一些切实的感受。原来大家对“落地”一词是有很多角度的理解。首先提出的一派观点就是产生收益即落地,能赚到钱说明被市场和客户认同了,道理上一看貌似也说得通。但是以收益来评价落地效果在早期阶段会有一些走样,比如 AIGC 相关的知识付费,对于提供者来说是“落地”了,可对于消费者来说这才刚刚了解和接触,能不能用到自身的工作、业务中亦未可知。于是有了第二类说法,使用 AIGC 像作个表情包,画一张宣传广告图,生成一小段音乐等等,有付费且最终被购买者使用了,这该符合“落地”了吧。有意思的是它们有个共通的特点,都是贴近生活娱乐的,产物都是被人类直接消费掉的,严肃地说它具有什么样的价值——其实心里也觉得是模模糊糊的。当然还有另外一种形式,就是所谓工具党,也称作卖铲人,比较常见于软件开发、办公效率场景,软件开发者喜欢用到 AI 编码助手,根据上下文智能地生成代码能极大提高开发效率,办公类工具就更举不胜举了,自动生成文案,润色稿件,生成 PPT 或 Excel 表的内容……传统办公应用在大模型的加持下的确焕发了新的生产力。

……

阅读全文

实现 Azure OpenAI 无密钥身份验证

与许多 Azure API 一样,Azure OpenAI 服务允许开发人员使用API密钥无密钥(通过Entra ID)进行身份验证。由于尽量避免使用密钥是安全最佳实践,因此我们在本文中将详细介绍如何使开发人员轻松地迁移到无密钥 Azure OpenAI 身份验证。如果您想立即行动,这里还提供了一个新的无密钥部署模板。

密钥的风险

首先让我们来谈谈API密钥的风险,使用密钥很省心,因为设置看起来很简单——你只需要一个端点URL和密钥:

……

阅读全文

使用 Semantic Kernel 构建自定义 Copilot

本文重点介绍如何使用由 Azure OpenAI 服务提供支持的 Semantic Kernel 创建自己的 Copilot。我们将尝试利用大型语言模型(LLM)的优势与外部服务的集成。这将使您了解如何真正实现您的 Copilot 目标,不仅与零售业,而且与任何行业,无论是电力和公用事业,政府和公共部门等。它的整体功能和潜在的应用场景都远超于聊天机器人。

……

阅读全文

从引导程序说起

盛传埃隆·马斯克说过“基于碳基生命体的人类是硅基生命的引导程序”这句话,也因为当下人工智能在大模型的加持下被推向了一波新的热潮,人们对于智慧和生命形态有了更多的想象。

我的感觉是,现在提引导程序启动为时尚早。以当下我们的科技水平和认知,还有许多课题要探索,比如宇宙中是否有其他的生命存在,是否还有更高维度的生物。 这些研究有助于人类了解生命和文明的本源,或许决定了人类有了向何种生命引导的选择。

……

阅读全文