2016-04-06 17 views
11

Tôi cảm thấy đây là một vấn đề khá phổ biến nhưng tôi chưa tìm thấy câu trả lời phù hợp. Tôi có nhiều tập tin âm thanh của bài phát biểu con người mà tôi muốn chia lời, có thể được thực hiện bằng cách xem xét tạm dừng trong dạng sóng, nhưng bất cứ ai có thể chỉ cho tôi một hàm/thư viện trong python tự động thực hiện điều này?Chia nhỏ tập tin âm thanh lời nói thành các từ trong python

+2

Bạn đang tìm kiếm [ 'SpeechRecognition'] (https://pypi.python.org/pypi/SpeechRecognition/), mà rõ ràng có một ví dụ dành riêng cho [sao chép tệp âm thanh] (https://github.com/Uberi/speech_recognition/blob/master/examples/audio_transcribe.py). Lần sau, Google đầu tiên :) –

+1

Tôi đã không yêu cầu một chức năng có thể phiên âm, nhưng thay vào đó có thể tách một tệp âm thanh trên các từ, mặc dù có thể tiềm ẩn trong phiên âm, không phải là điều tương tự. Tôi quen với gói SpeechRecognition. – user3059201

+0

Không có ranh giới giữa các từ trong lời nói thực, bạn nói "bạn thế nào" như một đoạn đơn lẻ mà không có bất kỳ dấu hiệu âm thanh nào. Nếu bạn muốn chia nhỏ các từ, bạn cần phải phiên âm. –

Trả lời

2

Bạn có thể xem Audiolab Nó cung cấp API phong nha để chuyển đổi mẫu giọng nói thành các mảng numpy. Mô-đun Audiolab sử dụng thư viện libsndfile C++ để thực hiện việc nâng hạng nặng.

Sau đó, bạn có thể phân tích cú pháp mảng để tìm giá trị thấp hơn để tìm tạm dừng.

9

Cách dễ dàng hơn để thực hiện việc này là sử dụng mô-đun pydub. bổ sung gần đây của silent utilities thực hiện tất cả việc nâng hạng nặng như setting up silence threahold, setting up silence length. vv và đơn giản hóa mã đáng kể như trái ngược với các phương pháp khác được đề cập.

Đây là một thực hiện demo, cảm hứng từ here

Setup:

Tôi đã có một tập tin âm thanh với chữ cái tiếng Anh nói từ A để Z trong file "một-z.wav". Một thư mục con splitAudio đã được tạo trong thư mục làm việc hiện tại. Khi thực thi mã demo, các tệp được chia thành 26 tệp riêng biệt với mỗi tệp âm thanh lưu trữ từng âm tiết.

Quan sát: Một số âm tiết bị cắt đứt, có thể cần phải sửa đổi các thông số sau,
min_silence_len=500
silence_thresh=-16

Một có thể muốn điều chỉnh những yêu cầu riêng của mình.

Demo Code:

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") 

Output:

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 
>>> 
3

Sử dụng IBM STT. Sử dụng timestamps=true bạn sẽ nhận được từ chia tay cùng với khi hệ thống phát hiện chúng đã được nói.

Có rất nhiều tính năng thú vị khác như word_alternatives_threshold để nhận các khả năng khác của từ và word_confidence để có được sự tự tin mà hệ thống dự đoán từ đó. Đặt word_alternatives_threshold ở giữa (0,1 và 0,01) để có ý tưởng thực sự.

Yêu cầu này đăng nhập, sau đó bạn có thể sử dụng tên người dùng và mật khẩu được tạo.

STT của IBM đã là một phần của mô-đun nhận dạng giọng nói được đề cập, nhưng để nhận được dấu thời gian từ, bạn sẽ cần sửa đổi hàm.

Một chiết xuất và hình thức sửa đổi trông giống như:

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) 
Các vấn đề liên quan