语音对话

import wave
import pyaudio
import json
import base64
import time
import os
import pyttsx3
import base
import keyboard
from urllib.request import urlopen
from urllib.request import Request
from openai import OpenAI

timer = time.perf_counter
AUDIO_FILE = './recorded_audio.pcm'
message = [
{"role": "system", "content": "You are a helpful assistant"} # 在此决定CHATGPT本次谈话的身份,例如 ‘决策助手’ ‘翻译专家’
]


def get_chat(result_data):
if '退出对话' in result_data:
print("对话已经退出")
os.remove(AUDIO_FILE)

else:
message.append({"role": "user", "content": f"{result_data}"}) # 第27行和37行的语句可以使chatgpt记住上下文,删掉这两行之后对于chatgpt来说每次都是开启了一个新的会话
client = OpenAI(
base_url="https://oneapi.xty.app/v1",
api_key=base.api_key # 这里的apk-key需要在openai或其它地方购买
)
completion = client.chat.completions.create( # 这里可以添加例如temperature的参数,具体请查询openai官网文档
model="gpt-3.5-turbo",
messages=message
)
content_text = completion.choices[0].message.content
message.append({"role": "assistant", "content": f"{content_text}"})
print(f'\nChatGpt的回答为:\n{content_text}')
pyttsx3.speak(content_text)
record_audio()


def get_words():
token = base.token # 百度云服务中,语音转写服务的api

with open(AUDIO_FILE, 'rb') as speech_file:
speech_data = speech_file.read()

speech = base64.b64encode(speech_data)
speech = str(speech, 'utf-8')
params = {'dev_pid': 1537, # 这里的参数区别情查询百度云语音转写相关文档,例如可以修改转写目标语种,地方方言等等
'format': 'pcm',
'rate': 16000,
'token': token,
'cuid': '123456PYTHON',
'channel': 1,
'speech': speech,
'len': len(speech_data)
}
post_data = json.dumps(params, sort_keys=False)
# print post_data
req = Request('http://vop.baidu.com/server_api', post_data.encode('utf-8'))
req.add_header('Content-Type', 'application/json')

begin = timer()
f = urlopen(req)
result_str = f.read()
print("语音转换时间: %f\n" % (timer() - begin))

result_str = str(result_str, 'utf-8')
result_data = json.loads(result_str).get("result", [])
print(f'您的输入为:\n{result_data[0]}')
get_chat(result_data[0])


def record_audio(sample_rate=16000):
p = pyaudio.PyAudio()

# 打开音频流
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=sample_rate,
input=True,
frames_per_buffer=1024)

print("\n按住 'ctrl' 键开始录音...")

frames = []
recording = False

while True:
# 检测 'r' 键是否被按下
if keyboard.is_pressed('ctrl') and not recording:
print("开始录音...")
recording = True

# 检测 'r' 键是否被释放
if not keyboard.is_pressed('ctrl') and recording:
print("停止录音.\n")
break

if recording:
data = stream.read(1024)
frames.append(data)

if len(frames) < 17:
print('长度过短,长度应大于1秒,请重新输入')
return record_audio()

# 关闭音频流
stream.stop_stream()
stream.close()
p.terminate()

# 保存音频为WAV文件
wf = wave.open(AUDIO_FILE, 'wb')
wf.setnchannels(1)
wf.setsampwidth(pyaudio.PyAudio().get_sample_size(pyaudio.paInt16))
wf.setframerate(sample_rate)
wf.writeframes(b''.join(frames))
wf.close()

print(f"音频已保存,正在转换为文字")
get_words()


record_audio()


相关推荐

  • 生成图片

    from PIL import Image, ImageColor, ImageDraw, ImageFont, ImageFilterdef create_image_with_text(size, color, text, font_path, font_size, text_color, shadow_color, output_path): """ Create a new image of specified size and color with centered text that has a border and shadow. :param size: A tuple con

  • 获取指定目录下的所有图片信息

    1 获取指定目录下的所有图片信息// 获取指定目录下的所有图片信息 public function getImagesInfo($directory) { $images = []; // 创建递归目录迭代器 $iterator = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($directory, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY ); // 遍历目录中的每个文件 foreach (

  • Thinkphp各版本的PHP要求

    ThinkPHP 8.0:运行环境要求PHP8.0+,兼容PHP8.3ThinkPHP 6.1:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 6.0:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 5.1:运行环境要求PHP5.6+,兼容PHP8.0ThinkPHP 5.0:运行环境要求PHP5.4+,兼容PHP7.3