深度学习系列63:tts和智能语音助手

1. tts

使用sherpa的参考代码如下

import soundfile as sf
import sherpa_onnx
def write(text,output_filename,sid=10,provider='cpu'):tts_config = sherpa_onnx.OfflineTtsConfig(model=sherpa_onnx.OfflineTtsModelConfig(vits=sherpa_onnx.OfflineTtsVitsModelConfig(model='vits-aishell3.onnx',lexicon='lexicon.txt',tokens='tokens.txt',),provider=provider),max_num_sentences=2,)audio = sherpa_onnx.OfflineTts(tts_config).generate(text, sid=sid)sf.write(output_filename,audio.samples,samplerate=audio.sample_rate,subtype="PCM_16",)

使用edge-tts(微软家的,需要联网)的示例代码如下:

#import edge_tts,os,asyncio,sys
import sys
from pydub import AudioSegment,playback
#async def read(text):
#    tts = edge_tts.Communicate(text=text, voice='zh-CN-YunxiNeural',rate = '+5%')
#    if 'temp.mp3' in os.listdir('.'):
#    	os.system("rm temp.mp3")
#    await tts.save(text+".mp3")#asyncio.run(read(sys.argv[1]))
playback.play(AudioSegment.from_mp3(sys.argv[1]+'.mp3'))

2. 使用python制作智能语音助手

