大家想必都知道llm是“大语言模型”(Large Language Model)的缩写,就是像GPT-4、DeepSeek、文心一言这类能够理解、生成人类语言的AI模型,而这种模型一般都只能在云端网页调用,会玩的人通过ollma本地化下载,然后再本地进行一个对话,不过这些都太old被人讲过了,我们讲的特别的,如何通过unity引擎插件实现用语音聊天跟ai模型在引擎里面互动。
我们用的工具有以下几个:第一个大模型,首先unity支持大模型的导入但是最好使用.gguf而非.safetensors结构,这里我们直接给出qwen的gguf链接大家魔法上网进入hugging进行下载,因为unity如果你想导出包不是那么大那3g也够了这里是千文的一个gguf的模型链接huggingface.co,然后呢我们要第二个工具:whisper插件这个插件大家直接去package manager选择git url进行下载
https://github.com/Macoron/whisper.unity.git?path=/Packages/com.whisper.unity
这个主要负责对应的语音识别嵌入插件,下载完成后我们并不能直接开始,我们在组件搜索whispermanager,给我们新建一个空物体挂载,挂载后会发现一个东西Model,这个有个path路径他指向了StreamingAsset一个文件,但是这是空的这是为什么,因为我们还需要语音识别模型,语音模型为bin文件,而负责语音模型我直接给大家给出链接这个是small模型,大家可以查看huggingface越大越精确性能消耗越高https://huggingface.co/ggerganov/whisper.cpp/blob/main/ggml-small.bin
当然如果想下载其他模型也可以直接搜索ggml,下载后放入文件夹如图所示
然后配置文件路径,在刚刚的组件中设置path为你的名字,如果放子文件加上/子文件名字/你的bin文件名字
我们完成了配置之后就可以编写一个方法进行调用,Whisper.unity 提供了MicrophoneRecord组件,通过事件通知录音结束并返回音频数据。核心调用如下:
microphoneRecord.OnRecordStop += OnRecordStop;
private async void OnRecordStop(AudioChunk recordedAudio)
{
var res = await whisperManager.GetTextAsync(
recordedAudio.Data,
recordedAudio.Frequency,
recordedAudio.Channels
);
string playerSpeech = res.Result;
// 将识别文本发送给 AI
CallAI(playerSpeech);
}
大家脚本调用仅需通过 microphoneRecord.StartRecord();开始录制 microphoneRecord.StopRecord();停止录制,编写方法在按钮开始适合开始录制再次点击停止,实现ai输入后传递文字方法如下var res = await whisperManager.GetTextAsync(recordedAudio.Data, recordedAudio.Frequency, recordedAudio.Channels);
string playerSpeech = res.Result;
await CallAIAsync(playerSpeech);通过whisperManager.GetTextAsync()从而实现这个录制转文字
我们完成语音后该实现如何语音转文字传递给ai,这个内嵌ai模型的插件那就是nobodywho,我们需要在资源商店下载Local LLMs - made easy。
商店下载完成导入包内我们会获得几个脚本,我们创建一个新空物体放置这个插件的内置脚本分别是nobodywhochat,nobodywhomodel,如图所示
这里就放置我们的大模型刚刚的qwen的文件路径,browse查找即可,设置完毕后,我们编写代码,首先通过一个text接收到刚刚ai语音的代码然后里面nobody方法的
nobodyWhoChat.Say(playerMessage) → 发送给大模型
然后实现一个语音转文字,具体流程如下
玩家按下 P 键 / 点击按钮
↓
StartRecording() → 开始录音
↓
玩家松开 P 键 / 再次点击按钮
↓
StopRecording() → 停止录音
↓
OnRecordStop(自动触发)
↓
whisperManager.GetTextAsync() → 语音转文字(playerSpeech)
↓
CallAIAsync(playerSpeech)
↓
nobodyWhoChat.Say(playerMessage) → 发送给大模型
↓
responseUpdated 事件 → 实时更新 AI 回复框(打字机效果)
当然ui方面的配置我们就不多赘述,大致逻辑就是这样,在我们配置好了对应的插件就可以调用方法实现我们的ai语音转文字让ai回答问题,如果你也想尝试一下我会给出完整的代码片段链接给各位大家按照这个配置即可语音转文字脚本-CSDN博客