深度学习系列67:制作聊天机器人

1. 基本思路

基于whisper.cpp的examples/command,代码修改如下:

  1. 第13行,增加python依赖:#include </miniconda3/include/python3.11/Python.h>
  2. 第559行,修改唤醒词:std::string k_prompt = "自定义唤醒词";
  3. 第607行,增加唤醒后的处理代码:std::system("python read.py 我在");
  4. 第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);
                        }

2. 语音部分

接下来是tts部分的python脚本,包括
read.py:读wav文件
write.py:写文本到wav文件
chat.py:生成聊天对话并read

## chat.py。 需要起一个本地的llm服务
import read
import requests, sys, edge_tts,os,asyncio
from pydub import AudioSegment,playback
url = 'http://localhost:8080/v1/chat/completions'
def send_message(message):
    headers = {"Content-Type": "application/json"}
    data = {
        "model": "MiniCPM",
        "messages": [
            {"role": "system", "content": "你是一个助理,名字叫小特,正在和用户对话。尽量简短回复,不超过50字。"},
            {"role": "user", "content": f"{message}"}
        ]
    }
    response = requests.post(url, headers=headers, json=data, verify=False)
    if response.status_code == 200:
        return response.json()["choices"][0]["message"]['content']
    else:
        return "我没有听清"
        
command = sys.argv[1]
if "播放" in command:
    os.system("pkill -9 ffplay")
    file = command.split("播放")[-1]
    if file+".mp3" in os.listdir("music/"):
        os.popen("ffplay -autoexit -i music/"+file+".mp3&")
    else:
        read("本地没有找到音乐"+file)
        playback.play(AudioSegment.from_mp3('temp.mp3'))
else:
    if len(command)>1:
        resp = send_message(command)
        print(resp)
        if resp != "我没有听清":
            os.system("pkill -9 ffplay")
            read(resp)
            playback.play(AudioSegment.from_mp3('temp.mp3'))

接下来是read.py和write.py,这里使用sherpa

## write.py
import soundfile as sf
import sherpa_onnx,sys
def write(text,output_filename,sid=10,provider='cpu'):
    tts_config = sherpa_onnx.OfflineTtsConfig(
        model=sherpa_onnx.OfflineTtsModelConfig(
            vits=sherpa_onnx.OfflineTtsVitsModelConfig(
                model='tts/vits-aishell3.onnx',
                lexicon='tts/lexicon.txt',
                tokens='tts/tokens.txt'
            ),
            provider=provider
        ),
        rule_fsts='tts/number.fst',
        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",
    )
    
write(sys.argv[1],sys.argv[1]+'.wav')
## read.py
import write,sys,os
from pydub import AudioSegment,playback
def read(text):
   if 'temp.wav' in os.listdir('.'):
    	os.system("rm temp.wav")
   write(sys.argv[1],'temp.wav')
   playback.play(AudioSegment.from_wav('temp.wav'))

使用write.py,提前将“下次再见,好的,我在”这三个词保存在本地。
为了提速,我们可以把write.py做成服务:

from fastapi import FastAPI,Request
import soundfile as sf
import sherpa_onnx,json
from pydub import AudioSegment,playback
tts_config = sherpa_onnx.OfflineTtsConfig(
    model=sherpa_onnx.OfflineTtsModelConfig(
        vits=sherpa_onnx.OfflineTtsVitsModelConfig(
            model='tts/vits-aishell3.onnx',
            lexicon='tts/lexicon.txt',
            tokens='tts/tokens.txt'),
        provider="cpu"),
    rule_fsts='tts/number.fst',
    max_num_sentences=2)

app = FastAPI()
@app.post("/write")
async def root(request:Request):
    try:
        data = json.loads(await request.body())
        audio = sherpa_onnx.OfflineTts(tts_config).generate(data['text'], sid=data['sid'])
        sf.write(data['output'],audio.samples,samplerate=audio.sample_rate,subtype="PCM_16")
        playback.play(AudioSegment.from_mp3(data['output']))
        return {"status":"OK"}
    except:
        return {"status":"NOK"}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app="main:app", host="127.0.0.1", port=8002)

然后write.py改成:

import json,requests
data = json.loads("""{"text":"%s","output":"%s.wav","sid":10}"""%(sys.argv[1],sys.argv[2]))
url = "http://127.0.0.1:8002/write"
response = requests.post(url, data=json.dumps(data), headers={"Content-Type": "application/json; charset=GBK"}).text
print(response)

3. 编译

记得编译时带上cuda:

WHISPER_CUDA=1 make -j command

然后执行:

./command -m ../models/ggml-medium.bin -l zh
  • 30
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Studio是一个用于开发Android应用程序的集成开发环境(IDE),它提供了丰富的功能和工具来帮助开发人员构建强大的Android应用程序。 聊天机器人(Chatbot)是一种基于人工智能技术的应用程序,它可以模拟人类对话,并根据对话的内容提供相应的回复。通过使用Android Studio,开发人员可以创建自己的聊天机器人应用程序,并在Android设备上部署和运行它。 在Android Studio中开发聊天机器人应用程序时,可以使用多种技术和工具。首先,可以使用Java或Kotlin编程语言来编写应用程序的逻辑。这些编程语言具有强大的面向对象编程能力,可以帮助开发人员构建复杂的聊天机器人逻辑。 其次,Android Studio提供了丰富的UI设计工具,可以帮助开发人员设计应用程序的用户界面。聊天机器人应用程序通常具有聊天界面,开发人员可以使用Android Studio的布局编辑器来创建和布局这些界面。 另外,对于聊天机器人应用程序,还可以使用一些第三方的人工智能平台或API,例如Dialogflow或IBM Watson,来处理自然语言处理和智能回复的功能。这些平台提供了强大的自然语言处理引擎,并提供了一些现成的聊天机器人模板和API,可以帮助开发人员快速构建聊天机器人应用程序。 总之,使用Android Studio可以方便地开发聊天机器人应用程序,并利用人工智能技术为用户提供智能化的对话体验。通过结合丰富的功能和工具,开发人员可以实现自己的创意,构建出功能强大且用户友好的聊天机器人应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值