Gistrec

KaldiRecognizer + ffmpeg

Nov 30th, 2023
1,040
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.01 KB | None | 0 0
  1. import asyncio
  2. import websockets
  3. from pydub import AudioSegment
  4. import io
  5. from vosk import Model, KaldiRecognizer
  6. import subprocess
  7.  
  8.  
  9. desired_bitrate = "1411k"
  10. desired_samplerate = "44100"
  11.  
  12.  
  13. vosk_model = Model("./model")
  14. recognizer = KaldiRecognizer(vosk_model, 44100)
  15.  
  16. recognizer.SetWords(True)  # Enable word-level timing information in the recognition results
  17. recognizer.SetMaxAlternatives(10)  # Adjust the maximum number of alternatives
  18.  
  19.  
  20. def save_audio_to_wav(audio_data, filename):
  21.     # Convert WebM audio data to WAV
  22.     audio_segment = AudioSegment.from_file(io.BytesIO(audio_data), format="webm")
  23.     audio_segment.export(filename, format="wav")
  24.  
  25.     # Run ffmpeg command for downsampling and controlling bitrate
  26.     ffmpeg_command = [
  27.         "ffmpeg",
  28.         "-y",  # Automatically overwrite files
  29.         "-i", filename,
  30.         "-ar", desired_samplerate, # Set the sample rate to 44100 Hz
  31.         "-b:a", desired_bitrate,   # Set the bitrate
  32.         filename.replace(".webm", ".wav")
  33.     ]
  34.  
  35.     subprocess.run(ffmpeg_command)
  36.  
  37.  
  38. async def audio_handler(websocket, path):
  39.     print("WebSocket connection established")
  40.  
  41.     try:
  42.         async for message in websocket:
  43.             save_audio_to_wav(message, "temp.webm")  # Save WebM audio to a temporary WAV file
  44.             recognizer.AcceptWaveform(open("temp.wav", "rb").read())
  45.  
  46.             result = recognizer.Result()
  47.             print("Result:", result)
  48.  
  49.  
  50.         # Get the final recognition result
  51.         result = recognizer.FinalResult()
  52.         print("Final Result:", result)
  53.  
  54.  
  55.     except websockets.ConnectionClosed:
  56.         print("WebSocket connection closed")
  57.  
  58.  
  59. if __name__ == "__main__":
  60.     start_server = websockets.serve(audio_handler, "localhost", 8765)
  61.  
  62.     asyncio.get_event_loop().run_until_complete(start_server)
  63.     print("WebSocket server started")
  64.  
  65.     try:
  66.         asyncio.get_event_loop().run_forever()
  67.     except KeyboardInterrupt:
  68.         pass
  69.     finally:
  70.         print("WebSocket server stopped")
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment