当前位置:   article > 正文

PYTHON 语音识别高阶篇_vosk python

vosk python

1、上一篇博客中讲到用SpeechRecognition库和Vosk模型来识别语音,通过麦克风录音的话,只能录很短的录音,经过不断网上搜寻,终于找到一段能控制录音时间的代码:

  1. class Recorder(): # 录音程序
  2. def __init__(self, chunk=1024, channels=1, rate=16000):
  3. self.CHUNK = chunk # 音频帧率(也就是每次读取的数据是多少,默认1024
  4. self.FORMAT = pyaudio.paInt16 # 采样时生成wav文件正常格式
  5. self.CHANNELS = channels # 音轨数(每条音轨定义了该条音轨的属性,如音轨的音色、音色库、通道数、输入/输出端口、音量等。可以多个音轨,不唯一)
  6. self.RATE = rate # 采样率(即每秒采样多少数据)
  7. self._running = True
  8. self._frames = [] # 定义frames为一个空列表
  9. def start(self):
  10. _thread.start_new_thread(self.__recording, ())
  11. def __recording(self):
  12. self._running = True
  13. self._frames = []
  14. p = pyaudio.PyAudio() # 创建PyAudio对象
  15. stream = p.open(format=self.FORMAT, # 采样生成wav文件的正常格式
  16. channels=self.CHANNELS, # 音轨数
  17. rate=self.RATE, # 采样率
  18. input=True, # Ture代表这是一条输入流,False代表这不是输入流
  19. frames_per_buffer=self.CHUNK) # 每个缓冲多少帧
  20. while (self._running):
  21. data = stream.read(self.CHUNK) # 每次读chunk个数据
  22. self._frames.append(data) # 将读出的数据保存到列表中
  23. stream.stop_stream() # 停止输入流
  24. stream.close() # 关闭输入流
  25. p.terminate() # 终止pyaudio
  26. def stop(self):
  27. self._running = False
  28. def save_wave(self, filename):
  29. p = pyaudio.PyAudio() # 创建PyAudio对象
  30. if not filename.endswith(".wav"):
  31. filename = filename + ".wav"
  32. wf = wave.open(filename, 'wb') # 以’wb‘二进制流写的方式打开一个文件
  33. wf.setnchannels(self.CHANNELS) # 设置音轨数
  34. wf.setsampwidth(p.get_sample_size(self.FORMAT)) # 设置采样点数据的格式,和FOMART保持一致
  35. wf.setframerate(self.RATE) # 设置采样率与RATE要一致
  36. wf.writeframes(b''.join(self._frames)) # 将声音数据写入文件
  37. wf.close() # 数据流保存完,关闭文件
  38. def record(self):
  39. print('请按回车键开始录音:')
  40. a = input()
  41. if str.__len__(a) == 0:
  42. begin = time.time()
  43. print("开始录音ing")
  44. self.start()
  45. print("请按回车键停止录音:")
  46. b = input()
  47. if str.__len__(b) == 0:
  48. print("录音停止")
  49. self.stop()
  50. fina = time.time()
  51. t = fina - begin
  52. print('录音时间为%ds' % t)
  53. def positive(self):
  54. print('下面开始录音')
  55. self.record()
  56. self.save_wave("语音录音.wav")

解决了不能任意录音的难题。

