25.6.29增加Gummy 实时/一句话语音识别
25.6.28增加Qwen TTS本地音频和实时播报

背景

准备环境

MacOS M1电脑(其他M系列芯片也可以)

为了方便python的使用环境,使用Miniconda:下载链接:Download Anaconda Distribution | Anaconda

安装阿里模型的依赖库:https://bailian.console.aliyun.com/?tab=api#/doc/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2712193.html%23f3e80b21069aa

为了配置环境变量:https://bailian.console.aliyun.com/?tab=api#/doc/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2803795.html

 

为了方便编辑代码,下载安装最流行的:vscode,最新版本已经有了Github Copilot免费用,记得要打开。

 为了解决使用了Miniconda的python环境,导致vscode自带的运行环境找不到dashscope出错的问题;

  • 按下 Cmd+Shift+P,输入并选择 Python: Select Interpreter
  • 选择你用 miniconda 安装 dashscope 的那个环境(比如 miniconda3/envs/xxx)。
  • 右下角状态栏会显示当前环境。
  • 验证:which python

Gummy-ASR

实时识别

一句话识别

官方demo,未修改;

原理:程序启动时,会开始录音;录音结束判停:经过查看代码,和日志查看,由云端判定的),一分钟音频是上限。

# For prerequisites running the following sample, visit https://help.aliyun.com/document_detail/xxxxx.html
# 一句话识别能够对一分钟内的语音数据流(无论是从外部设备如麦克风获取的音频流,还是从本地文件读取的音频流)进行识别并流式返回结果。import pyaudio
import dashscope
from dashscope.audio.asr import *# 若没有将API Key配置到环境变量中,需将your-api-key替换为自己的API Key
# dashscope.api_key = "your-api-key"mic = None
stream = Noneclass Callback(TranslationRecognizerCallback):def on_open(self) -> None:global micglobal streamprint("TranslationRecognizerCallback open.")mic = pyaudio.PyAudio()stream = mic.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True)def on_close(self) -> None:global micglobal streamprint("TranslationRecognizerCallback close.")stream.stop_stream()stream.close()mic.terminate()stream = Nonemic = Nonedef on_event(self,request_id,transcription_result: TranscriptionResult,translation_result: TranslationResult,usage,) -> None:print("request id: ", request_id)print("usage: ", usage)if translation_result is not None:print("translation_languages: ",translation_result.get_language_list(),)english_translation = translation_result.get_translation("en")print("sentence id: ", english_translation.sentence_id)print("translate to english: ", english_translation.text)if english_translation.vad_pre_end:print("vad pre end {}, {}, {}".format(transcription_result.pre_end_start_time, transcription_result.pre_end_end_time, transcription_result.pre_end_timemillis))if transcription_result is not None:print("sentence id: ", transcription_result.sentence_id)print("transcription: ", transcription_result.text)callback = Callback()translator = TranslationRecognizerChat(model="gummy-chat-v1",format="pcm",sample_rate=16000,transcription_enabled=True,translation_enabled=True,translation_target_languages=["en"],callback=callback,
)
translator.start()
print("请您通过麦克风讲话体验一句话语音识别和翻译功能")
while True:if stream:data = stream.read(3200, exception_on_overflow=False)if not translator.send_audio_frame(data):print("sentence end, stop sending")breakelse:breaktranslator.stop()

Qwen-TTS

非实时TTS

将生成的音频,保存到本地。文档见https://bailian.console.aliyun.com/?tab=doc#/doc/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2879134.html&renderType=iframe

修复了tts请求时,response出错的情况(比如API_KEY不对)

import os
import requests
import dashscopetext = "那我来给大家推荐一款T恤,这款呢真的是超级好看,这个颜色呢很显气质,而且呢也是搭配的绝佳单品,大家可以闭眼入,真的是非常好看,对身材的包容性也很好,不管啥身材的宝宝呢,穿上去都是很好看的。推荐宝宝们下单哦。"
response = dashscope.audio.qwen_tts.SpeechSynthesizer.call(model="qwen-tts",api_key=os.getenv("DASHSCOPE_API_KEY"),text=text,voice="Cherry",
)# ====== 开始检查 response 是否有效 ======
print(response)
if not hasattr(response, 'output') or response.output is None:print("响应中没有 output 字段,请检查权限或模型是否开通")exit()if not hasattr(response.output, 'audio') or response.output.audio is None:print("响应中没有 audio 数据,请检查返回内容")exit()if not hasattr(response.output.audio, 'url'):print("响应中 audio 没有 url 字段,请检查返回结构")exit()# ====== 结束检查 response 是否有效 ======audio_url = response.output.audio["url"]save_path = "downloaded_audio.wav"  # 自定义保存路径try:response = requests.get(audio_url)response.raise_for_status()  # 检查请求是否成功with open(save_path, 'wb') as f:f.write(response.content)print(f"音频文件已保存至:{save_path}")
except Exception as e:print(f"下载失败:{str(e)}")

