web-dev-qa-db-ja.com

pythonの単語のスピーチオーディオファイルを分割

これはかなり一般的な問題のように感じますが、適切な答えはまだ見つかりません。私は言葉で中断したい人間のスピーチのオーディオファイルをたくさん持っています。これは波形の一時停止を見ることでヒューリスティックに行うことができますが、誰でもpythonで関数/ライブラリを指すことができます=これは自動的にこれを行いますか?

18
user3059201

これを行う簡単な方法は、 pydub モジュールを使用することです。最近追加された サイレントユーティリティ は、setting up silence threaholdsetting up silence length。他の方法とは対照的に、コードを大幅に簡素化します。

これはデモ実装です here からのインスピレーション

セットアップ:

ファイル "a-z.wav"にAからZの英語の文字を含む音声ファイルがありました。サブディレクトリsplitAudioが現在の作業ディレクトリに作成されました。デモコードを実行すると、ファイルは26個の個別のファイルに分割され、各オーディオファイルには各音節が格納されます。

観測:いくつかの音節が切り取られたため、次のパラメータの変更が必要になる場合があります。
min_silence_len=500
silence_thresh=-16

これらを自分の要件に合わせて調整することができます。

デモコード:

from pydub import AudioSegment
from pydub.silence import split_on_silence

sound_file = AudioSegment.from_wav("a-z.wav")
audio_chunks = split_on_silence(sound_file, 
    # must be silent for at least half a second
    min_silence_len=500,

    # consider it silent if quieter than -16 dBFS
    silence_thresh=-16
)

for i, chunk in enumerate(audio_chunks):

    out_file = ".//splitAudio//chunk{0}.wav".format(i)
    print "exporting", out_file
    chunk.export(out_file, format="wav")

出力:

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
exporting .//splitAudio//chunk0.wav
exporting .//splitAudio//chunk1.wav
exporting .//splitAudio//chunk2.wav
exporting .//splitAudio//chunk3.wav
exporting .//splitAudio//chunk4.wav
exporting .//splitAudio//chunk5.wav
exporting .//splitAudio//chunk6.wav
exporting .//splitAudio//chunk7.wav
exporting .//splitAudio//chunk8.wav
exporting .//splitAudio//chunk9.wav
exporting .//splitAudio//chunk10.wav
exporting .//splitAudio//chunk11.wav
exporting .//splitAudio//chunk12.wav
exporting .//splitAudio//chunk13.wav
exporting .//splitAudio//chunk14.wav
exporting .//splitAudio//chunk15.wav
exporting .//splitAudio//chunk16.wav
exporting .//splitAudio//chunk17.wav
exporting .//splitAudio//chunk18.wav
exporting .//splitAudio//chunk19.wav
exporting .//splitAudio//chunk20.wav
exporting .//splitAudio//chunk21.wav
exporting .//splitAudio//chunk22.wav
exporting .//splitAudio//chunk23.wav
exporting .//splitAudio//chunk24.wav
exporting .//splitAudio//chunk25.wav
exporting .//splitAudio//chunk26.wav
>>> 
21
Anil_M

IBM STT を使用します。 timestamps=trueを使用すると、話されたことをシステムが検出すると、Wordが分割されます。

Word_alternatives_thresholdのような他の単語の可能性を取得するWord_confidenceなど、システムがWordを予測する際の信頼性を取得するなど、他の多くのクールな機能があります。 Word_alternatives_thresholdを(0.1から0.01)の間に設定して、実際のアイデアを得ます。

これにはサインオンが必要で、それに続いて生成されたユーザー名とパスワードを使用できます。

IBM STTはすでに述べた音声認識モジュールの一部ですが、Wordのタイムスタンプを取得するには、関数を変更する必要があります。

抽出および変更されたフォームは次のようになります。

def extracted_from_sr_recognize_ibm(audio_data, username=IBM_USERNAME, password=IBM_PASSWORD, language="en-US", show_all=False, timestamps=False,
                                Word_confidence=False, Word_alternatives_threshold=0.1):
    assert isinstance(username, str), "``username`` must be a string"
    assert isinstance(password, str), "``password`` must be a string"

    flac_data = audio_data.get_flac_data(
        convert_rate=None if audio_data.sample_rate >= 16000 else 16000,  # audio samples should be at least 16 kHz
        convert_width=None if audio_data.sample_width >= 2 else 2  # audio samples should be at least 16-bit
    )
    url = "https://stream-fra.watsonplatform.net/speech-to-text/api/v1/recognize?{}".format(urlencode({
        "profanity_filter": "false",
        "continuous": "true",
        "model": "{}_BroadbandModel".format(language),
        "timestamps": "{}".format(str(timestamps).lower()),
        "Word_confidence": "{}".format(str(Word_confidence).lower()),
        "Word_alternatives_threshold": "{}".format(Word_alternatives_threshold)
    }))
    request = Request(url, data=flac_data, headers={
        "Content-Type": "audio/x-flac",
        "X-Watson-Learning-Opt-Out": "true",  # prevent requests from being logged, for improved privacy
    })
    authorization_value = base64.standard_b64encode("{}:{}".format(username, password).encode("utf-8")).decode("utf-8")
    request.add_header("Authorization", "Basic {}".format(authorization_value))

    try:
        response = urlopen(request, timeout=None)
    except HTTPError as e:
        raise sr.RequestError("recognition request failed: {}".format(e.reason))
    except URLError as e:
        raise sr.RequestError("recognition connection failed: {}".format(e.reason))
    response_text = response.read().decode("utf-8")
    result = json.loads(response_text)

    # return results
    if show_all: return result
    if "results" not in result or len(result["results"]) < 1 or "alternatives" not in result["results"][0]:
        raise Exception("Unknown Value Exception")

    transcription = []
    for utterance in result["results"]:
        if "alternatives" not in utterance:
            raise Exception("Unknown Value Exception. No Alternatives returned")
        for hypothesis in utterance["alternatives"]:
            if "transcript" in hypothesis:
                transcription.append(hypothesis["transcript"])
    return "\n".join(transcription)
3
MonsieurBeilto

Audiolab をご覧ください。音声サンプルを numpy 配列に変換するための適切なAPIを提供します。 Audiolabモジュールは、libsndfile C++ライブラリを使用して面倒な作業を行います。

その後、配列を解析してより低い値を見つけ、休止を見つけることができます。

2
Piyush Sharma

pyAudioAnalysis は、単語が明確に分離されている場合にオーディオファイルをセグメント化できます(自然な音声ではほとんどありません)。このパッケージは比較的使いやすいです。

python pyAudioAnalysis/pyAudioAnalysis/audioAnalysis.py silenceRemoval -i SPEECH_AUDIO_FILE_TO_SPLIT.mp3 --smoothing 1.0 --weight 0.3

blog の詳細。

1
epo3