使用 Python 创建语音录音机



在这里,我们将使用 Python 创建一个应用程序(语音录音机),允许用户录制语音。我们将使用 sounddevice 库和 Python 创建此语音录音机应用程序。

使用语音录音机,您可以启动录制过程、暂停它或在必要时取消。录制的声音保存为两种格式 WAV 和 WAVIO。此语音录音机应用程序可用于只需要简单音频录制和回放的应用程序。

所需库

要在 Python 中创建语音录音机,以下为所需的库:

  • sounddevice - sounddevice 库将用于捕获音频。
  • scipy - 此库将用于使用 write 函数写入 WAV 文件。
  • wavio - 此库将用于使用其他选项写入 wav 文件。
  • numpy - 此库将用于矩阵或数组计算。

安装

要安装创建语音记录所需的库,您需要使用 PIP 安装这些库。使用以下语句一次安装所有所需的库:

pip install sounddevice scipy wavio numpy

创建语音录音机的步骤

1. 导入库

安装完成后,您需要在代码中导入所有库。要导入所需的库,请使用以下代码语句:

import sounddevice as sd
from scipy.io.wavfile import write
import wavio as wv
import numpy as np
import threading

步骤 2:初始化变量

使用以下代码设置采样频率和用于管理录制状态的标志:

  • 设置采样频率:
freq = 44100
  • 存储录制的音频片段:
recording = []
  • 设置默认标志值以检查录制是否处于活动状态:
is_recording = False
  • 设置默认标志值以停止录制:
stop_recording = False

步骤 3:定义录制函数

创建一个函数来处理循环中的音频录制,并将每个片段追加到录制列表中。使用以下代码:

def record_audio():
   global recording, is_recording, stop_recording
   is_recording = True
   while is_recording and not stop_recording:
      recording_segment = sd.rec(int(freq), samplerate=freq, channels=2)
      sd.wait()  # Wait until the recording is finished
      recording.append(recording_segment)

步骤 4:定义输入处理函数

实现一个函数来处理用于录制控制(开始、暂停、停止)的用户命令。使用以下代码:

def handle_input():
   global is_recording, stop_recording
   while True:
      user_input = input("r to START , p to PAUSE and s to STOP the recording, please choice accordingly \n Enter command: ").lower()
      if user_input == 'p':
         if is_recording:
            print("Recording Paused, (you can again start the recording using 'r')")
            is_recording = False
         else:
            print("Recording is not active.")
      elif user_input == 'r':
         if not is_recording:
            print("Recording Resumed (type 'p' to pause or 's' to stop)")
            threading.Thread(target=record_audio).start()
         else:
            print("Already recording.")
      elif user_input == 's':
         if is_recording:
            print("Stopping recording. Thank you for recording :)")
            is_recording = False
            stop_recording = True
            break
         else:
            print("Nothing to stop.")

步骤 5:组合并保存录制

停止录制后,将所有录制片段组合成一个音频文件,并将其保存为不同的格式。使用以下代码:

if recording:
   final_recording = np.concatenate(recording, axis=0)
   write("recording0.wav", freq, final_recording)
   wv.write("recording1.wav", final_recording, freq, sampwidth=2)
   print("Recording saved as 'recording0.wav' and 'recording1.wav'.")
else:
   print("No recording was made.")

创建语音录音机的 Python 代码

以下是使用 Python 创建语音录音机应用程序的完整代码:

import sounddevice as sd
from scipy.io.wavfile import write
import wavio as wv
import numpy as np
import threading
# Sampling frequency
freq = 44100

# Initialize recording variables
recording = []
is_recording = False
stop_recording = False

def record_audio():
   global recording, is_recording, stop_recording
   is_recording = True
   while is_recording and not stop_recording:
      recording_segment = sd.rec(int(freq), samplerate=freq, channels=2)
      sd.wait()
      recording.append(recording_segment)

def handle_input():
   global is_recording, stop_recording
   while True:
      user_input = input("r to START , p to PAUSE and s to STOP the recording, please choice accordingly \n Enter command: ").lower()
      if user_input == 'p':
         if is_recording:
            print("Recording Paused, (you can again start the recording using 's') ")
            is_recording = False
         else:
            print("Recording is not working activly.")
      elif user_input == 'r':
         if not is_recording:
            print("Recording Resumed (type 'p' to pause or 's' to stop)")
            threading.Thread(target=record_audio).start()
         else:
            print("Already recording.")
      elif user_input == 's':
         if is_recording:
            print("Stopping recording. Thank you for recording :) ")
            is_recording = False
            stop_recording = True
            break
         else:
            print(" Nothing to stop.")

# Start the input handler in a separate thread
input_thread = threading.Thread(target=handle_input)
input_thread.start()

# Wait for the input thread to complete
input_thread.join()

# Combine all the recorded segments
if recording:
   final_recording = np.concatenate(recording, axis=0)
   write("recording0.wav", freq, final_recording)
   wv.write("recording1.wav", final_recording, freq, sampwidth=2)
   print("Recording saved as 'recording0.wav' and 'recording1.wav'.")
else:
   print("No recording was made.")

输出

运行此代码后,您将看到按下“r”键开始录制,“p”键暂停,“s”键停止录制。

Voice Recorder

现在您还可以在您的电脑上看到录制的音频文件。

Voice Recorder

之后,您就可以成功收听您的音频文件了。

Voice Recorder

代码解释

  • **导入库** - 导入用于录制和处理音频以及管理音频文件的库。
  • **初始化变量** - 应设置“采样率”、“录制列表”和“标志”作为录制控制参数。
  • **定义 record_audio 函数** - 录制音频片段并将其添加到列表中。
  • **定义 handle_input 函数** - 操作用户开始或停止录制过程的指令。
  • **启动输入处理线程** - 在线程中管理输入处理函数,以避免游戏冻结。
  • **等待输入线程完成** - 在继续执行主线程的后续操作之前,等待输入线程完成执行。
  • **合并录制片段** - 将所有录制的音频片段组合成一个轨道或称为片段。
  • **以 WAV 格式保存录制** - 通过两种方法将组合后的音频保存为 WAV 文件。
  • **打印完成消息** - 让用户知道录制已成功保存。
  • **处理无录制场景** - 如果未录制任何音频,则发出警报。
python_reference.htm
广告