エンベディッド・バリューのriffraff:音声処理ツールpzh-音声誕生(4) - オーディオ録音や放送達成(PyAudio)


  みなさん、こんにちは、私は、暴漢規模だまともな技術のriffraffに従事しています。あなたに今日riffraff値は約ある音声処理ツールの誕生はpzh-PY-スピーチオーディオの録音と放送が実現します

  オーディオ録音と放送は、Pythonは、オーディオ再生が付属していますし、録音機能は、オーディオ録音と放送を導入するために、今日ラフィアン値を実装するためのライブラリやサードパーティPyAudioライブラリを振ることを主な機能pzh-PY-スピーチ、およびpzh-PY-音声手段であり、 pzh-PY-スピーチがどのように実現されています。

A、はじめに波

  波は読み書きがオーディオファイルをWAV、およびWAVオーディオパラメータを解析することができ、標準ライブラリ、Pythonのです。読み書きにwavファイルライブラリによってpzh-PY-音声波、オーディオwavファイルのパラメータ(サンプリングのチャネル幅、サンプリング・レート)を読んで得るために、オーディオ波形ライブラリを再生することで、オーディオのパラメータを設定することで、オーディオ波形ライブラリを記録する場合と、 wavファイルとして保存します。ここでは、すべてのAPIを使用pzh-PY-スピーチです:

wave.open()

# wav音频读API
Wave_read.getnchannels()       # 获取音频通道数
Wave_read.getsampwidth()       # 获取音频采样宽度
Wave_read.getframerate()       # 获取音频采样率
Wave_read.getnframes()         # 获取音频总帧数
Wave_read.readframes(n)        # 读取音频帧数据
Wave_read.tell()               # 获取已读取的音频帧数
Wave_read.close()

# wav音频写API
Wave_write.setnchannels(n)     # 设置音频通道数
Wave_write.setsampwidth(n)     # 设置音频采样宽度
Wave_write.setframerate(n)     # 设置音频采样率
Wave_write.writeframes(data)   # 写入音频帧数据
Wave_write.close()

二、PyAudioプロフィール

  pythonパッケージメンテPyAudioライブラリオープンソースのクロスプラットフォームのオーディオライブラリPortAudioあるPyAudioはユベール・ファム、2006年に開始ライブラリーは、継続的にPyAudio 0.2.11を使用してpzh-PY-スピーチ、以降更新されています。
  波のライブラリの実装は、wavファイルの簡単な操作であれば、オーディオデータは、(PCのスピーカーにPCのマイク、オーディオストリームからオーディオストリームを取得含む)フロー制御を達成するためにpzh-PY-スピーチエイドPyAudioライブラリ、そしてPyAudioライブラリがありますインタラクティブオーディオ関連のハードウェアの実現。
  PyAudioプロジェクトの公式ホームページは次のよう:

  オーディオストリームのPyAudio制御はブロックの2種類があり、他方が、前者は一般に、そのような単純なローカルオーディオファイルプレーヤーとして(音声制御を決定するために使用される(コールバック)非ブロッキングであり、方法は存在しないであろう休止/)は、一般的に(例えば、音声記録などの柔軟なオーディオ制御のために使用される)他の動作を再開したが、イベントの終了前に応答を待ちます。後者でpzh-PY-スピーチ。以下は、オーディオプレーヤーの例を使用するには、2つの方法があります。

import pyaudio
import wave

CHUNK = 1024

wf = wave.open(“test.wav”, 'rb')
p = pyaudio.PyAudio()

##########################################################
# 此为阻塞式,循环读取1024个byte音频数据去播放,直到test.wav文件数据被全部读出
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True)
data = wf.readframes(CHUNK)
while data != '':
    stream.write(data)
    data = wf.readframes(CHUNK)
##########################################################
# 此为非阻塞式的(callback),系统会自动读取test.wav文件里的音频帧,直到播放完毕
def callback(in_data, frame_count, time_info, status):
    data = wf.readframes(frame_count)
    return (data, pyaudio.paContinue)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True,
                stream_callback=callback)
stream.start_stream()
while stream.is_active():
    time.sleep(0.1)
##########################################################

stream.stop_stream()
stream.close()
p.terminate()

三、pzh-PY-スピーチオーディオの録音や放送達成

3.1プレイ実現

  >プレイ - - >一時停止 - >再開 - >エンド制御、そのプレイヤーは途中で中断と再開を達成するために、コードのように、再生複雑ではありませんが、pzh-PY-スピーチは5つの状態のスタートプレイボタンで実装されている自分自身を実現もう少し複雑。サスペンド状態では、まだPyAudioは、いくつかの空のデータを返す与えなければならない場合は、ここでの焦点は、他の支店でplayAudioCallback()関数です。

import wave
import pyaudio

AUDIO_PLAY_STATE_START = 0
AUDIO_PLAY_STATE_PLAY = 1
AUDIO_PLAY_STATE_PAUSE = 2
AUDIO_PLAY_STATE_RESUME = 3
AUDIO_PLAY_STATE_END = 4