问题1:pip install pyaudio失败

解决方案:

(1)先安装brew:/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)",重启

(2)再安装brew install portaudio

(3)再安装pip install pyaudio

生成的TTS音频文件,放到了本地。适合音频生成离线播报场景,比如PPT。

不适合实时的语音交互,我们需要实时TTS。

实时TTS

按照官方demo跑就好。

我们把实时TTS封装成函数api,并提供了api测试demo;

函数封装代码:qwen_play_tts.py

# coding=utf-8import os
import dashscope
import pyaudio
import time
import base64
import numpy as npdef qwen_play_tts(text, voice="Ethan", api_key=None):"""使用通义千问 TTS 进行流式语音合成并播放:param text: 合成文本:param voice: 发音人:param api_key: Dashscope API Key(可选,默认读取环境变量)"""api_key = api_key or os.getenv("DASHSCOPE_API_KEY")if not api_key:raise ValueError("DASHSCOPE_API_KEY is not set.")p = pyaudio.PyAudio()stream = p.open(format=pyaudio.paInt16,channels=1,rate=24000,output=True)responses = dashscope.audio.qwen_tts.SpeechSynthesizer.call(model="qwen-tts",api_key=api_key,text=text,voice=voice,stream=True)for chunk in responses:audio_string = chunk["output"]["audio"]["data"]wav_bytes = base64.b64decode(audio_string)audio_np = np.frombuffer(wav_bytes, dtype=np.int16)stream.write(audio_np.tobytes())time.sleep(0.8)stream.stop_stream()stream.close()p.terminate()# 示例调用
if __name__ == "__main__":sample_text = "你好,这是一段测试语音。"qwen_play_tts(sample_text)

api测试代码:qwen_api_test.py

from qwen_play_tts import qwen_play_ttsqwen_play_tts("这是一个函数调用测试。")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86837.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86837.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86837.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB安全--Java安全--jsp webshell免杀1

1.1、BCEL ClassLoader 介绍(仅适用于BCEL 6.0以下): BCEL(Apache Commons BCEL™)是一个用于分析、创建和操纵Java类文件的工具库;BCEL的类加载器在解析类名时会对ClassName中有$$BCEL$$标识的类做特殊处…

Valkey与Redis评估对比:开源替代方案的技术演进

#作者:朱雷 文章目录 1 概述1.1内存数据结构存储核心特性1.2主流内存数据结构存储设计与适用场景1.3目前主流内存数据结构存储对比 2 Valkey 说明2.1 哨兵架构设计2.2 集群架构设计2.3 valkey 使用企业和业内生态‌ 3 评估指标4 评估结果 1 概述 内存数据结构存储…

华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio安装NoteGen AI笔记应用程序

华为云FlexusDeepSeek征文 | 基于华为云ModelArts Studio安装NoteGen AI笔记应用程序 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、NoteGen介绍NoteGen简介主要特点 三、安装NoteGen工具下载NoteGen软件安装NoteGen工具 四、开通…

BUUCTF在线评测-练习场-WebCTF习题[BJDCTF2020]Easy MD51-flag获取、解析

解题思路 打开靶场,有个提交框,输入后url会出现我们提交的参数password http://a48577ed-9a1c-4751-aba0-ae99f1eb8143.node5.buuoj.cn:81/leveldo4.php?password123 查看源码并没用发现什么猫腻,抓包在响应头发现了猫腻 hint: select * …

面向对象三大特性深度解析:封装、继承与多态

面向对象三大特性深度解析:封装、继承与多态 思维导图概览 #mermaid-svg-v2u0XIzKotjyXYei {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-v2u0XIzKotjyXYei .error-icon{fill:#552222;}#mermaid-svg-v2…

mmap映射物理内存之三invalid cache

目录 流程设计 invalid 命令 内核态invalid 内核态invalid,用户态mmap物理地址 PAN机制 PAN机制历程 硬件支持 ARMv8.1-PAN 特性 Linux 内核的适配 软件模拟 PAN(SW PAN) 背景 Linux 的实现 总结 前述刷新cache的流程也同样可…

记忆化搜索(dfs+memo)无环有向图

这是一道可以当作板子的极简记忆化搜索 建立a 是邻接表,其中 a[x] 存储从节点 x 出发能到达的所有节点。 b[x] 记录从节点 x 出发的所有边的权重之和。根据数学原理,我们很容易发现,一个根(起点)的期望,等…

