深度学习系列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;…

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 观…

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

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

爱思助手验机不靠谱?

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

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

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

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

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

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连接…

明渠流量监测站—实时监测明渠中水流流量和水位

TH-ML2明渠流量监测站是一种专门用于实时监测明渠中水流流量和水位等参数的设施。它通常设置在河流、渠道或其他开放水流明渠中&#xff0c;旨在收集、记录和汇总水流数据&#xff0c;为水利管理部门、研究机构和其他相关方提供决策支持。 明渠流量监测站的工作涉及多个关键步骤…

Go——map操作及原理

一.map介绍和使用 map是一种无序的基于key-value的数据结构&#xff0c;Go语言的map是引用类型&#xff0c;必须初始化才可以使用。 1. 定义 Go语言中&#xff0c;map类型语法如下&#xff1a; map[KeyType]ValueType KeyType表示键类型ValueType表示值类型 map类型的变量默认…

Altair-一个被名字耽误的超强交互式可视化库

今天的推文我们介绍一个功能很强,但知名度不如Matplotlib、pyecharts等静态或者交互式可视化库-Altair。Altair是基于Vega和Vega-Lite的Python数据统计可视化库&#xff0c;其优秀的交互、数据统计功能和清新的配色&#xff0c;很难让人用过就忘记(唯一不好就是名字太难记啦!)。…

2024年的黑马项目,在视频号上开小店,这个机会不容错过!

大家好&#xff0c;我是电商小布。 在互联网的快速发展下&#xff0c;电商这一行可以说是展现出来了前所未有的生机。 也造就了越来越多项目的产生&#xff0c;视频号小店就是其中之一。 有人说&#xff0c;就今年的各大项目情况来看&#xff0c;视频号小店无疑是最大的黑马…

jsp将一个文本输入框改成下拉单选框,选项为字典表配置,通过后端查询

一&#xff0c;业务场景&#xff1a; 一个人员信息管理页面&#xff0c;原来有个最高学历是文本输入框&#xff0c;可以随意填写&#xff0c;现在业务想改成下拉单选框进行规范化&#xff0c;在专科及以下、本科、研究生三个选项中选择&#xff1b; 二&#xff0c;需要解决问…

【Linux】 gcc(linux下的编译器)程序的编译和链接详解

目录 前言&#xff1a;快速认识gcc 1. 程序的翻译环境和执行环境 2.编译和链接 2.1翻译环境 2.2编译环境 1. 预处理 gcc -E指令 test.c&#xff08;源文件&#xff09; -o test.i&#xff08;生成在一个文件中&#xff0c;可以自己指定&#xff09; 预处理完成之后就停下来&am…

LeetCode 1027——最长等差数列

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 假设我们以 f[d][nums[i]]表示以 nums[i] 为结尾元素间距为 d 的等差数列的最大长度&#xff0c;那么&#xff0c;如果 nums[i]-d 也存在于 nums 数组中&#xff0c;则有&#xff1a; f [ d ] [ n u m s [ i ] ] …

解决vim中NERDTree图标是问号或者乱码问题

解决vim中NERDTree图标是问号或者乱码问题 乱码信息如图解决办法1. 安装字体下载字体安装字体Ubuntu系统Windows11系统 2. 控制台修改字体Ubuntu系统Windows11系统 乱码信息如图 Ubuntu系统上的情况 使用windows控制台连接的情况 解决办法 1. 安装字体 下载字体 在nerd f…

51单片机学习9 串口通讯

51单片机学习9 串口通讯 一、串口通讯简介UARTSTC89C51RC/RD的串口资源 二、51单片机串口介绍1. 内部结构2. 寄存器&#xff08;1&#xff09;串口控制寄存器SCON&#xff08;2&#xff09;电源控制寄存器PCON 3. 计算波特率4. 串口配置步骤 三、 开发示例1. 硬件电路2. 代码实…