开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 391|回复: 7
收起左侧

[易语言模块源码] 阿里通义千问API和百du语音识别做到AI对话python源码

[复制链接]
发表于 2025-1-8 23:04:07 | 显示全部楼层 |阅读模式   湖南省岳阳市
分享例程
界面截图:
备注说明: -
本帖最后由 2533 于 2025-1-8 23:06 编辑

本代码支持语音输入,和结果语音播报

[Python] 纯文本查看 复制代码
from http import HTTPStatus
import os
import wave
import requests
import time
import base64
from pyaudio import PyAudio, paInt16
from aip import AipSpeech
import pygame.mixer
import dashscope

# 采用在代码中直接设置API密钥的方式,通义api
dashscope.api_key = 'sk-b168bcc****b40faa7b********93c4c'

def call_with_messages(messages):
    response = dashscope.Generation.call(
        dashscope.Generation.Models.qwen_turbo,
        messages=messages,
        result_format='message',  # 设置结果为 "message" 格式
    )
    if response.status_code == HTTPStatus.OK:
        # 处理并打印返回的message内容
        assistant_response = None
        for message in response.output['choices']:
            if 'content' in message:
                print(f"小助手: {message['content']}")
                assistant_response = message['content']
            elif 'message' in message and 'content' in message['message']:
                print(f"小助手:{message['message']['content']}")
                assistant_response = message['message']['content']
            else:
                print(f"Warning: Message object is missing the 'content' key: {message}")

        return assistant_response  # 返回小助手的回答

    else:
        print(f'Request id: {response.request_id}, Status code: {response.status_code}, '
              f'error code: {response.code}, error message: {response.message}')
        return None

framerate = 16000  # 采样率
num_samples = 2000  # 采样点
channels = 1  # 声道
sampwidth = 2  # 采样宽度2bytes
FILEPATH = 'speech.wav'

APP_ID = '4***22'
API_KEY = "mjW9Q5t******qG5PQDp"
SECRET_KEY = "rWNfuHrL*******C1SwXsPNMA"
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

### 百du语音识别api
base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s"
APIKey = "mjW9Q5t******qG5PQDp"
SecretKey = "rWNfuHrL*******C1SwXsPNMA"

HOST = base_url % (APIKey, SecretKey)

def getToken(host):
    res = requests.post(host)
    return res.json()['access_token']

def save_wave_file(filepath, data):
    wf = wave.open(filepath, 'wb')
    wf.setnchannels(channels)
    wf.setsampwidth(sampwidth)
    wf.setframerate(framerate)
    wf.writeframes(b''.join(data))
    wf.close()

def my_record():
    pa = PyAudio()
    stream = pa.open(format=paInt16, channels=channels,
                     rate=framerate, input=True, frames_per_buffer=num_samples)
    my_buf = []
    t = time.time()
    print('正在录音...')

    while time.time() < t + 4:  # 秒
        string_audio_data = stream.read(num_samples)
        my_buf.append(string_audio_data)
    print('录音结束.')
    save_wave_file(FILEPATH, my_buf)
    stream.close()

def get_audio(file):
    with open(file, 'rb') as f:
        data = f.read()
    return data

def speech2text(speech_data, token, dev_pid=1537):
    FORMAT = 'wav'
    RATE = '16000'
    CHANNEL = 1
    CUID = 'l1aQEcqYSH2BfZe7eCG84nv3qRnErsMA'
    SPEECH = base64.b64encode(speech_data).decode('utf-8')

    data = {
        'format': FORMAT,
        'rate': RATE,
        'channel': CHANNEL,
        'cuid': CUID,
        'len': len(speech_data),
        'speech': SPEECH,
        'token': token,
        'dev_pid': dev_pid
    }
    url = 'https://vop.baidu.com/server_api'
    headers = {'Content-Type': 'application/json'}
    print('正在识别...')
    r = requests.post(url, json=data, headers=headers)
    Result = r.json()
    if 'result' in Result:
        return Result['result'][0]
    else:
        return Result

def baidu_text_to_speech(text):
    result = client.synthesis(text, 'zh', 1, {'vol': 5, 'per': 4})

    if not isinstance(result, dict):
        with open('output.mp3', 'wb') as f:
            f.write(result)
        audio_file_path = 'output.mp3'
    else:
        audio_file_path = None
        print('Error:', result['error_msg'])

    return audio_file_path

if __name__ == '__main__':
    flag = 'y'
    while flag.lower() == 'y':
        print('请输入数字选择语言:')
        devpid = input('1536:普通话(简单英文),1537:普通话(有标点),1737:英语,1637:粤语,1837:四川话\n')
        my_record()
        TOKEN = getToken(HOST)
        speech = get_audio(FILEPATH)
        result = speech2text(speech, TOKEN, int(devpid))
        print(result)

        # 将语音识别结果作为代码1的content
        user_message = {'role': 'user', 'content': result}

        # 调用代码1的call_with_messages函数
        messages = [{'role': 'system', 'content': 'You are a helpful assistant.'}, user_message]
        if isinstance(result, str):
            user_message = {'role': 'user', 'content': result}
        else:
            print("识别结果不是字符串类型,无法进行后续处理")
            continue

        assistant_answer = call_with_messages(messages)  # 获取小助手的回答

        if assistant_answer is not None:
            # 对小助手的回答进行语音播报
            audio_file_path = baidu_text_to_speech(assistant_answer)

            if audio_file_path is not None and os.path.isfile(audio_file_path):
                pygame.mixer.init()
                pygame.mixer.music.load(audio_file_path)
                pygame.mixer.music.play()
                while pygame.mixer.music.get_busy():  # 等待播放完成
                    time.sleep(0.1)  # 可适当调整睡眠时间
                pygame.mixer.quit()

                os.remove(audio_file_path)  # 在播放结束后立即删除临时文件
            else:
                print("未能成功合成小助手语音,请查看日志中的错误信息")

        flag = input('Continue?(y/n):')

评分

参与人数 1精币 +1 收起 理由
zhqpower + 1 支持开源~!感谢分享

查看全部评分


友情提醒:请选择可信度高的模块,勿用未知模块,防止小人在模块内加入木马程序。【发现问题模块请到站务投诉】。
结帖率:100% (14/14)

签到天数: 19 天

发表于 6 天前 | 显示全部楼层   广东省江门市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

签到天数: 19 天

发表于 6 天前 | 显示全部楼层   陕西省汉中市
学习一下
回复 支持 反对

使用道具 举报

签到天数: 9 天

 楼主| 发表于 2025-1-9 17:51:24 | 显示全部楼层   湖南省岳阳市
cs潇潇 发表于 2025-1-9 06:15
既然做人工智能,就应该有语音打断功能,而不是傻乎乎的要敲回车……

源码都开源了 你嘴硬你来升级下,我保证不说半个字,我会给你 点赞说牛   逼
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 1 天

发表于 2025-1-9 11:21:28 | 显示全部楼层   河南省南阳市
感谢分享
回复 支持 反对

使用道具 举报

签到天数: 18 天

发表于 2025-1-9 09:57:34 | 显示全部楼层   河北省石家庄市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:70% (35/50)

签到天数: 19 天

发表于 2025-1-9 06:15:06 | 显示全部楼层   广西壮族自治区南宁市
既然做人工智能,就应该有语音打断功能,而不是傻乎乎的要敲回车……
回复 支持 反对

使用道具 举报

结帖率:50% (2/4)

签到天数: 1 天

发表于 2025-1-9 03:29:28 | 显示全部楼层   内蒙古自治区包头市
很好,适合学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表