2、语音识别的方法很多,离线使用的却不多。上次介绍了SpeechRecognition库和Vosk模型的组合,今天介绍现在流行的用OpenAI whisper来语音识别的方法。

  1. def Rec_OpenAI_whisper(filename):
  2. '''
  3. print('正在识别中......')
  4. # 加载识别模型
  5. model = whisper.load_model("tiny") # 'tiny','base','medium','large'等模型,自动下载后保存在C:\Users\xxx\.cache\whisper
  6. source = model.transcribe(filename,language='Chinese',fp16 = True) # 识别
  7. said = source['text']
  8. save_txt(said, '识别结果4.txt')
  9. print("识别结果:",said)
  10. with open('识别结果4.txt','r',encoding='UTF-8') as file: # 用来每行固定字数输出
  11. lines = file.readlines()
  12. for line in lines:
  13. for a in range(1, len(line) // 60 + 2): # 将长文截成50字每行
  14. print('\033[33m',line[(60 * (a - 1)):60 * a].strip(),'\033[0m')

人工智能固然流行,前期安装工作也很繁琐,光是要安装的各种插件就不少:
    pip install - U openai - whisper
    或 pip install git+https://github.com/openai/whisper.git
    pip install --upgrade --no-deps --force- reinstall git+https://github.com/openai/whisper.git
    pip install zhconv
    pip install wheel
    pip install torch torchvision torchaudio - i https://pypi.tuna.tsinghua.edu.cn/simple

还要安装ffmpeg,先去 https://github.com/BtbN/FFmpeg-Builds/releases下载ffmpeg-master-latest-win64-gpl.zip到主程序文件夹,解压后将bin文件夹下的ffmpeg.exe拷贝到主程序文件夹下。


    语音识别还要依赖whisper语音模型。常见whisper模型如下 :

我们可在终端窗口中输入下面语句来自动下载相应tiny模型。

whisper 语音录音.wav  --model tiny

运行后系统就自动开始下载相应模型。

将下面中的绿框分别按红框中的模型替换,就可下载不同的模型,并自动保存在用户文件夹下,如C:\Users\ XXX\.cache\whisper

3、我将前篇的Vosk语音识别和OpenAI whisper语音识别集成在一起,成为两种可选识别方案,同时也将录音和使用现有语音文件也作为选项,增加程序牟灵活性。主菜单如下:

对于同一语音文件,使用3或4两种方案,识别效果对比如下:

看起来是OpenAI whisper完胜,理应也如此。但且慢,后面对同一语音文件进行识别,有时OpenAI whisper也会出现很多错误,并不一定都能如第一次那般准确。原因我也不清楚,难道多次识别,电脑也累了,它也需要休息?

4、附送完整代码:

  1. import speech_recognition as sr
  2. import pyaudio # 使用pyaudio库可以进行录音,播放,生成wav文件
  3. import time
  4. import _thread
  5. import wave # 使用wave库可读、写wav类型的音频文件
  6. import whisper
  7. class Recorder(): # 录音程序
  8. def __init__(self, chunk=1024, channels=1, rate=16000):
  9. self.CHUNK = chunk # 音频帧率(也就是每次读取的数据是多少,默认1024
  10. self.FORMAT = pyaudio.paInt16 # 采样时生成wav文件正常格式
  11. self.CHANNELS = channels # 音轨数(每条音轨定义了该条音轨的属性,如音轨的音色、音色库、通道数、输入/输出端口、音量等。可以多个音轨,不唯一)
  12. self.RATE = rate # 采样率(即每秒采样多少数据)
  13. self._running = True
  14. self._frames = [] # 定义frames为一个空列表
  15. def start(self):
  16. _thread.start_new_thread(self.__recording, ())
  17. def __recording(self):
  18. self._running = True
  19. self._frames = []
  20. p = pyaudio.PyAudio() # 创建PyAudio对象
  21. stream = p.open(format=self.FORMAT, # 采样生成wav文件的正常格式
  22. channels=self.CHANNELS, # 音轨数
  23. rate=self.RATE, # 采样率
  24. input=True, # Ture代表这是一条输入流,False代表这不是输入流
  25. frames_per_buffer=self.CHUNK) # 每个缓冲多少帧
  26. while (self._running):
  27. data = stream.read(self.CHUNK) # 每次读chunk个数据
  28. self._frames.append(data) # 将读出的数据保存到列表中
  29. stream.stop_stream() # 停止输入流
  30. stream.close() # 关闭输入流
  31. p.terminate() # 终止pyaudio
  32. def stop(self):
  33. self._running = False
  34. def save_wave(self, filename):
  35. p = pyaudio.PyAudio() # 创建PyAudio对象
  36. if not filename.endswith(".wav"):
  37. filename = filename + ".wav"
  38. wf = wave.open(filename, 'wb') # 以’wb‘二进制流写的方式打开一个文件
  39. wf.setnchannels(self.CHANNELS) # 设置音轨数
  40. wf.setsampwidth(p.get_sample_size(self.FORMAT)) # 设置采样点数据的格式,和FOMART保持一致
  41. wf.setframerate(self.RATE) # 设置采样率与RATE要一致
  42. wf.writeframes(b''.join(self._frames)) # 将声音数据写入文件
  43. wf.close() # 数据流保存完,关闭文件
  44. def record(self):
  45. print('请按回车键开始录音:')
  46. a = input()
  47. if str.__len__(a) == 0:
  48. begin = time.time()
  49. print("开始录音ing")
  50. self.start()
  51. print("请按回车键停止录音:")
  52. b = input()
  53. if str.__len__(b) == 0:
  54. print("录音停止")
  55. self.stop()
  56. fina = time.time()
  57. t = fina - begin
  58. print('录音时间为%ds' % t)
  59. def positive(self):
  60. print('下面开始录音')
  61. self.record()
  62. self.save_wave("语音录音.wav")
  63. def save_txt(result, filename):
  64. if not filename.endswith(".txt"):
  65. filename = filename + ".txt"
  66. wf = open(filename, encoding='utf-8', mode='a+')
  67. wf.writelines(result)
  68. wf.writelines(['\n'])
  69. wf.close()
  70. def Rec_Vosk(filename):
  71. print('正在识别中......')
  72. # 使用Vosk语音模型识别
  73. r = sr.Recognizer() # 调用识别器
  74. audioFile = sr.AudioFile(filename) # 导入语音文件
  75. with audioFile as source:
  76. try:
  77. audioData = r.record(source) # 从文件中获取数据
  78. except sr.UnknownValueError:
  79. exec()
  80. def formulateResult(resu):
  81. start = resu.index('"', resu.index('"', resu.index('"') + 1) + 1) + 1
  82. end = resu.index('"', start)
  83. return resu[start:end]
  84. said = r.recognize_vosk(audioData) # 识别输出。下载的语音模型解压后须改文件夹名为“model”
  85. said = formulateResult(said)
  86. print("you said:", said)
  87. save_txt(said, '识别结果3.txt')
  88. with open('识别结果3.txt','r',encoding='UTF-8') as file: # 将长文截成50字每行
  89. lines = file.readlines()
  90. for line in lines:
  91. for a in range(1, len(line) // 60 + 2): # 将长文截成50字每行
  92. print('\033[33m',line[(60 * (a - 1)):60 * a].strip(),'\033[0m')
  93. def Rec_OpenAI_whisper(filename):
  94. print('正在识别中......')
  95. # 加载识别模型
  96. model = whisper.load_model("tiny") # 'tiny','base','medium','large'等模型,自动下载后保存在C:\Users\xxx\.cache\whisper
  97. source = model.transcribe(filename,language='Chinese',fp16 = True) # 识别
  98. said = source['text']
  99. save_txt(said, '识别结果4.txt')
  100. print("识别结果:",said)
  101. with open('识别结果4.txt','r',encoding='UTF-8') as file: # 将长文截成50字每行
  102. lines = file.readlines()
  103. for line in lines:
  104. for a in range(1, len(line) // 60 + 2):
  105. print('\033[33m',line[(60 * (a - 1)):60 * a].strip(),'\033[0m')
  106. if __name__ == '__main__':
  107. while True:
  108. print('*' * 24)
  109. print('1、重新录音')
  110. print('2、使用原有录音文件')
  111. print('3、选择Vosk模型识别')
  112. print('4、选择OpenAI_whisper识别')
  113. print('*' * 24)
  114. n = int(input('请选择1、2、3或4:'))
  115. if n == 1:
  116. rec = Recorder()
  117. rec.positive()
  118. if n == 2:
  119. filename = '语音录音.wav'
  120. if n == 3:
  121. Rec_Vosk('语音录音.wav')
  122. continue
  123. if n == 4:
  124. Rec_OpenAI_whisper('语音录音.wav')
  125. continue

注意因要把识别的长文输出固定短句,是从保存文档再次读取后截短的,而保存是增量保存而不是覆盖保存,因此输出短句还包括了所有前面的识别内容。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/994584
推荐阅读
相关标签
  

闽ICP备14008679号