class mainWin(win.speech_win):

    def __init__(self, parent):
        # ...
        # Start -> Play -> Pause -> Resume -> End
        self.playState = AUDIO_PLAY_STATE_START

    def viewAudio( self, event ):
        self.wavPath =  self.m_genericDirCtrl_audioDir.GetFilePath()
        if self.playState != AUDIO_PLAY_STATE_START:
            self.playState = AUDIO_PLAY_STATE_END
            self.m_button_play.SetLabel('Play Start')

    def playAudioCallback(self, in_data, frame_count, time_info, status):
        if self.playState == AUDIO_PLAY_STATE_PLAY or self.playState == AUDIO_PLAY_STATE_RESUME:
            data = self.wavFile.readframes(frame_count)
            if self.wavFile.getnframes() == self.wavFile.tell():
                status = pyaudio.paComplete
                self.playState = AUDIO_PLAY_STATE_END
                self.m_button_play.SetLabel('Play Start')
            else:
                status = pyaudio.paContinue
            return (data, status)
        else:
            # Note!!!:
            data = numpy.zeros(frame_count*self.wavFile.getnchannels()).tostring()
            return (data, pyaudio.paContinue)

    def playAudio( self, event ):
        if os.path.isfile(self.wavPath):
            if self.playState == AUDIO_PLAY_STATE_END:
                self.playState = AUDIO_PLAY_STATE_START
                self.wavStream.stop_stream()
                self.wavStream.close()
                self.wavPyaudio.terminate()
                self.wavFile.close()
            if self.playState == AUDIO_PLAY_STATE_START:
                self.playState = AUDIO_PLAY_STATE_PLAY
                self.m_button_play.SetLabel('Play Pause')
                self.wavFile =  wave.open(self.wavPath, "rb")
                self.wavPyaudio = pyaudio.PyAudio()
                self.wavStream = self.wavPyaudio.open(format=self.wavPyaudio.get_format_from_width(self.wavFile.getsampwidth()),
                                                      channels=self.wavFile.getnchannels(),
                                                      rate=self.wavFile.getframerate(),
                                                      output=True,
                                                      stream_callback=self.playAudioCallback)
                self.wavStream.start_stream()
            elif self.playState == AUDIO_PLAY_STATE_PLAY or self.playState == AUDIO_PLAY_STATE_RESUME:
                self.playState = AUDIO_PLAY_STATE_PAUSE
                self.m_button_play.SetLabel('Play Resume')
            elif self.playState == AUDIO_PLAY_STATE_PAUSE:
                self.playState = AUDIO_PLAY_STATE_RESUME
                self.m_button_play.SetLabel('Play Pause')
            else:
                pass

3.2記録達成

  >エンドは、中断後に記録を継続サポートしていません - 2種類の状態で録音ボタンがスタートするので、いくつかの簡単な上の機能を記録、再生を比較しました。ここでの焦点は、主に3つのオーディオパラメータ(サンプリング幅、サンプルレート、チャンネル数)のサポートの設定です:

import wave
import pyaudio

class mainWin(win.speech_win):

    def recordAudioCallback(self, in_data, frame_count, time_info, status):
        if not self.isRecording:
            status = pyaudio.paComplete
        else:
            self.wavFrames.append(in_data)
            status = pyaudio.paContinue
        return (in_data, status)

    def recordAudio( self, event ):
        if not self.isRecording:
            self.isRecording = True
            self.m_button_record.SetLabel('Record Stop')
            # Get the wave parameter from user settings
            fileName = self.m_textCtrl_recFileName.GetLineText(0)
            if fileName == '':
                fileName = 'rec_untitled1.wav'
            self.wavPath = os.path.join(os.path.dirname(os.path.abspath(os.path.dirname(__file__))), 'conv', 'rec', fileName)
            self.wavSampRate = int(self.m_choice_sampRate.GetString(self.m_choice_sampRate.GetSelection()))
            channels = self.m_choice_channels.GetString(self.m_choice_channels.GetSelection())
            if channels == 'Mono':
                self.wavChannels = 1
            else: #if channels == 'Stereo':
                self.wavChannels = 2
            bitDepth = int(self.m_choice_bitDepth.GetString(self.m_choice_bitDepth.GetSelection()))
            if bitDepth == 8:
                self.wavBitFormat = pyaudio.paInt8
            elif bitDepth == 24:
                self.wavBitFormat = pyaudio.paInt24
            elif bitDepth == 32:
                self.wavBitFormat = pyaudio.paFloat32
            else:
                self.wavBitFormat = pyaudio.paInt16
            # Record audio according to wave parameters
            self.wavFrames = []
            self.wavPyaudio = pyaudio.PyAudio()
            self.wavStream = self.wavPyaudio.open(format=self.wavBitFormat,
                                                  channels=self.wavChannels,
                                                  rate=self.wavSampRate,
                                                  input=True,
                                                  frames_per_buffer=AUDIO_CHUNK_SIZE,
                                                  stream_callback=self.recordAudioCallback)
            self.wavStream.start_stream()
        else:
            self.isRecording = False
            self.m_button_record.SetLabel('Record Start')
            self.wavStream.stop_stream()
            self.wavStream.close()
            self.wavPyaudio.terminate()
            # Save the wave data into file
            wavFile = wave.open(self.wavPath, 'wb')
            wavFile.setnchannels(self.wavChannels)
            wavFile.setsampwidth(self.wavPyaudio.get_sample_size(self.wavBitFormat))
            wavFile.setframerate(self.wavSampRate)
            wavFile.writeframes(b''.join(self.wavFrames))
            wavFile.close()

  これまでのところ、pzh-PY-スピーチ出生音声録音やオーディオ処理ツールを放送終了バランスriffraffを達成するために導入され、拍手~~~

参考資料

  1. Pythonの分析法のWAVファイルと波形を描きます

おすすめ

転載: www.cnblogs.com/henjay724/p/12242470.html