python实时语音转文字demo+阿里云语音识别api

阿里云语音识别库下载与安装

阿里云python语音转文字官方说明文档l

  1. 下载Python SDK。

    Github获取Python SDK,或直接下载alibabacloud-nls-python-sdk-1.0.0.zip

  2. 安装SDK依赖。

    进入SDK根目录使用如下命令安装SDK依赖:(重要的事情标红处理)

    python -m pip install -r requirements.txt
  3. 安装SDK。
    依赖安装完成后使用如下命令安装SDK:(如果你电脑存在多个python环境,例如电脑中有两个python环境,一个python本身,一个venv虚拟环境,通过cmd进入的是python本身环境,但是你需要使用是venv虚拟环境,不会安装的朋友可以按照我的步骤
    1. 在文件资源管理器中找到你要安装的python环境解释器  路径出敲入cmd进入命令行
    2.  激活python环境解释器
      在命令行中输入

      .\Scripts\activate

      ​​​​​​​

    3. 进入阿里云语音转文字库文件的目录
      在命令行中输入 cd "你文件路径"

      成功进入对应目录 之后在使用阿里云官方文档中的命令 即可正确安装到想要的python环境解释器中​​​​​​​

      python -m pip install .
  4. 安装完成后通过以下代码导入SDK。

    # -*- coding: utf-8 -*-
    import nls

实时语音转文字的实现

阿里云官方提供的示例代码简单的讲解了又什么功能,实时语音转文字我们需要使用到的就是 输出句子结束的消息 这个方法

​​​​​​​配置输出自己重写的test_on_sentence_end这个方法,在我的代码中是on_sentence_end()这个方法

在我的代码中只需要配置on_sentence_end=self.on_sentence_end,注释掉的选项在实时语音转文字过程中都不需要我们重写方法,只需要重写on_sentence_end()这个方法,让其输出语音转换出的文字内容

示例代码

代码中相关的TOKEN和APPKEY需要你自己去阿里云申请获得,有三个月免费试用
  token获取链接                    <=  点击跳转  =>                             appkey获取链接

import json
import threading
import sys
import keyboard
import time
import nls
import pyaudio

# # 确保阿里云的NLS Python SDK已经安装在你的环境中
# import nls
#
# # 配置参数
# URL = "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"
# TOKEN = "你的Token"  # 替换为你的Token 参考https://help.aliyun.com/document_detail/450255.html获取token
# APPKEY = "你的Appkey"  # 替换为你的Appkey 获取Appkey请前往控制台:https://nls-portal.console.aliyun.com/applist

# 定义音频流参数
FORMAT = pyaudio.paInt16  # 音频格式
CHANNELS = 1              # 声道数
RATE = 16000              # 采样率
CHUNK = 640               # 数据块大小




class SpeechTranscriberThread(threading.Thread):
    # 构造函数,初始化线程
    def __init__(self, thread_id):
        # 调用父类的构造函数
        threading.Thread.__init__(self)
        # 存储线程的标识符
        self.thread_id = thread_id
        # 初始化NlsSpeechTranscriber对象,配置NLS服务的参数和回调函数
        self.sr = nls.NlsSpeechTranscriber(
            url=URL,
            token=TOKEN,
            appkey=APPKEY,
            # on_sentence_begin=self.on_sentence_begin,
            on_sentence_end=self.on_sentence_end,
            # on_start=self.on_start,
            # on_result_changed=self.on_result_changed,
            # on_completed=self.on_completed,
            # on_error=self.on_error,
            # on_close=self.on_close
        )
        # 初始化PyAudio对象
        self.p = pyaudio.PyAudio()
        # 打开一个音频流,用于从麦克风读取数据
        self.stream = self.p.open(format=FORMAT,
                                  channels=CHANNELS,
                                  rate=RATE,
                                  input=True,
                                  frames_per_buffer=CHUNK)

    # 清理资源的方法
    def cleanup(self):
        # 如果音频流存在,则停止和关闭它
        if self.stream:
            self.stream.stop_stream()
            self.stream.close()
        # 如果PyAudio实例存在,则终止它
        if self.p:
            self.p.terminate()

    def run(self):
        # 输出消息,表示线程开始语音转录
        # print(f"Thread {self.thread_id}: Starting speech transcription.")
        # 启动语音识别
        self.sr.start(aformat="pcm",
                      enable_intermediate_result=True,
                      enable_punctuation_prediction=True,
                      enable_inverse_text_normalization=True)
        try:
            # 假设我们使用一个标志来控制循环
            self.running = True
            # 循环读取音频数据并发送到NLS服务
            while self.running:
                data = self.stream.read(CHUNK)
                self.sr.send_audio(data)
                # 稍作延迟
                time.sleep(0.01)
        except Exception as e:
            print(f"Thread {self.thread_id}: Error during transcription: {e}")
        finally:
            # 清理资源
            self.cleanup()

    def on_sentence_end(self, message):
        # 输出句子结束的消息
        # print(f"Thread {self.thread_id}: Sentence end: {message}")
        message_dict = json.loads(message)
        # 提取payload部分
        payload = message_dict.get('payload', {})
        # 提取并输出result内容
        result = payload.get('result', '')
        print(result, end='')

    def stop_transcription(self):
        """停止转录并清理资源"""
        self.running = False
        self.sr.stop()
        self.cleanup()


def on_press(event):
    """当按键被按下时调用的函数"""
    if event.name == 'esc':  # 如果按下的是ESC键
        print('ESC key pressed. Exiting...')
        # 停止监听所有键盘事件
        keyboard.unhook_all()
        # 停止转录线程
        transcriber_thread.stop_transcription()
        # 等待转录线程退出
        transcriber_thread.join()
        # 退出程序
        sys.exit()


def main():
    global transcriber_thread
    # 禁用NLS SDK的跟踪日志
    nls.enableTrace(False)
    # 创建SpeechTranscriberThread实例,并传入线程标识符
    transcriber_thread = SpeechTranscriberThread("1")
    # 钩子键盘事件
    keyboard.hook(callback=on_press)
    # 启动线程
    transcriber_thread.start()
    # 等待线程完成
    transcriber_thread.join()

if __name__ == "__main__":
    main()
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值