2016-12-03 16 views
12

Mam kod Pythona, który rozpoznaje mowę za pomocą silnika Google STT i zwróci mi wyniki, ale otrzymam wyniki w ciągach z "cudzysłowami". Nie chcę tych cytatów w moim kodzie, ponieważ użyję go do uruchomienia wielu poleceń i to nie działa. Nie próbowałem niczego, o ile nie dostałem nic do wypróbowania! Jest to funkcja w kodzie Pythona, który rozpozna mowę:Usuń cytaty z ciągu w Pythonie

def recog(): 
    p = subprocess.Popen(['./speech-recog.sh'], stdout=subprocess.PIPE, 
              stderr=subprocess.PIPE) 
    global out,err 
    out, err = p.communicate() 
    print out 

To speech-recog.sh:

#!/bin/bash 

hardware="plughw:1,0" 
duration="3" 
lang="en" 
hw_bool=0 
dur_bool=0 
lang_bool=0 
for var in "[email protected]" 
do 
    if [ "$var" == "-D" ] ; then 
     hw_bool=1 
    elif [ "$var" == "-d" ] ; then 
     dur_bool=1 
    elif [ "$var" == "-l" ] ; then 
     lang_bool=1 
    elif [ $hw_bool == 1 ] ; then 
     hw_bool=0 
     hardware="$var" 
    elif [ $dur_bool == 1 ] ; then 
     dur_bool=0 
     duration="$var" 
    elif [ $lang_bool == 1 ] ; then 
     lang_bool=0 
     lang="$var" 
    else 
     echo "Invalid option, valid options are -D for hardware and -d for duration" 
    fi 
done 

arecord -D $hardware -f S16_LE -t wav -d $duration -r 16000 | flac - -f --best --sample-rate 16000 -o /dev/shm/out.flac 1>/dev/shm/voice.log 2>/dev/shm/voice.log; curl -X POST --data-binary @/dev/shm/out.flac --user-agent 'Mozilla/5.0' --header 'Content-Type: audio/x-flac; rate=16000;' "https://www.google.com/speech-api/v2/recognize?output=json&lang=$lang&key=key&client=Mozilla/5.0" | sed -e 's/[{}]/''/g' | awk -F":" '{print $4}' | awk -F"," '{print $1}' | tr -d '\n' 

rm /dev/shm/out.flac 

ta została podjęta z Voicecommand Programu Steven Hickson sprawił na Raspberry Pi

+0

masz na myśli dodatkowe cytaty do cudzysłowów, które reprezentują ciąg w języku Python? Dołącz polecenia i dane wyjściowe, które masz i czego konkretnie chcesz. – ivan7707

+0

Istnieje wiele duplikatów dla "[Python] usunąć cytaty ciąg" – smci

Odpowiedz

28

wystarczy użyć metody string .replace() jeśli występują one w całym, lub .strip() jeśli występują one tylko na początku i wykończenie:

a = '"sajdkasjdsak" "asdasdasds"' 

a.replace('"', '') 
'sajdkasjdsak asdasdasds' 

# or, if they only occur at start and finish 
a.strip('\'') 
'sajdkasjdsak" "asdasdasds' 
1

Znaki "cytuj" można zastąpić pustym łańcuchem, takim jak:

>>> a = '"sajdkasjdsak" "asdasdasds"' 
>>> a 
'"sajdkasjdsak" "asdasdasds"' 
>>> a = a.replace('"', '') 
>>> a 
'sajdkasjdsak asdasdasds' 

W twoim przypadku możesz zrobić to samo dla zmiennej out.

1
if string.startswith('"'): 
    string = string[1:] 

if string.endswith('"'): 
    string = string[:-1] 
+3

Metody ciąg "strip(), lstrip(), rstrip()" są do tego. – smci

+0

'lstrip()' usuwa wszystkie znaki tego samego typu od lewej. '' "" "hello'.lstrip ('"') = 'hello'' .Jest to może nie być to, co chce OP. –

+0

Czy uważasz, że to podejście jest nieco naiwne? usuń są w środku jego ciąg? Twoje rozwiązanie zostanie złamane –

2

Istnieje kilka sposobów na osiągnięcie tego celu.

  • można skorzystać z wbudowanej funkcji strun .replace() zastąpić wszystkie wystąpienia cudzysłowów w danym ciągu znaków:

    >>> s = '"abcd" efgh' 
    >>> s.replace('"', '') 
    'abcd efgh' 
    >>> 
    
  • Można użyć funkcji ciąg .join() i wyrażenie generator, aby usunąć wszystkie cytaty z danym wyrażenie:

    >>> s = '"abcd" efgh' 
    >>> ''.join(c for c in s if c not in '"') 
    'abcd efgh' 
    >>> 
    
  • można użyć wyrażenia regularnego, aby usunąć wszystkie cytaty z g iven string. Ma to tę zaletę, pozwalając masz kontrolę nad tym, kiedy i gdzie cytat powinien zostać usunięty:

    >>> s = '"abcd" efgh' 
    >>> import re 
    >>> re.sub('"', '', s) 
    'abcd efgh' 
    >>> 
    
Powiązane problemy