作为一个青少年,我梦想创建应用。我有很多想法,但是在编程方面遇到了困难。
后来,我让自己身边围绕着专家,这对我有了很大的帮助。在一个团队中,你可以借助所有成员的专业知识来构建庞大且强大的应用程序。但是,这仍然是一个缓慢而繁琐的过程。
直到 GPT-4 出现!
有了 GPT-4,就好像在 WhatsApp 上拥有一个专家团队一样。现在,你可以在几个小时内原型化简单的应用程序,即使只具备基本的编程技能。
在本文中,我想带你走过我创建一个语音助手应用程序(我称之为 Jarvis)的过程,该应用程序能够:
-
捕捉激活关键词(就像是“嘿 Siri!”)
-
理解我的问题
-
给我一个答案
为了省下一两个小时的研究时间,我决定问问 AI 这个过程,于是我问道:
这已经是相当不错的步骤了。我们知道我们需要做什么,AI 提出了一些我们稍后可以使用的库和工具,那么让我们动手吧!
请记住,如果你对 AI 提到的内容不确定,你可以随时请求更多细节或下一步的指导。
Python 是我唯一略懂一点的编程语言,并且我已经在我的电脑上安装了 Pycharm。所以它是我的首选。
如果你是一个完全的初学者,我也推荐使用 Python。它是一门非常适合初学者的语言,有着良好的编写文档、许多教程、庞大的社区,而且它相当通用。
类似于“嘿 Siri”或“好谷歌”,我希望 Jarvis 能够识别自己的激活短语。
最开始,我试图按照 AI 的指导,并检查了 Kitty-AI Snowboy 库 以达到这个目的,但我发现这个库已经不再维护了。
因此,我请 AI 给我一些替代方案,并且没有进行过多的研究,我就选择了它的第一个选项 PicoVoice.ai:
-
基本用例免费
-
支持 Python
-
有很好的文档
-
还包括语音转文本的 API(我们稍后需要用到)
我尝试生成 API 密钥(需要注册)并将 快速入门 代码粘贴到我的 JarvisAI python 文件中:
import pvporcupine
porcupine = pvporcupine.create(
access_key='在这里输入你的访问密钥',
keywords=['picovoice', 'bumblebee']
)
def get_next_audio_frame():
pass
while True:
audio_frame = get_next_audio_frame()
keyword_index = porcupine.process(audio_frame)
if keyword_index == 0:
print(0)
elif keyword_index == 1:
print(1)
但是它没有工作。😪 为什么呢?错误消息说它缺少语音输入。你可以看到 get_next_audio_frame() 方法获取音频文件的代码为空...
让我们将这段代码提供给 AI 并要求添加记录音频的逻辑:
GPT-4 不仅为我写了代码:
import pvporcupine
import pyaudio
import struct
porcupine = pvporcupine.create(
access_key='你的 API 密钥',
keywords=['picovoice', 'bumblebee']
)
# 初始化 PyAudio
audio = pyaudio.PyAudio()
stream = audio.open(
rate=porcupine.sample_rate,
channels=1,
format=pyaudio.paInt16,
input=True,
frames_per_buffer=porcupine.frame_length,
)
# 主循环
print("Listening for keywords...")
try:
while True:
# 从麦克风读取音频数据
audio_data = stream.read(porcupine.frame_length)
audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)
# 使用 Porcupine 处理音频帧
keyword_index = porcupine.process(audio_frame)
if keyword_index == 0:
print("检测到关键词 0!")
elif keyword_index == 1:
print("检测到关键词 1!")
finally:
# 清理资源
stream.stop_stream()
stream.close()
audio.terminate()
porcupine.delete()
它还给了我以下解释和安装所需库的指导:
我测试了一下这段代码,它工作正常!🎉 该应用程序正确地检测到了语音中的关键词。让我们将这个触发词更改为 "Jarvis"(我们的 AI 助手的名字)并继续进行!
我们已经实现了触发词的检测,但现在我们还需要录制用户的声音并将其转换为文本。PicoVoice.ai 通过他们的 API 为此提供了支持。
首先,我试图自己将这个功能加入到现有的代码中,但不幸的是,我第一次尝试并不成功。幸运的是,我的 AI 伙伴不会对我进行评判。😅
第一次尝试在这里没有成功。代码报了一些关于录制音频的异常错误。所以我简单地将消息复制粘贴给 AI,再次询问:
AI 礼貌地为犯了一个错误向我道歉,并提供了一个实际工作的更新代码供我使用!🎉
通过评论,我们可以更好地了解正在发生的事情并理解代码。
import os
import pvleopard as pvleopard
import pvporcupine
import pyaudio
import struct
import wave
porcupine = pvporcupine.create(
access_key='你的 API 密钥',
keywords=['jarvis']
)
leopard = pvleopard.create(access_key='你的 API 密钥')
# 初始化 PyAudio
audio = pyaudio.PyAudio()
stream = audio.open(
rate=porcupine.sample_rate,
channels=1,
format=pyaudio.paInt16,
input=True,
frames_per_buffer=porcupine.frame_length * 2,
)
def record_audio(filename, duration):
frames = []
for _ in range(0, int(porcupine.sample_rate / porcupine.frame_length * duration)):
audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)
frames.append(audio_data)
with wave.open(filename, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(audio.get_sample_size(pyaudio.paInt16))
wf.setframerate(porcupine.sample_rate)
wf.writeframes(b''.join(frames))
# 主循环
print("Listening for keywords...")
try:
while True:
# 从麦克风读取音频数据
audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)
# 使用 Porcupine 处理音频帧
keyword_index = porcupine.process(audio_frame)
if keyword_index == 0:
print("检测到关键词!正在录制语音...")
# 录制固定时间的语音
duration_seconds = 5
audio_file = "recorded_audio.wav"
record_audio(audio_file, duration_seconds)
# 使用 Leopard 转录录制的语音
print("正在转录语音...")
transcript, words = leopard.process_file(os.path.abspath(audio_file))
print("转录结果:", transcript)
# 删除音频文件(如果你不需要它)
os.remove(audio_file)
finally:
# 清理资源
stream.stop_stream()
stream.close()
audio.terminate()
porcupine.delete()
现在是时候给 Jarvis 注入智慧,使它变得智能了。为此,我们将使用 chatGPT,由于我对如何进行下一步不了解,所以再次向 AI 寻求帮助:
太棒了!现在我有明确的步骤要遵循。
如果我在复制粘贴代码时遇到麻烦,我可以直接向 AI 寻求帮助,比如说:“这是我的代码 <<<粘贴代码>>> - 你可以帮我做出所描述的更改吗?”然后,AI 将给我完整的代码来使用。
注意:在查看 OpenAI 文档后,我决定使用 chatGPT 模型而不是 davinci,因为它更好且更便宜。如果你需要更多帮助,不要犹豫向 AI 寻求帮助。
以下是更新后的代码:
import os
import pvleopard as pvleopard
import pvporcupine
import pyaudio
import struct
import wave
import openai
porcupine = pvporcupine.create(
access_key='你的 API 密钥',
keywords=['jarvis']
)
leopard = pvleopard.create(access_key='你的 API 密钥')
openai.api_key = '你的 API 密钥'
# 初始化 chatGPT
engine = pyttsx3.init()
# 使用一些有趣的欢迎消息和用户操作说明
engine.say("你好,我是 Jarvis,你的个人助手。说出我的名字并向我提问:")
engine.runAndWait()
# 初始化 PyAudio
audio = pyaudio.PyAudio()
stream = audio.open(
rate=porcupine.sample_rate,
channels=1,
format=pyaudio.paInt16,
input=True,
frames_per_buffer=porcupine.frame_length * 2,
)
def record_audio(filename, duration):
frames = []
for _ in range(0, int(porcupine.sample_rate / porcupine.frame_length * duration)):
audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)
frames.append(audio_data)
with wave.open(filename, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(audio.get_sample_size(pyaudio.paInt16))
wf.setframerate(porcupine.sample_rate)
wf.writeframes(b''.join(frames))
# 主循环
print("Listening for keywords...")
try:
while True:
# 从麦克风读取音频数据
audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)
# 使用 Porcupine 处理音频帧
keyword_index = porcupine.process(audio_frame)
if keyword_index == 0:
print("检测到关键词!正在录制语音...")
# 录制固定时间的语音
duration_seconds = 5
audio_file = "recorded_audio.wav"
record_audio(audio_file, duration_seconds)
# 使用 Leopard 转录录制的语音
print("正在转录语音...")
transcript, words = leopard.process_file(os.path.abspath(audio_file))
print("转录结果:", transcript)
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "assistant",
"content": ("Formulate a very short reply for the question. Here is the question:"+transcript)}],
temperature=0.6,
)
print(response.choices[0].message.content)
# 这一行代码朗读 openAI 的回答
pyttsx3.speak(response.choices[0].message.content)
# 删除音频文件(如果你不需要它)
os.remove(audio_file)
finally:
# 清理资源
stream.stop_stream()
stream.close()
audio.terminate()
porcupine.delete()
你可以尝试运行这段代码并像平常一样向 chatGPT 提问。它正常工作!
让我们回顾一下:
-
Jarvis 在你说出触发词后被激活 ✅
-
它理解你说的话并将其转录为文本 ✅
-
它有回答你问题的能力 ✅
-
它很安静。它不能说话。 😢 好吧,让我们来解决这个问题。
我猜你已经知道了过程... 这是我问的问题:
GPT-4 为我提供了易于使用和有效的库,并给出了我要如何调整代码以使语音工作的具体步骤。🤯
这是 Jarvis 个人语音助手的最终工作代码:
import os
import pvleopard as pvleopard
import pvporcupine
import pyaudio
import struct
import wave
import openai
import pyttsx3
porcupine = pvporcupine.create(
access_key='你的 API 密钥',
keywords=['jarvis']
)
leopard = pvleopard.create(access_key='你的 API 密钥')
openai.api_key = '你的 API 密钥'
# 初始化语音库
engine = pyttsx3.init()
# 使用一些有趣的欢迎消息和用户操作说明
engine.say("你好,我是 Jarvis,你的个人助手。说出我的名字并向我提问:")
engine.runAndWait()
# 初始化 PyAudio
audio = pyaudio.PyAudio()
stream = audio.open(
rate=porcupine.sample_rate,
channels=1,
format=pyaudio.paInt16,
input=True,
frames_per_buffer=porcupine.frame_length * 2,
)
def record_audio(filename, duration):
frames = []
for _ in range(0, int(porcupine.sample_rate / porcupine.frame_length * duration)):
audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)
frames.append(audio_data)
with wave.open(filename, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(audio.get_sample_size(pyaudio.paInt16))
wf.setframerate(porcupine.sample_rate)
wf.writeframes(b''.join(frames))
# 主循环
print("Listening for keywords...")
try:
while True:
# 从麦克风读取音频数据
audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)
# 使用 Porcupine 处理音频帧
keyword_index = porcupine.process(audio_frame)
if keyword_index == 0:
print("检测到关键词!正在录制语音...")
# 录制固定时间的语音
duration_seconds = 5
audio_file = "recorded_audio.wav"
record_audio(audio_file, duration_seconds)
# 使用 Leopard 转录录制的语音
print("正在转录语音...")
transcript, words = leopard.process_file(os.path.abspath(audio_file))
print("转录结果:", transcript)
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "assistant",
"content": ("Formulate a very short reply for the question. Here is the question:"+transcript)}],
temperature=0.6,
)
print(response.choices[0].message.content)
# 这一行代码朗读 openAI 回答的文本
pyttsx3.speak(response.choices[0].message.content)
# 删除音频文件(如果你不需要它)
os.remove(audio_file)
finally:
# 清理资源
stream.stop_stream()
stream.close()
audio.terminate()
porcupine.delete()
完成了!观看演示视频:
不再花费 2-3 小时编写我所需的文档,不再请求开发人员分配,并等待几天才能得到结果,我在午餐时间结束时就已经有一个可用的 MVP。
不到 1 小时的时间内,我们就有了一个工作的 AI 语音助手的原型,我们甚至可以将其转化为网站或 iOS 应用程序,只需多问几个问题,开始与用户测试,收集反馈,并根据开发需求持续改进。
看来我们正式进入了人工智能的时代! (https://www.twitter.com/michallangmajer)**_