Android快速集成微软语音服务(Azure认知服务)

ASP.NET Core环境Web Audio API+SingalR+微软语音服务实现web实时语音识别 处于项目需要,我研究了一下web端的语音识别实现。目前市场上语音服务已经非常成熟了,国内的科大讯飞或是国外的微软在这块都可以提供足够优质的服务,对于我们工程应用来说只需要花钱调用接口就行了,难点在于整体web应用的开发。最开始我实现了一个web端录好音然后上传服务端进行语音识别的简单demo,但是这种结构太过简单,对浏览器的负担太重,而且响应慢,交互差;后来经过调研,发现微软的语音服务接口是支持流... 阅读详情
AI摘要

文章介绍了如何注册微软账号并开通Azure语音服务,通过集成语音SDK进行语音合成的步骤,包括代码示例和注意事项,特别提到了与其他国内语音服务的比较以及费用问题。

在网上溜了一圈,发现使用微软语音服务(Azure)的文章好少,为之感叹,在国内,百度语音、讯飞语音算是前沿语音技术,使用的公司和人自然不少,不过,在国际语言,小语种这块,还需要努力。刚开始,我也想使用百度语音翻译来着,后面发现集成好麻烦,API请求参数看懵逼了,不要友好,讯飞语音也想要集成了,看了一些demo,仔看看价格,和百度差不多,一直没动手集成,直到后面看到网上说白嫖微软语音合成文章后,大为受惊,操作一番,确实可以哈!一只白嫖一时爽,连续白嫖两周后,啊哈!网站上直接没有体验的入口了,就在不久前,也就是3月16号,俺一看,傻眼了,没了。
好吧!使用两周,感觉语音合成听着挺逼真的,那就注册一个账号,搞起来吧!至于费用什么的,后面再说。

一:注册一个微软账号

