2016-04-06 23 views
11

Bunun oldukça yaygın bir sorun olduğunu düşünüyorum ancak henüz uygun bir yanıt bulamadım. İnsan sesinin birçok ses dosyası var, kelimeler üzerinde kırmak istiyorum, bu da dalga formunda duraklamalara bakarak sezgisel olarak yapılabilir, ancak herkes beni otomatik olarak yapan bir işlev/kütüphaneye yönlendirebilir mi?Konuşma ses dosyasını python'daki sözcüklere bölme

+2

[ses dosyalarını transkripsiyona adanmış] (https://github.com/Uberi/speech_recognition/blob/master/examples/audio_transcribe.py). Bir dahaki sefere, Google ilk olarak :) –

+1

Ben transkribe edebilecek bir işlev istemedim, ama daha çok transkripsiyonda örtük olsa da, aynı şey değil kelimelerdeki bir ses dosyasını bölebilirsiniz. SpeechRecognition paketine aşinayım. – user3059201

+0

Gerçek konuşmadaki kelimeler arasında sınır yoktur, akustik ipuçları olmadan tek bir yığın olarak "nasılsınız" diyorsunuz. Eğer kelimeler üzerinde bölünmek istiyorsanız, transkripsiyon yapmalısınız. –

cevap

2

Audiolab'a bakabilirsiniz. Ses örneklerini numpy dizilerine dönüştürmek için iyi bir API sağlar. Audiolab modülü ağır kaldırmayı yapmak için libsndfile C++ kütüphanesini kullanır.

Daha sonra durakları bulmak için daha düşük değerleri bulmak için dizileri ayrıştırabilirsiniz.

9

Bunu yapmanın daha kolay bir yolu pydub modülünü kullanmaktır. silent utilities'un son eklenmesi, setting up silence threahold, setting up silence length gibi tüm ağır kaldırma işlemlerini gerçekleştirir. vb. ve belirtilen diğer yöntemlerin aksine kodları önemli ölçüde basitleştirir.

İşte here

Ayarlar Bir demo uygulaması, ilham kaynağıdır:

ben dosya "a-z.wav" içinde Z için A den konuşulan ingilizce harflerle bir ses dosyası vardı. Geçerli çalışma dizininde bir alt dizin splitAudio oluşturuldu. Demo kodu çalıştırıldıktan sonra dosyalar her bir heceyi saklayan her ses dosyasıyla 26 ayrı dosyaya bölünmüştür.

Gözlemler: hece bazıları muhtemelen aşağıdaki parametrelerin değişiklik ihtiyacı, kesildi, silence_thresh=-16

Bir min_silence_len=500

kişinin kendi ihtiyacına ayarlamak bu isteyebilirsiniz.

Demo Kodu:

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

Çıktı:

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

kullanın IBM STT. timestamps=true'u kullanarak, sistemin konuşulduğunu algıladığında, sözcüklerin parçalanmasını sağlayabilirsiniz.

word_alternatives_threshold gibi başka pek çok harika özellik, sözcüklerin başka bir deyişle, sistemin sistem tarafından tahmin edilmesine yönelik güvenin sağlanması için başka sözcük seçenekleri ve word_confidence olsun. Gerçek bir fikir edinmek için word_alternatives_threshold'u (0.1 ve 0.01) arasında ayarlayın.

Bu, kullanıcı adı ve oluşturulan parolayı kullanabildiğiniz aşağıdaki oturum açma işlemi gerektirir.

IBM STT, söz konusu konuşma yeniden tanıma modülünün bir parçasıdır, ancak zaman damgasını almak için işlevi değiştirmeniz gerekecektir.

Bir çıkarılan ve benzeri modifiye formu görünür: Bunu [ `SpeechRecognition`] (https://pypi.python.org/pypi/SpeechRecognition/), açıkça bir örnek olan aradığınız

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) 
İlgili konular