阿里云语音识别库下载与安装
-
下载Python SDK。
从Github获取Python SDK,或直接下载alibabacloud-nls-python-sdk-1.0.0.zip。
-
安装SDK依赖。
进入SDK根目录使用如下命令安装SDK依赖:(重要的事情标红处理)
python -m pip install -r requirements.txt
-
安装SDK。
依赖安装完成后使用如下命令安装SDK:(如果你电脑存在多个python环境,例如电脑中有两个python环境,一个python本身,一个venv虚拟环境,通过cmd进入的是python本身环境,但是你需要使用是venv虚拟环境,不会安装的朋友可以按照我的步骤)- 在文件资源管理器中找到你要安装的python环境解释器 路径出敲入cmd进入命令行
-
激活python环境解释器
在命令行中输入.\Scripts\activate
-
进入阿里云语音转文字库文件的目录
在命令行中输入 cd "你文件路径"
成功进入对应目录 之后在使用阿里云官方文档中的命令 即可正确安装到想要的python环境解释器中python -m pip install .
-
安装完成后通过以下代码导入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()