最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解python的webrtc庫實(shí)現(xiàn)語音端點(diǎn)檢測

 更新時(shí)間:2017年05月31日 08:47:24   作者:舒林笑笑生  
這篇文章主要介紹了詳解python的webrtc庫實(shí)現(xiàn)語音端點(diǎn)檢測,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

引言

語音端點(diǎn)檢測最早應(yīng)用于電話傳輸和檢測系統(tǒng)當(dāng)中,用于通信信道的時(shí)間分配,提高傳輸線路的利用效率.端點(diǎn)檢測屬于語音處理系統(tǒng)的前端操作,在語音檢測領(lǐng)域意義重大.

但是目前的語音端點(diǎn)檢測,尤其是檢測 人聲 開始和結(jié)束的端點(diǎn)始終是屬于技術(shù)難點(diǎn),各家公司始終處于 能判斷,但是不敢保證 判別準(zhǔn)確性 的階段.

Screenshot from 2017-05-25 22-42-50.png 

現(xiàn)在基于云端語義庫的聊天機(jī)器人層出不窮,其中最著名的當(dāng)屬amazon的 Alexa/Echo 智能音箱.

timg.jpg

國內(nèi)如雨后春筍般出現(xiàn)了各種搭載語音聊天的智能音箱(如前幾天在知乎上廣告的若琪機(jī)器人)和各類智能機(jī)器人產(chǎn)品.國內(nèi)語音服務(wù)提供商主要面對(duì)中文語音服務(wù),由于語音不像圖像有分辨率等等較為客觀的指標(biāo),很多時(shí)候憑主觀判斷,所以較難判斷各家語音識(shí)別和合成技術(shù)的好壞.但是我個(gè)人認(rèn)為,國內(nèi)的中文語音服務(wù)和國外的英文語音服務(wù),在某些方面已經(jīng)有超越的趨勢.

timg (1).jpg

通常搭建機(jī)器人聊天系統(tǒng)主要包括以下三個(gè)方面: 

  1.  語音轉(zhuǎn)文字(ASR/STT)
  2.  語義內(nèi)容(NLU/NLP)
  3.  文字轉(zhuǎn)語音(TTS)

語音轉(zhuǎn)文字(ASR/STT)

在將語音傳給云端API之前,是本地前端的語音采集,這部分主要包括如下幾個(gè)方面: 

  1.  麥克風(fēng)降噪
  2.  聲源定位
  3.  回聲消除
  4.  喚醒詞
  5.  語音端點(diǎn)檢測
  6.  音頻格式壓縮

python 端點(diǎn)檢測

由于實(shí)際應(yīng)用中,單純依靠能量檢測特征檢測等方法很難判斷人聲說話的起始點(diǎn),所以市面上大多數(shù)的語音產(chǎn)品都是使用喚醒詞判斷語音起始.另外加上聲音回路,還可以做語音打斷.這樣的交互方式可能有些傻,每次必須喊一下 喚醒詞 才能繼續(xù)聊天.這種方式聊多了,個(gè)人感覺會(huì)嘴巴疼:-O .現(xiàn)在github上有snowboy喚醒詞的開源庫,大家可以登錄snowboy官網(wǎng)訓(xùn)練自己的喚醒詞模型. 

  1.  Kitt-AI : Snowboy 
  2.  Sensory : Sensory

考慮到用喚醒詞嘴巴會(huì)累,所以大致調(diào)研了一下,Python擁有豐富的庫,直接import就能食用.這種方式容易受強(qiáng)噪聲干擾,適合一個(gè)人在家玩玩. 

  1.  pyaudio: pip install pyaudio 可以從設(shè)備節(jié)點(diǎn)讀取原始音頻流數(shù)據(jù),音頻編碼是PCM格式;
  2.  webrtcvad: pip install webrtcvad 檢測判斷一組語音數(shù)據(jù)是否為空語音;

當(dāng)檢測到持續(xù)時(shí)間長度 T1 vad檢測都有語音活動(dòng),可以判定為語音起始;

當(dāng)檢測到持續(xù)時(shí)間長度 T2 vad檢測都沒有有語音活動(dòng),可以判定為語音結(jié)束;

完整程序代碼可以從我的github下載

程序很簡單,相信看一會(huì)兒就明白了