1、打开官网语音合成注册一个免费账号
如果打不开,可能需要科学上网,另外需要一个邮箱,最好是谷歌邮箱,其他邮箱如QQ邮箱没试过,不清楚,另外最最最最重要的是要有一张信用卡且支持Visa
在这里插入图片描述
2、开通认知服务中的语音Azure 服务
注册账号成功之后来到这个界面
在这里插入图片描述
点击左上角+号添加语音服务,获取密钥和位置/区域,推荐亚洲区(East Asia
在这里插入图片描述

二:集成语音SDK

1、GitHub示例代码
2、看官方文档,安装语音 SDK
跟着文档走,总结一下就是添加语音依赖库
在这里插入图片描述

implementation 'com.microsoft.cognitiveservices.speech:client-sdk:1.26.0'

3、文档中的示例我测试处理,下面放经过我优化调整后的代码,直接可用

import android.util.Log;
import com.microsoft.cognitiveservices.speech.*;
import com.xxx.config.Constants;

/**
 * @author 小红妹
 * @date 2023/3/16
 * @email L22~3535@163.com
 * @package com.xxx.speech
 * @describe  AzureSpeech
 * @copyright 
 */

public class SpeechSynthesis {

    private SpeechConfig speechConfig;
    private SpeechSynthesizer speechSynthesizer;
    private SpeechSynthesisResult speechSynthesisResult;

    public void azureSpeak() {
        // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
        speechConfig = SpeechConfig.fromSubscription(Constants.SPEECH_KEY1, Constants.SPEECH_REGION);
        // Required for WordBoundary event sentences.
        speechConfig.setProperty(PropertyId.SpeechServiceResponse_RequestSentenceBoundary, "true");
        // Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
        speechConfig.setSpeechSynthesisVoiceName(Constants.SPEECH_NAME);//"en-US-JennyNeural"

        String ssml = String.format("<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>"
                .concat(String.format("<voice name='%s'>", Constants.SPEECH_NAME))
                .concat("<mstts:viseme type='redlips_front'/>")
                .concat("The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>.")
                .concat("</voice>")
                .concat("</speak>"));

        assert(speechConfig != null);
       
        //将合成语音输出到当前活动输出设备(例如扬声器)
        AudioConfig audioConfig = AudioConfig.fromDefaultSpeakerOutput();
        speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
        assert(speechSynthesizer != null);

        // Subscribe to events
        speechSynthesizer.BookmarkReached.addEventListener((o, e) -> {
            System.out.println("BookmarkReached event:");
            System.out.println("\tAudioOffset: " + ((e.getAudioOffset() + 5000) / 10000) + "ms");
            System.out.println("\tText: " + e.getText());
        });

        speechSynthesizer.SynthesisCanceled.addEventListener((o, e) -> {
            System.out.println("SynthesisCanceled event");
        });

        //ok
        speechSynthesizer.SynthesisCompleted.addEventListener((o, e) -> {
            SpeechSynthesisResult result = e.getResult();
            byte[] audioData = result.getAudioData();
            System.out.println("SynthesisCompleted event:");
            System.out.println("\tAudioData: " + audioData.length + " bytes");
            System.out.println("\tAudioDuration: " + result.getAudioDuration());
            result.close();
        });

        speechSynthesizer.SynthesisStarted.addEventListener((o, e) -> {
            System.out.println("SynthesisStarted event");
        });

        speechSynthesizer.Synthesizing.addEventListener((o, e) -> {
            SpeechSynthesisResult result = e.getResult();
            byte[] audioData = result.getAudioData();
            System.out.println("Synthesizing event:");
            System.out.println("\tAudioData: " + audioData.length + " bytes");
            result.close();
        });

        speechSynthesizer.VisemeReceived.addEventListener((o, e) -> {
            System.out.println("VisemeReceived event:");
            System.out.println("\tAudioOffset: " + ((e.getAudioOffset() + 5000) / 10000) + "ms");
            System.out.println("\tVisemeId: " + e.getVisemeId());
        });

        speechSynthesizer.WordBoundary.addEventListener((o, e) -> {
            System.out.println("WordBoundary event:");
            System.out.println("\tBoundaryType: " + e.getBoundaryType());
            System.out.println("\tAudioOffset: " + ((e.getAudioOffset() + 5000) / 10000) + "ms");
            System.out.println("\tDuration: " + e.getDuration());
            System.out.println("\tText: " + e.getText());
            System.out.println("\tTextOffset: " + e.getTextOffset());
            System.out.println("\tWordLength: " + e.getWordLength());
        });

        // Synthesize the SSML
        System.out.println("SSML to synthesize:");
        System.out.println(ssml);
        try {
            //speechSynthesisResult = speechSynthesizer.SpeakSsmlAsync(ssml).get();
            speechSynthesisResult = speechSynthesizer.SpeakText("おはようございます, 朝食を食べましょう!");

            assert(speechSynthesisResult != null);

            if (speechSynthesisResult.getReason() == ResultReason.SynthesizingAudioCompleted) {
                System.out.println("SynthesizingAudioCompleted result");
            }
            else if (speechSynthesisResult.getReason() == ResultReason.Canceled) {
                SpeechSynthesisCancellationDetails cancellation = SpeechSynthesisCancellationDetails.fromResult(speechSynthesisResult);
                System.out.println("CANCELED: Reason=" + cancellation.getReason());

                if (cancellation.getReason() == CancellationReason.Error) {
                    System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
                    System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
                    System.out.println("CANCELED: Did you set the speech resource key and region values?");
                }
            }

        } catch (Exception ex) {
            Log.e("SpeechSDKDemo", "unexpected " + ex.getMessage());
            assert(false);
        }

        System.exit(0);
    }

    //onDestroy
    public void closeSpeech() {
        // Release speech synthesizer and its dependencies
        speechSynthesizer.close();
        speechConfig.close();

    }

}

这里,将密钥和位置改成你自己的,Constants.SPEECH_KEY1, Constants.SPEECH_REGION替换成自己的,Constants.SPEECH_NAME这个是设置语言,代码中我写的是日语,其他的你们自己改。
官方文档将语音合成到文件中

总结一下

在写之前雄心勃勃,要写一篇网上较好的微软语音合成文章,写着写着没劲了!
哈哈哈哈哈哈哈哈哈哈哈哈哈哈红红火火恍恍惚惚 ~哈哈哈哈哈哈哈哈哈

好吧~
该总结一下,只说关键词
1、注册微软账号,Visa信用卡
2、开通语音服务
3、复制示例代码,修改密钥等参数
4、运行搞定

springboot微软文本转语音(texttospeach) java实现微软文本转语音 java实现微软文本转语音 阅读详情

相关推荐

Unity文字转语音(TTS)全攻略:从系统API到Azure云服务实战

文字转语音(TTS)技术通过算法将文本转换为自然语音,其核心原理涉及语音合成与信号处理。这项技术能极大提升应用的可访问性与交互体验,在教育软件、游戏指引、无障碍服务等场景中价值显著。Unity引擎自身未内置TTS功能,开发者需根据项目需求在本地系统API、在线云服务与离线插件等方案间权衡。其中,集成如Azure Cognitive Services等在线云服务,能利用其神经语音合成技术获得极高的语音自然度与丰富控制能力,是实现高品质商业应用的优选。本文以Azure TTS为例,详解了在Unity中集成、实现

weixin_30718391的博客 388

手机当电脑麦克风 linux,快速入门:在 Windows、Linux 或 Android 上运行语音设备 SDK - 语音服务 - Azure Cognitive Services | Micros...

本快速入门介绍如何使用适用于 Linux 的语音设备 SDK 来生成支持语音的产品,或将其用作对话听录设备。 目前,只有 Azure Kinect DK 受支持。该应用程序是使用语音 SDK 程序包和 Eclipse Java IDE (v4) 在 64 位 Linux(Ubuntu 16.04、Ubuntu 18.04、Debian 9、RHEL 7/8、CentOS 7/8)上构建的。 它在 ...

weixin_30010599的博客 1139

Unity毕设实战:基于Azure语音SDK的场景化交互系统开发指南

语音交互作为人机交互的重要演进方向,其核心原理是通过语音识别技术将自然语言转化为机器可理解的指令,再通过自然语言处理技术解析用户意图。这项技术通过降低交互门槛、提升操作效率,在智能家居、虚拟现实、教育娱乐等领域展现出巨大价值。在Unity引擎中集成语音交互功能,能够为虚拟场景赋予更自然的交互体验。本文以Azure Speech SDK为技术工具,结合场景化设计理念,详细讲解如何构建一个支持语音控制的3D交互系统,涵盖从环境搭建、SDK集成到命令分发的完整流程,为开发具有沉浸感的交互应用提供实践参考。

weixin_33739523的博客 329

Balabolka软件调用微软离线自然语音合成进行文字转语音下载安装教程

借助上面这个工具:NaturalVoiceSAPIAdapter,可以把微软的自然语音--NaturalVoice加入到SAPI5里,让第三方应用程序能够通过SAPI5 TTS引擎来调用Windows的自然语音,实现比较拟真的文字转语音。Windows 10用户就不用选了,选下面的EDGE在线语音就行了,Windows 11用户建议也悬赏,毕竟本地部署的自然语音,只有一男一女两种声音,挺单调的。64位的,我建议你也装上,因为安装后,一些系统应用,如讲述人这种,也可以使用EDGE的在线语音服务了。

FL1623863129的博客 5194

MicrosoftWindows.Voice.zh-CN.Xiaoxiao.1-1.0.9.0-x64-cw5n1h2txyewy.Msix

微软离线自然语音包MicrosoftWindows.Voice.zh-CN.Xiaoxiao.1_1.0.9.0_x64__cw5n1h2txyewy.Msix,下载后可以将后缀改成zip进行解压。会用的自然懂

别让运放自激振荡!手把手教你用波特图分析反相放大电路的稳定性(附LTspice仿真)

本文详细解析了运算放大器在反相放大电路中的稳定性问题,通过波特图分析和LTspice仿真,揭示了自激振荡的成因及解决方案。文章从故障现象识别到数学工具应用,再到实战仿真和工程优化,提供了一套完整的稳定性分析工具链,帮助工程师有效避免运放自激振荡问题。

weixin_31682031的博客 303

视频字幕提取:本地 OCR 快速生成 SRT 字幕,video-subtitle-extractor 新手上手指南

你正卡在一堆带硬字幕的视频前:手动敲字幕半小时错别字一大把,在线工具又得逐条上传还担心隐私。video-subtitle-extractor(VSE)是一款免费开源的本地视频硬字幕提取工具:在你电脑上用 OCR 识别视频里的字幕,支持 87 种语言,直接生成标准 SRT 字幕文件,全程不需要申请任何第三方 API。 ## 项目速览 - **是什么**:免费开源(Apache 2.0)的图形界面

gitblog_00704的博客 1020

SOLIDWORKS无法获得下列许可 无效的使用许可号码(-8,544,0) 解决办法大全

SOLIDWORKS无法获得下列许可 无效的使用许可号码(-8,544,0) 解决办法大全。版本:SolidWorks2021。电脑:惠普战66四代。软件安装不困难!

qq_43596278的博客 11万+

3 步跑通 Unity 语音识别:麦克风输入到 Azure 语音 SDK 文本输出的完整流程

本文带你用 Azure 语音 SDK 给 Unity 项目接上麦克风,实现语音转文本(ASR,即把说的话实时转成文字):从拿到凭证、写最小识别代码,到在 Windows、Android、iOS 上跑起来,全程跟着做即可。 ## 为什么值得上语音交互 - **实时响应**:语音指令不需要等界面反馈,角色移动、道具使用这类操作边说边执行。 - **多平台复用**:同一套代码能跑在 PC、移动设备和

gitblog_00142的博客 906

Docker 与容器技术的未来:从 OCI 标准到 eBPF 的演进

OCI 的核心目标是创建一个开放的、厂商中立的容器技术标准。这意味着,只要一个容器镜像符合 OCI 镜像格式规范,它就可以在任何符合 OCI 运行时规范的容器运行时上运行。eBPF 是一种革命性的技术,它允许在 Linux 内核中安全地运行沙盒程序,而无需修改内核源代码或加载内核模块。这些程序可以注册到内核中的各种事件点(如网络包到达、系统调用、函数调用/返回),并在事件发生时执行自定义逻辑。核心思想是:在不将数据复制到用户空间的情况下,程序可以直接在内核中处理数据,极大地提高了效率和性能。

专栏 1383

高云FPGA系列教程(7):ARM GPIO外部中断

高云GN1NSR-4C共有16个GPIO,每个GPIO可配置成输入或输出模式,支持中断输入,触发方式可选择:上升沿、下降沿、高电平、低电平触发。中断优先级可通过NVIC进行设置,支持 0-7 级可编程中断优先级。

whik1194的博客 1375

linecast 架构解析:7 个终端 App 的分层设计与 Live Loop 原理

如果你想在终端里看到天气、潮汐、太阳、月亮、星空和地图,linecast 是一个值得研究的项目——它用纯 Python 在终端中实现了 7 个实时(live)App,无需任何账号或 API key。这篇文章带你深入 linecast 架构:7 个终端 App 各自独立又彼此借用的包结构、严格的 5 层分层规则,以及让所有 App 都"活"起来的 Live Loop 事件驱动原理。不需要读全部源码,

gitblog_00679的博客 342

卫朋:IPD流程落地之产品开发验证阶段解读

IPD验证阶段

产品线负责人 1486

10分钟快速上手:打造个性化Android TTS语音助手

tts-server-android是一款功能强大的Android文本转语音(TTS)应用,它通过插件化架构支持高度自定义的语音合成体验。无论你是普通用户想要更自然的语音朗读,还是开发者希望集成个性化语音功能,这个开源项目都能满足你的需求。 ## 项目概述与价值定位 tts-server-android的核心价值在于它的灵活性和可扩展性。与系统自带的TTS引擎不同,这款应用允许你自由组合多种语

gitblog_01138的博客 718

【2024遥感应用组一等奖】基于风云四号卫星的小时级大气气溶胶和颗粒物监测

最后,比较AGRI观测反射率和查找表计算的反射率反演得到的1小时分辨率AOD数据。然后,使用广泛应用的MODIS DT和DB产品进行对比,图 5显示了它们逐像元尺度的对比,AGRI LaGA算法可以捕捉亚洲地区AOD高低值空间分布格局,比如南亚次大陆、中南半岛、塔克拉玛干沙漠和华北平原是AOD高值区域(平均AOD高于0.3),中国西北、中国南方、中国东北和韩国地区为AOD中值地区(平均AOD在0.2到0.3之间),北纬45度以上以及日本地区为AOD低值区域(平均AOD小于0.2),与全球平均AOD值接近。

JData_Engineer的博客 373

软考中级网络工程师通关指南:从学习到实战

本文是软考中级网络工程师备考实用指南,先介绍备考前准备,包括考试时间、形式、分值等基本信息,及引导读者评估自身基础以制定学习计划;再推荐官方教材、辅导书籍、在线课程平台和学习社区等优质资源。随后梳理网络协议、设备配置、安全、规划设计等重点知识,剖析企业网络故障排查与园区网络设计典型案例。还分享真题使用、解题技巧、错题本建立等习题解答方法,给出分阶段备考、时间安排与总结反思的备考计划,最后提供考场答题顺序、检查及心态调整策略,助力考生高效备考、顺利通关。

邓邓子的博客 1852

【亲测免费】 Azure-Samples/Cognitive-Speech-STT-Android 项目教程

Azure-Samples/Cognitive-Speech-STT-Android 项目教程 1. 项目介绍 Azure-Samples/Cognitive-Speech-STT-Android 是一个开源项目,提供了用于 Android 平台的 Microsoft Speech-to-Text API 的客户端库和示例代码。该项目属于 Microsoft Cognitive Services ...

gitblog_00214的博客 1361

11.8 LangGraph生产级AI Agent开发:从节点定义到高并发架构的终极指南

本文介绍了如何使用 LangGraph 构建生产级 AI Agent,重点解析了 LangGraph 的核心设计、节点与边的实现方法论、生产级实现技巧以及性能优化策略。LangGraph 通过图结构抽象复杂 AI 工作流,核心组件包括节点、边、状态和检查点。节点通过 Python 函数封装原子业务逻辑,边通过条件分支实现动态工作流。生产级实现技巧包括状态管理、多会话控制和错误处理机制。性能优化策略涉及并行执行和缓存机制设计。文章还提供了旅行规划 Agent 的实战案例和常见问题解决方案,帮助开发者构建高效、

yonggeit的博客 3268

必应语音合成android demo,从必应语音迁移到语音服务

您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.从必应语音迁移到语音服务04/03/2020本文内容本文介绍了如何将应用程序从必应语音 API 迁移到语音服务。本文概述了必应语音 API 与语音服务之间的区别,并就应用程序的迁移建议了策略。 必应语音 API 订阅密钥对语...

weixin_39791386的博客 186

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Unity集成Azure语音识别:跨平台语音交互开发实战指南

语音识别作为人机交互的核心技术,其原理是将音频信号转换为可处理的文本信息,依赖于声学模型和语言模型的协同工作。这项技术的价值在于为应用注入自然的听觉能力,极大提升了交互效率和沉浸感,尤其适用于游戏开发、虚拟培训、无障碍应用等场景。通过集成云端语音服务,开发者无需从零训练模型,即可获得高准确率、多语言支持的企业级识别能力。本文以Unity引擎和Azure Speech SDK为例,详细解析了如何实现跨平台的实时语音识别,涵盖了从Azure资源创建、SDK集成、核心代码实现到高级功能优化的完整流程,并重点探讨了

weixin_29014939的博客 351

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Unity AI Chat Toolkit语音唤醒功能实现:Windows平台关键词识别教程

Unity AI Chat Toolkit是一款强大的工具库,专为Unity开发者打造,集成了对ChatGPT、ChatGLM等大语言模型的API调用,以及微软Azure和百度AI的语音服务功能。本文将详细介绍如何在Windows平台上实现该工具包的语音唤醒功能,让你的应用能够通过关键词识别快速响应用户指令。 ## 语音唤醒功能概述 🎤 语音唤醒,也称为关键词识别,是指应用程序在后台持续监听

gitblog_01166的博客 1032

从零开始使用tts-server-android:5分钟快速搭建专业TTS服务

还在为Android设备上缺乏高质量的TTS(Text-to-Speech,文本转语音)服务而烦恼吗?tts-server-android只需5分钟就能为您搭建专业的语音合成服务!本文将带您快速上手这个强大的开源项目。 ## 🚀 快速开始 ### 第一步:安装应用 下载最新版本的APK文件并安装到Android设备。应用提供了丰富的TTS功能配置,包括微软Azure接口调用、自定义HTTP请

gitblog_00065的博客 1336

Azure SDK for Android:项目的核心功能/场景

Azure SDK for Android:项目的核心功能/场景 Azure SDK for Android 是一个专门为 Android 应用程序开发人员设计的软件开发工具包(SDK),旨在帮助开发者轻松地在他们的应用程序中集成 Azure 服务,如 Azure Communication Services、Azure Cognitive Services 等。 项目介绍 Azure SDK f...

gitblog_00892的博客 755

如何快速打造个性化语音系统:tts-server-android完全指南

你是否曾经想过,在Android设备上拥有一个功能强大、高度可定制的文本转语音系统?tts-server-android正是这样一个开源项目,它能让你轻松实现个性化语音体验。作为一款Android系统TTS应用,它不仅内置微软演示接口,还支持自定义HTTP请求,甚至可以导入其他本地TTS引擎,让你的设备"开口说话"变得更加智能和有趣! ## 📱 项目介绍与核心价值 tts-server-an

gitblog_00425的博客 473

Unity AI Chat Toolkit实时语音聊天实现:从零到一的完整项目搭建

**Unity AI Chat Toolkit** 是一个专为Unity开发者设计的强大工具包,用于快速实现AI聊天相关功能。这个工具库集成了多种大语言模型的API调用,并实现了微软Azure、百度AI等主流语音服务的完整接入方案,支持Windows、WebGL、Android等多个平台。 ### 为什么选择Unity AI Chat Toolkit? 对于想要在Unity项目中集成AI聊天功

gitblog_00083的博客 647

5步配置多语言语音引擎:让你的Android设备开口说话

你是否曾经想过,让手机为你朗读电子书、播报新闻,甚至用不同语言为你讲述故事?现在,通过这款强大的Android语音合成应用,你只需要简单几步就能实现这一切。 想象一下这样的场景:你在通勤路上想要听一本英文小说,但眼睛需要休息;或者你需要准备多语言演讲,希望听到不同语言的发音效果。这款应用正是为这些需求而生,它集成了微软云端语音、本地TTS引擎、自定义HTTP接口等多种语音合成方案,让你随时随地享

gitblog_00996的博客 935
上一篇: 完美解决None of the following candidates is applicable because of receiver type mismatch:
下一篇: 关于Android 11、12和13服务保活问题
小红妹
博客等级 码龄10年 151粉丝 116原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值