import soundfile as sf
import whisper,pyaudio,wave,os,warnings,time,torch,sherpa_onnx
from pydub import AudioSegment,playback
from transformers import AutoModelForCausalLM, AutoTokenizer
from autogen import OpenAIWrapper
client = OpenAIWrapper(api_key="NULL", base_url="http://localhost:2600/v1", api_type="open_ai")
warnings.filterwarnings('ignore') 
model = whisper.load_model("medium")import soundfile as sf
import sherpa_onnx
def write(text,output_filename,sid=10,provider='cpu'):tts_config = sherpa_onnx.OfflineTtsConfig(model=sherpa_onnx.OfflineTtsModelConfig(vits=sherpa_onnx.OfflineTtsVitsModelConfig(model='vits-aishell3.onnx',lexicon='lexicon.txt',tokens='tokens.txt',),provider=provider),max_num_sentences=2,)audio = sherpa_onnx.OfflineTts(tts_config).generate(text, sid=sid)sf.write(output_filename,audio.samples,samplerate=audio.sample_rate,subtype="PCM_16",)def asr(filename):os.system('ffmpeg -i %s -af silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-30dB -ac 1 -ar 16000 %s'%(filename,'trans_'+filename))res = "".join(os.popen('whisper.cpp/main -m /Users/czhang39/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/d15393806e24a74f60827e23e986f0c10750b358/ggml-large-v2.bin -np -nt -l zh --prompt 你好小特,以下是普通话。 -f %s'%('trans_'+filename)).readlines()).replace('\n','')os.system('rm %s'%filename)os.system('rm %s'%('trans_'+filename))return resdef write(text,output_filename,sid=10,provider='cpu'):tts_config = sherpa_onnx.OfflineTtsConfig(model=sherpa_onnx.OfflineTtsModelConfig(vits=sherpa_onnx.OfflineTtsVitsModelConfig(model='vits-aishell3.onnx',lexicon='lexicon.txt',tokens='tokens.txt',),provider=provider),#rule_fsts=args.tts_rule_fsts,max_num_sentences=2,)if not tts_config.validate():raise ValueError("Please check your config")tts = sherpa_onnx.OfflineTts(tts_config)start = time.time()audio = tts.generate(text, sid=sid)end = time.time()if len(audio.samples) == 0:print("Error in generating audios. Please read previous error messages.")returnelapsed_seconds = end - startaudio_duration = len(audio.samples) / audio.sample_ratereal_time_factor = elapsed_seconds / audio_durationsf.write(output_filename,audio.samples,samplerate=audio.sample_rate,subtype="PCM_16",)def wakeup(seconds = 2):chunk = 1024  # Record in chunks of 1024 samplessample_format = pyaudio.paInt16  # 16 bits per samplechannels = 1fs = 44100  # Record at 44100 samples per secondfilename = "output.wav"p = pyaudio.PyAudio()  # Create an interface to PortAudiostream = p.open(format=sample_format,channels=channels,rate=fs,frames_per_buffer=chunk,input=True)frames = [] for i in range(0, int(fs / chunk * seconds)):data = stream.read(chunk)frames.append(data)# Stop and close the stream stream.stop_stream()stream.close()# Terminate the PortAudio interfacep.terminate()wf = wave.open(filename, 'wb')wf.setnchannels(channels)wf.setsampwidth(p.get_sample_size(sample_format))wf.setframerate(fs)wf.writeframes(b''.join(frames))wf.close()result = model.transcribe(filename,language='zh',initial_prompt='你好, 以下是普通话')#result=asr(filename)return result['text']def read(text):write(text,'reply.wav',10)playback.play(AudioSegment.from_mp3('reply.wav'))os.environ['TOKENIZERS_PARALLELISM']='false'
activated = 0
waiting_time = 5
while 1:text = wakeup()if activated>1:if 20>len(text)>1:print(text)#reply = llm_model.chat(tokenizer,text)[0]response = client.create(messages=[{"role": "user", "content": "<用户>%s<AI>"%text}], model="guff")reply = client.extract_text_or_completion_object(response)[0]print(reply)read(reply)activated = 5else:activated-=1print(activated)elif '小特' in text:print('activated')activated = waiting_timeread('你好啊!我被唤醒了')elif activated==1:read('你好啊!再见')print('sleep')activated = 0

3. 使用C++代码

使用whisper.cpp的command代码,修改部分如下:

  1. 第559行,修改唤醒词:std::string k_prompt = "自定义唤醒词";
  2. 第607行,增加唤醒后的处理代码:std::system("python read.py 我在");
  3. 第664行开始,自定义待机/关机/活跃状态的代码:
                        if (command=="待机"){fprintf(stdout,"好的!");std::system("python read.py 好的");ask_prompt = true;}else if (command=="退出"){fprintf(stdout,"下次再见!");std::system("python read.py 下次再见");is_running = false;}else{char str3[strlen(command.c_str())+30];sprintf(str3, "%s%s%s", "python chat.py \"", command.c_str(),"\"");std::system(str3);}

接下来是调用tts和本地大模型的python代码:

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

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

相关文章

软件测试工作规范、流程规范

1. 制定规则 为了规范测试工作、减少开发与测试之前的沟通成本、保证项目进度、提高软件质量&#xff0c;测试组起草了这份软件测试工作规范。 1.1. 编码规范 软件程序开发需要遵守编码规范&#xff0c;一是可以减少代码的维护成本&#xff0c;提高开发工作效率&#xff1b;…

商标和品牌的区别是什么

商标和品牌是两个不同的概念&#xff1a; 商标是一个法律概念&#xff0c;指的是商家在市场竞争中使用的标识&#xff0c;可以是词、图形、数字、颜色、三维标记等。商标的主要作用是让消费者更容易地识别出产品或服务的来源&#xff0c;并保障商家的知识产权。 品牌则是一个…

【明道云】明道云主从表中计算列的即时重算问题

【背景】 使用场景下&#xff0c;往往存在一些不需要录入的计算列。但是用户希望变更计算要素时&#xff0c;相应的列也能立即重算&#xff0c;类似于Excel中公式的效果。 【问题】 通过字段默认值用函数设置&#xff0c;可以达到如上效果&#xff0c;但是在复杂场景下存在限…

广义表的深度与长度

1.广义表的长度和深度 1.长度&#xff1a;广义表的长度是指广义表中第一层所含的元素个数&#xff0c;包括原子和子表。 理解&#xff1a;广义表的长的也就是最外层的括号中包含的元素的个数 2.深度&#xff1a;广义表的深度是指广义表中括号的最大层数&#xff0c;即最大嵌套…

centos7 如何安装UI

CentOS 7 带有 GNOME 3 桌面环境&#xff0c;可以通过以下步骤启用&#xff1a; 确认系统已安装 GNOME 桌面环境&#xff1a;在终端中输入以下命令并按回车键&#xff1a; 复制 rpm -q gnome-desktop3如果输出结果中显示 "gnome-desktop3-3.x.x-x.el7.x86_64"&#…

Chrome 插件 storage API 解析

Chrome.storage API 解析 使用 chrome.storage API 存储、检索和跟踪用户数据的更改 一、各模块中的 chrome.storage 内容 1. Service worker 中 runtime 内容 2. Action 中 runtime 内容 3. Content 中 runtime 内容 二、权限&#xff08;Permissions&#xff09; 如果需使…

2024 年学习 AI 路线图

2024 年学习 AI 路线图 一、数学二、工具2.1 Python2.2 PyTorch 三、机器学习3.1 从头开始编写3.2 参加比赛3.3 做副业项目3.4 部署模型3.5 补充材料 四、深度学习4.1 fast.ai4.2 多参加一些比赛4.3 论文实现4.4 计算机视觉4.5 强化学习4.6 自然语言处理 五、大型语言模型5.1 观…

mysql 用户管理-权限表

学习了《mysql5.7安装》&#xff0c;就先再了解下用户管理&#xff0c;先了解下权限表。 MySQL是一个多用户数据库&#xff0c;具有功能强大的访问控制系统&#xff0c;可以为不同用户指定允许 的权限。MySQL用户可以分为普通用户和root用户。root 用户是超级管理员,拥有所有权…

加密技术解析:对称加密、非对称加密与国密算法

文章目录 一、对称加密1.1 综述1.2 AES 算法详解 二、非对称加密2.1 综述2.2 RSA 算详解 三、国密四、总结 在当今数字化世界中&#xff0c;加密技术在保护数据安全和隐私方面发挥着重要作用。本文将详细探讨对称加密、非对称加密以及国密算法的原理和实现&#xff0c;帮助读者…

SpringBoot国际化配置流程(超详细)

前言 最新第一次在做SpringBoot的国际化&#xff0c;网上搜了很多相关的资料&#xff0c;都是一些简单的使用例子&#xff0c;达不到在实际项目中使用的要求&#xff0c;因此本次将结合查询的资料以及自己的实践整理出SpringBoot配置国际化的流程。 SpringBoot国际化 "i…

爱思助手验机不靠谱?

1.骗子只能骗的一种人就是有点懂 因为完全不懂的不会感兴趣 骗不到 太懂的人 基本属于猴精的人 你骗不到 2. 3.基本做的是翻新机 维修过的 4。转载 爱思助手验机不靠谱&#xff1f;“报告全绿”已成奸商的阴谋 - 知乎

单片机通俗一点讲究竟是个什么东西?

单片机就是一个微型电脑&#xff0c;它是靠程序工作的&#xff0c;并且可以修改。通过不同的程序实现不同的功能。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信…

智慧公厕四大核心能力,赋能城市公共厕所智能化升级

公共厕所是城市基础设施中不可或缺的一部分&#xff0c;但由于传统的公共厕所在建设与规划上&#xff0c;存在一定的局限性&#xff0c;导致环境卫生差、管理难度大、使用体验不佳等问题&#xff0c;给市民带来了很多不便。而智慧公厕作为城市智能化建设的重要组成部分&#xf…

(枚举类)及其实现

1.概述 枚举类型本质上也是一种类&#xff0c;只不过这个类的对象是有限的、固定的几个&#xff0c;不能让用户随意创建.例如 : 星期 : Monday Tuesday ... Sunday 三原色 : red green blue若枚举类只有一个对象&#xff0c;则可以作为单例模式的一种实现方法. 2.实现 (1…

2024年阿里云服务器8核16G配置活动价格分享,最低仅需1803.17元1年

阿里云服务器8核16G配置2024年活动价格是多少&#xff1f;具体配置还需要看想要购买的云服务器实例规格和配置及带宽大小&#xff0c;目前在阿里云2024年活动中&#xff0c;8核16G配置价格最低的是通用算力型u1实例&#xff0c;价格只要1803.17元1年&#xff0c;除此之外&#…

JAVA------基础篇

java基础 1.JDK JDK :java development kit JRE&#xff1a;java runtime environment JDK包含JRE java跨平台&#xff1a;因为java程序运行依赖虚拟机&#xff0c;虚拟机需要有对应操作系统的版本&#xff0c;而jre中有虚拟机。 当你想要在Linux系统下运行&#xff0c;则需要…

轻松管理你的热点函数!

之前&#xff0c;我们介绍了卡顿分析下的卡顿帧汇总功能&#xff0c;以便开发者能够更精准地定位和归因项目的卡顿现象。本周&#xff0c;我们将继续介绍本次版本更新的新功能&#xff0c;从函数CPU耗时、资源管理等角度&#xff0c;帮助开发者更细致地洞察项目性能问题&#x…

TCPView下载安装使用教程(图文教程)超详细

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;更多干货&#xff0c;请关注专栏《网络安全自学教程》 TCPView是微软提供的一款「查看网络连接」和进程的工具&#xff0c;常用来查看电脑上的TCP/UDP连接…

九宫重排介绍

九宫重排&#xff0c;又称为八数码问题或滑块拼图&#xff0c;是一种经典的数字游戏和算法问题。这个游戏是在一个3x3的方格棋盘上进行的&#xff0c;其中包含1到8的八个数字和一个空白方格。游戏的目标是通过滑动数字块来重新排列这些数字&#xff0c;使其达到预定的顺序或目标…

BTM树立了投资新纪元的标杆 融合安全性、稳定性

2024年3月25日&#xff0c;马来西亚 - BTM 是领先的投资平台&#xff0c;提出一种全新融合安全性、稳定的方式。BTM 坚守增强投资者信心的承诺&#xff0c;运用前沿科技和由 AI 驱动的算法策略&#xff0c;以及实现快速服务的能力&#xff0c;助力投资者自信地应对市场的不断变…