'''
Requirements:
+ pyaudio - `pip install pyaudio`
+ py-webrtcvad - `pip install webrtcvad`
'''
import webrtcvad
import collections
import sys
import signal
import pyaudio

from array import array
from struct import pack
import wave
import time

FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
CHUNK_DURATION_MS = 30    # supports 10, 20 and 30 (ms)
PADDING_DURATION_MS = 1500  # 1 sec jugement
CHUNK_SIZE = int(RATE CHUNK_DURATION_MS / 1000) # chunk to read
CHUNK_BYTES = CHUNK_SIZE 2 # 16bit = 2 bytes, PCM
NUM_PADDING_CHUNKS = int(PADDING_DURATION_MS / CHUNK_DURATION_MS)
# NUM_WINDOW_CHUNKS = int(240 / CHUNK_DURATION_MS)
NUM_WINDOW_CHUNKS = int(400 / CHUNK_DURATION_MS) # 400 ms/ 30ms ge
NUM_WINDOW_CHUNKS_END = NUM_WINDOW_CHUNKS 2

START_OFFSET = int(NUM_WINDOW_CHUNKS CHUNK_DURATION_MS 0.5 RATE)

vad = webrtcvad.Vad(1)

pa = pyaudio.PyAudio()
stream = pa.open(format=FORMAT,
         channels=CHANNELS,
         rate=RATE,
         input=True,
         start=False,
         # input_device_index=2,
         frames_per_buffer=CHUNK_SIZE)


got_a_sentence = False
leave = False


def handle_int(sig, chunk):
  global leave, got_a_sentence
  leave = True
  got_a_sentence = True


def record_to_file(path, data, sample_width):
  "Records from the microphone and outputs the resulting data to 'path'"
  # sample_width, data = record()
  data = pack('<' + ('h' len(data)), data)
  wf = wave.open(path, 'wb')
  wf.setnchannels(1)
  wf.setsampwidth(sample_width)
  wf.setframerate(RATE)
  wf.writeframes(data)
  wf.close()


def normalize(snd_data):
  "Average the volume out"
  MAXIMUM = 32767 # 16384
  times = float(MAXIMUM) / max(abs(i) for i in snd_data)
  r = array('h')
  for i in snd_data:
    r.append(int(i times))
  return r

signal.signal(signal.SIGINT, handle_int)

while not leave:
  ring_buffer = collections.deque(maxlen=NUM_PADDING_CHUNKS)
  triggered = False
  voiced_frames = []
  ring_buffer_flags = [0] NUM_WINDOW_CHUNKS
  ring_buffer_index = 0

  ring_buffer_flags_end = [0] NUM_WINDOW_CHUNKS_END
  ring_buffer_index_end = 0
  buffer_in = ''
  # WangS
  raw_data = array('h')
  index = 0
  start_point = 0
  StartTime = time.time()
  print(" recording: ")
  stream.start_stream()

  while not got_a_sentence and not leave:
    chunk = stream.read(CHUNK_SIZE)
    # add WangS
    raw_data.extend(array('h', chunk))
    index += CHUNK_SIZE
    TimeUse = time.time() - StartTime

    active = vad.is_speech(chunk, RATE)

    sys.stdout.write('1' if active else '_')
    ring_buffer_flags[ring_buffer_index] = 1 if active else 0
    ring_buffer_index += 1
    ring_buffer_index %= NUM_WINDOW_CHUNKS

    ring_buffer_flags_end[ring_buffer_index_end] = 1 if active else 0
    ring_buffer_index_end += 1
    ring_buffer_index_end %= NUM_WINDOW_CHUNKS_END

    # start point detection
    if not triggered:
      ring_buffer.append(chunk)
      num_voiced = sum(ring_buffer_flags)
      if num_voiced > 0.8 NUM_WINDOW_CHUNKS:
        sys.stdout.write(' Open ')
        triggered = True
        start_point = index - CHUNK_SIZE 20 # start point
        # voiced_frames.extend(ring_buffer)
        ring_buffer.clear()
    # end point detection
    else:
      # voiced_frames.append(chunk)
      ring_buffer.append(chunk)
      num_unvoiced = NUM_WINDOW_CHUNKS_END - sum(ring_buffer_flags_end)
      if num_unvoiced > 0.90 NUM_WINDOW_CHUNKS_END or TimeUse > 10:
        sys.stdout.write(' Close ')
        triggered = False
        got_a_sentence = True

    sys.stdout.flush()

  sys.stdout.write('\n')
  # data = b''.join(voiced_frames)

  stream.stop_stream()
  print(" done recording")
  got_a_sentence = False

  # write to file
  raw_data.reverse()
  for index in range(start_point):
    raw_data.pop()
  raw_data.reverse()
  raw_data = normalize(raw_data)
  record_to_file("recording.wav", raw_data, 2)
  leave = True