使用AI豆包写一个车辆信息管理页面

记录一个基本的车辆信息管理页面,由豆包撰写完成,只需要微调页面即可。 主要功能是车辆信息的查询、新增、编辑,项目用到了uniapp、vue3、ts、uni-ui、z-paging 页面效果如下: 以上界面均由豆包生成,完成度非常高&am…

《HarmonyOSNext应用防崩指南:30秒定位JS Crash的破案手册》

《HarmonyOSNext应用防崩指南:30秒定位JS Crash的破案手册》 ##Harmony OS Next ##Ark Ts ##教育 本文适用于教育科普行业进行学习,有错误之处请指出我会修改。 💥 哇哦!JS Crash崩溃日志完全解析手册 当你的应用突然闪退时&am…

阅读笔记(3) 单层网络:回归(下)

阅读笔记(3) 单层网络:回归(下) 该笔记是DataWhale组队学习计划(共度AI新圣经:深度学习基础与概念)的Task03 以下内容为个人理解,可能存在不准确或疏漏之处,请以教材为主。 1. 为什么书上要提到决策理论? …

Mac OS系统每次开机启动后,提示:输入密码来解锁磁盘“Data”,去除提示的解决方法

问题描述: Mac mini外接了一个磁盘(EX_Mac)为默认使用的系统盘,内置的硬盘(Macintosh HD)为Mac mini自带的系统盘 外置硬盘系统每次开机都会挂载内置磁盘,同时会提示需要输入密码来解锁磁盘“…

CSS Flex 布局中flex-shrink: 0使用

flex-shrink: 0 是 CSS Flexbox 布局中的一个关键属性,用于禁止弹性项目(flex item)在容器空间不足时被压缩。以下是详细解释和示例: 核心作用 当容器的可用空间小于所有弹性项目的总宽度(或高度)时&#…

WHERE 子句中使用子查询:深度解析与最佳实践

🔍 WHERE 子句中使用子查询:深度解析与最佳实践 在 WHERE 子句中使用子查询是 SQL 的高阶技巧,可实现动态条件过滤。以下是全面指南,涵盖语法、类型、陷阱及优化策略: 📜 一、基础语法结构 SELECT 列 FR…

从0到1:不文明现象随手拍小程序开发日记(一)

前期调研 不文明现象随手拍小程序:在城市的快速发展进程中,不文明现象时有发生,为了有效解决这一问题,提升城市文明程度, 市民若发现不文明行为,如乱扔垃圾、随地吐痰、破坏公共设施、违规停车等&#xff…

STM32F103之SPI软件读写W25Q64

一、W25Q64简介 1.1 简介 W25Q64(Nor flash)、 24位地址,64Mbit/8MByte、是一种低成本、小型化、使用简单的非易失性存储器,常用于数据存储、字库存储、固件程序存储等场景 时钟频率:最大80MHz(STM32F103系统时钟为72MHz…

vue3+element-plus 组件功能实现 上传功能

一、整体功能概述 这段代码实现了一个基于 Vue 3 和 Element Plus 组件库的文件导入及预览功能模块。主要包含了一个主导入对话框(用于上传文件、展示文件相关信息、进行导入操作等)以及一个用于预览文件内容的预览对话框。支持导入特定格式(…

OpenCV中创建Mat对象

第1章 创建Mat对象 1.1. 创建空的 Mat 对象 cv::Mat mat; 1.2. 创建灰度图像 // 创建一个 3 行 4 列、8位无符号单通道矩阵(相当于灰度图) cv::Mat mat(3, 4, CV_8UC1); 1.3. 创建彩色图像 // 创建三通道矩阵(相当于彩色图像&#xff0…

10、做中学 | 五年级下期 Golang循环控制

一、一个小需求 我想要打印10遍hello world,你想怎么编写呢? // 需求:打印10遍"hello world"fmt.Println("hello world")fmt.Println("hello world")fmt.Println("hello world")fmt.Println("hello world…

机器学习算法-K近邻算法-KNN

1. K近邻算法是什么? 定义: K近邻是一种基于实例的懒惰学习(Lazy Learning)算法,用于分类和回归任务。 核心思想:“物以类聚”——通过计算样本间的距离,找到目标点的最近K个邻居,…

基于vue框架的法律知识咨询普及系统gwuv7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,知识类型,律师,律师推荐,法律知识,新闻类型,法律新闻,咨询律师 开题报告内容 基于Vue框架的法律知识咨询普及系统开题报告 一、研究背景与意义 随着法治社会建设的深入推进,公众对法律知识的需求呈现爆发式增长。然而…