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

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

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 目标,不仅与零售业,而且与任何行业,无论是电力和公用事业,政府和公共部门等。它的整体功能和潜在的应用场景都远超于聊天机器人。

……

阅读全文

从引导程序说起

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

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

……

阅读全文

FireUG x .NET Conf China - Watch Party

🔥 .NET Conf China Watch Party 杭州站活动来啦!🎉

—— FireUG特别呈现🔥

这不仅仅是 2024 年 FireUG 第一次线下聚会,除了社区新老朋友的互动外,我们还带来了.NET Conf China 2023 的新鲜消息和微软定制礼品!🎁💥

主要组织者

项斌(Bin Xiang)微软最有价值专家
Alvin SSW China CEO
Yang SSW 资深专家

主持人

骆姜斌(Jerry) FireUG 组织者 微软最有价值专家

肖伟宇 FireUG 组织者 NetCorePal 框架开发者

议程

  • 13:00-13:30 暖场 活动介绍

    ……

阅读全文

GPTs action 中使用 Azure AI Search

OpenAI 的 GPTs 上线有一段时间了,在实际应用中发现 GPTs 内置对知识库的检索能力很一般,对话过程中经常拿不到期望的反馈内容。如果利用 GPTs 的 action 能很好地弥补这个缺陷。

总所周知加强检索知识库离不开 RAG,如果自建 RAG 将会是一个很大的工作量,而且还要考虑到知识库的更新问题。于是想到 Azure AI Search 提供了一个很好的解决方案,可以很方便地将知识库导入到 Azure AI Search 中,然后通过 API 调用来检索知识库。整个过程都不需要编码,所以将 Azure AI Search 与 GPTs action 结合起来是个不错的主意。

……

阅读全文