stream.close()

程序運(yùn)行方式sudo python vad.py

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Pandas之Dropna濾除缺失數(shù)據(jù)的實(shí)現(xiàn)方法

    Pandas之Dropna濾除缺失數(shù)據(jù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了Pandas之Dropna濾除缺失數(shù)據(jù)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Opencv+Python實(shí)現(xiàn)圖像運(yùn)動(dòng)模糊和高斯模糊的示例

    Opencv+Python實(shí)現(xiàn)圖像運(yùn)動(dòng)模糊和高斯模糊的示例

    今天小編就為大家分享一篇關(guān)于Opencv+Python實(shí)現(xiàn)圖像運(yùn)動(dòng)模糊和高斯模糊的示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Python?tracemalloc跟蹤內(nèi)存分配問題

    Python?tracemalloc跟蹤內(nèi)存分配問題

    這篇文章主要介紹了Python?tracemalloc跟蹤內(nèi)存分配問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 用python查找統(tǒng)一局域網(wǎng)下ip對(duì)應(yīng)的mac地址

    用python查找統(tǒng)一局域網(wǎng)下ip對(duì)應(yīng)的mac地址

    這篇文章主要介紹了用python查找統(tǒng)一局域網(wǎng)下ip對(duì)應(yīng)的mac地址的示例代碼,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • Python標(biāo)準(zhǔn)庫之Math,Random模塊使用詳解

    Python標(biāo)準(zhǔn)庫之Math,Random模塊使用詳解

    math數(shù)學(xué)模塊和random隨機(jī)模塊是Python常用的標(biāo)準(zhǔn)庫之一。本文將詳細(xì)為大家介紹一下這兩個(gè)模塊的使用方法,需要的小伙伴可以參考一下
    2022-05-05
  • pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化

    pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化

    這篇文章主要介紹了pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們也有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • Python中匹配模糊的字符串問題分析

    Python中匹配模糊的字符串問題分析

    這篇文章主要介紹了Python中匹配模糊的字符串的過程,我們將學(xué)習(xí)如何使用process 模塊,該模塊允許我們?cè)谀:址壿嫷膸椭掠行У仄ヅ浠蛱崛∽址?需要的朋友可以參考下
    2023-09-09
  • Python中幾種屬性訪問的區(qū)別與用法詳解

    Python中幾種屬性訪問的區(qū)別與用法詳解

    這篇文章主要給大家介紹了關(guān)于Python中幾種屬性訪問的區(qū)別和用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • Python繪圖Turtle庫的安裝問題解決

    Python繪圖Turtle庫的安裝問題解決

    這篇文章主要介紹了Python繪圖中解決Turtle的安裝問題示例分析,也遇到過相同問題的同學(xué)可以借鑒參考下,希望能夠解決你的問題
    2021-10-10
  • Python集合魔法解鎖數(shù)據(jù)去重技巧應(yīng)用實(shí)例

    Python集合魔法解鎖數(shù)據(jù)去重技巧應(yīng)用實(shí)例

    這篇文章主要為大家介紹了Python集合魔法解鎖數(shù)據(jù)去重技巧應(yīng)用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論

孟州市| 社旗县| 信阳市| 咸阳市| 郎溪县| 常德市| 齐河县| 怀化市| 大埔县| 资源县| 喀喇沁旗| 石城县| 永修县| 东山县| 濉溪县| 新野县| 淮安市| 沁源县| 额敏县| 盐亭县| 开封县| 桦甸市| 平罗县| 巴青县| 淮阳县| 锦州市| 库车县| 兖州市| 齐齐哈尔市| 甘泉县| 祥云县| 巩义市| 乌鲁木齐市| 西乌| 瑞金市| 昌吉市| 青冈县| 德格县| 屯留县| 泌阳县| 和政县|