Я чувствую, что это довольно распространенная проблема, но я еще не нашел подходящего ответа. У меня есть много аудиофайлов человеческой речи, которые я хотел бы разбить на словах, что можно сделать эвристически, если посмотреть на паузы в форме волны, но может ли кто-нибудь указать мне на функцию/библиотеку в python, которая делает это автоматически?
Разделить речевой аудиофайл на слова в python
Ответ 1
Более простой способ сделать это - использовать pydub. недавнее добавление silent utilities делает весь тяжелый подъем, такой как setting up silence threahold
, setting up silence length
. и т.д. и значительно упрощает код, в отличие от других упомянутых методов.
Вот демонстрационная реализация, вдохновение из здесь
Настройка:
У меня был аудиофайл с разговорными английскими буквами от A
до Z
в файле "a-z.wav". Подкаталог 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
>>>
Ответ 2
Используйте IBM STT. Используя timestamps=true
, вы получите слово сломаться вместе с тем, когда система обнаруживает, что они были произнесены.
Существует множество других интересных функций, таких как word_alternatives_threshold
, чтобы получить другие возможности слов и word_confidence
, чтобы получить уверенность, с которой система предсказывает слово. Установите word_alternatives_threshold
между (0,1 и 0,01), чтобы получить реальную идею.
Для этого необходимо войти в аккаунт, после чего вы можете использовать имя пользователя и пароль.
IBM STT уже является частью упомянутого модуля распознавания речи, но чтобы получить слово timestamp, вам нужно будет изменить функцию.
Выбранная и модифицированная форма выглядит следующим образом:
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
Вы можете посмотреть Audiolab Он предоставляет достойный API для преобразования голосовых образцов в numpy. Модуль Audiolab использует библиотеку libsndfile С++ для тяжелой работы.
Затем вы можете проанализировать массивы, чтобы найти более низкие значения, чтобы найти паузы.