如果想通过语音与AI大语言模型进行对话,可以使用AI语音助手,Ollama Voice语音助手,可以将用户的语音转换成文字,向Ollama大语言模型工具提问,返回的文字再转换成音频播放出来,实现用户与大语言模型之间的语音对话。
ollama可以在本机运行,普通的电脑就可以运行。
1.安装ARM64 Conda
在苹果M系列的ARM64芯片笔记本,可以安装ARM64版本的Conda,如下:
# 下载 Mambaforge 安装脚本
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-MacOSX-arm64.sh"
# 运行安装脚本
bash Mambaforge-MacOSX-arm64.sh
# 初始化
Conda ~/.mambaforge/bin/conda init
# 重新加载 shell 配置
source ~/.zshrc
# 或者 使用的是 Bash
source ~/.bashrc
# 创建一个新的 arm64 架构的 Conda 环境
mamba create -n my_arm64_env python=3.9 -c conda-forge
# 激活环境
conda activate my_arm64_env
# 验证环境架构
uname -m
# 使用 Python 解释器验证
python -c "import platform; print(platform.machine())"
2.安装LLVM@16
如果系统已经安装版本16的clang编译工具,可以不再手动安装llvm@16,用系统的当前版本的clang,16以下的版本不可用,安装编译pyaudio时会报.h中函数编译参数错误。
brew install llvm@16
brew list llvm@16
3.安装ollama
去https://ollama.com下载安装程序,安装完后,执行指令,如下:
ollama run llama3
4.安装portaudio
portaudio是pyaudio依赖的低层库,所以portaudio的正确安装很重要,可以用C代码测试是否好用。pyaudio在安装时要正确的引用正确版本的portaudio库,才可以正确使用苹果系统上的音频设备,否则会出现错误,无法启动麦克风进行收音。
brew uninstall portaudio && brew install portaudio --HEAD
查看portaudio安装的目录位置,如下:
brew list portaudio
安装libsndfile,保存音频文件的时候使用,用GCC编译的时候要引用这个库。
brew install libsndfile
测试用C语言代码,如下:
/* 回调函数,用于处理音频数据 */
static int recordCallback(const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo *timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData) {
float *in = (float *)inputBuffer;
float *data = (float *)userData;
for (unsigned int i = 0; i < framesPerBuffer; i++) {
data[i] = *in++;
}
return paContinue;
}
int main(void) {
PaStream *stream;
PaError err;
float data[NUM_CHANNELS * SAMPLE_RATE * NUM_SECONDS];
/* 初始化PortAudio */
err = Pa_Initialize();
if (err != paNoError) {
fprintf(stderr, "PortAudio error: %sn", Pa_GetErrorText(err));
return 1;
}
/* 打开音频流 */
err = Pa_OpenDefaultStream(&stream, NUM_CHANNELS, 0, paFloat32, SAMPLE_RATE,
FRAMES_PER_BUFFER, recordCallback, data);
if (err != paNoError) {
fprintf(stderr, "PortAudio error: %sn", Pa_GetErrorText(err));
return 1;
}
/* 开始录音 */
err = Pa_StartStream(stream);
if (err != paNoError) {
fprintf(stderr, "PortAudio error: %sn", Pa_GetErrorText(err));
return 1;
}
printf("Recording...n");
Pa_Sleep(NUM_SECONDS * 1000);
/* 停止录音 */
err = Pa_StopStream(stream);
if (err != paNoError) {
fprintf(stderr, "PortAudio error: %sn", Pa_GetErrorText(err));
return 1;
}
/* 关闭音频流 */
err = Pa_CloseStream(stream);
if (err != paNoError) {
fprintf(stderr, "PortAudio error: %sn", Pa_GetErrorText(err));
return 1;
}
/* 终止PortAudio */
Pa_Terminate();
printf("Recording complete.n");
/* 保存音频到文件 */
SF_INFO sfinfo;
memset(&sfinfo, 0, sizeof(sfinfo));
sfinfo.samplerate = SAMPLE_RATE;
sfinfo.frames = NUM_SECONDS * SAMPLE_RATE;
sfinfo.channels = NUM_CHANNELS;
sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT;
SNDFILE *outfile = sf_open("output.wav", SFM_WRITE, &sfinfo);
if (!outfile) {
fprintf(stderr, "Error opening output file: %sn", sf_strerror(NULL));
return 1;
}
sf_write_float(outfile, data, NUM_CHANNELS * SAMPLE_RATE * NUM_SECONDS);
sf_close(outfile);
printf("Audio saved to output.wavn");
return 0;
}
编译生成执行文件,运行main3执行文件进行录音。
gcc -o main3 main3.c -I/opt/homebrew/Cellar/portaudio/HEAD-57aa393/include/ -I/opt/homebrew/Cellar/libsndfile/1.2.2/include/ -L/opt/homebrew/Cellar/portaudio/HEAD-57aa393/lib/ -L/opt/homebrew/Cellar/libsndfile/1.2.2/lib/ -lportaudio -lsndfile
5.安装PyAudio
安装pyaudio和whisper,可以使用ollama vocie中有requirements.txt,按依赖文件中定的版本,用pip安装依赖库,文件内容,如下:
torch==2.1.2
torchvision==0.16.2
torchaudio==2.1.2
pyttsx3==2.90
blobfile==2.1.1
openai==1.7.0
Wave==0.0.2
PyAudio==0.2.14
PyYAML==6.0.1
pygame==2.5.2
soundfile==0.12.1
pyObjC==9.0.1
openai-whisper @ git+https://github.com/openai/whisper.git@ba3f3cd54b0e5b8ce1ab3de13e32122d0d5f98ab%
6.测试 whipser
whisper可以显示mp3声音文件说的说话内容的文本,命令如下:
whisper test.mp3
带参数安装,可以观察在安装时出现的问题,命令如下:
pip install --no-cache-dir --verbose -r requirements.txt
安装时添加参数--verbose,查看安装编译pyaudio时,使用的clang版本,引用那个版本的portaudio的头文件和库文件。--no-chache-dir是从远程服务器下载,不从本地缓冲安装。
7.测试pyaudio
执行下面的的python代码,用苹果笔记本的内置麦克风进行声音的录制,并播放声音,代码如下:
import pyaudio
import wave
# 录音设置
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 48000 # 48kHz的采样率
CHUNK = 1024
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output_48kHz.wav"
# 初始化PortAudio
audio = pyaudio.PyAudio()
# 打开麦克风音频流
stream = audio.open(format=FORMAT, channels=CHANNELS,
rate=RATE, input=True,
frames_per_buffer=CHUNK)
print("Recording...")
frames = []
# 录制音频数据
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("Recording finished.")
# 停止并关闭音频流
stream.stop_stream()
stream.close()
audio.terminate()
# 将录音数据保存到文件
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(audio.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
print(f"Audio recorded and saved to {WAVE_OUTPUT_FILENAME}")
8.启动ollama vocie
assistant.yaml配置文件中,指定whisper需要的模型文件,模型文件的下载位置,如下:
https://openaipublic.azureedge.net/main/whisper/models/25a8566e1d0c1e2231d1c762132cd20e0f96a85d16145c3a00adf5d1ac670ead/base.en.pt
其他模型的下载位置,如下:
https://github.com/openai/whisper/discussions/63#discussioncomment-3798552
assistant.yaml文件内容,如下:
messages:
pressSpace: "Press and hold space to speak"
loadingModel: "Loading..."
noAudioInput: "Error: No sound input!"
whisperRecognition:
modelPath: "whisper/base.en.pt"
lang: "en"
ollama:
url: "http://localhost:11434/api/generate"
model: "llama3"
conversation:
greeting: "Hi, how can I help you?"
ollama的模型可以根据自己主机的情况选择,高配置的主机可以下载上大一些的模型。
运行ollama vocie,命令以下:
python assistant.py
按住空格,进行声音输入,如下:
红色表示可以讲话了,以下:
在终端界面,可以看到对话的内容,已经对ollama大语言模型的访问过程。
原文始发于微信公众号(AI安全运营):与AI大语言模型进行语音对话(ollama voice)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论