from channels.generic.websockets import WebsocketDemultiplexer,WebsocketConsumer
from .models import TwilioCallBinding
from google.cloud import speech_v1p1beta1 as speech
from google.cloud.speech_v1 import enums,types
import json
import base64
from .SpeechClientBridge import SpeechClientBridge
class MediaStreamConsumer(WebsocketConsumer):
config = types.RecognitionConfig(
encoding=enums.RecognitionConfig.AudioEncoding.MULAW,
sample_rate_hertz=8000,
language_code='en-US'
)
streaming_config = types.StreamingRecognitionConfig(config=config,interim_results=True)
def on_transcription_response(response):
if not response.results:
return
result = response.results[0]
if not result.alternatives:
return
transcription = result.alternatives[0].transcript
print("Transcription: " + transcription)
def connect(self, message, **kwargs):
self.message.reply_channel.send({"accept": True})
self.bridge = SpeechClientBridge(MediaStreamConsumer.streaming_config,
MediaStreamConsumer.on_transcription_response)
print("****************************************")
def raw_receive(self, message, **kwargs):
data = json.loads(message['text'])
if data["event"] in ("connected", "start"):
print(f"Media WS: Received event '{data['event']}': {message}")
if data["event"] == "media":
media = data["media"]
chunk = base64.b64decode(media["payload"])
self.bridge.add_request(chunk)
if data["event"] == "stop":
print(f"Media WS: Received event 'stop': {message}")
print("Stopping...")
def disconnect(self, message, **kwargs):
self.bridge.terminate()在消息接收和断开事件上,我得到了相同的错误。
AttributeError: 'MediaStreamConsumer' object has no attribute 'bridge'我已在connect事件中分配了桥属性
def connect(self, message, **kwargs):
self.message.reply_channel.send({"accept": True})
self.bridge = SpeechClientBridge(MediaStreamConsumer.streaming_config,
MediaStreamConsumer.on_transcription_response)那我为什么要得到AttributeError呢?
编辑:我添加了print("*****************************")来检查是否自动调用connect方法。
做改变后的追踪。
[2020/10/28 21:27:43] HTTP POST /call-application/media-stream/ 200 [0.04, 127.0.0.1:38000]
[2020/10/28 21:27:44] WebSocket HANDSHAKING /websockets/livecallstream/ [127.0.0.1:38002]
****************************************
[2020/10/28 21:27:44] WebSocket CONNECT /websockets/livecallstream/ [127.0.0.1:38002]
Media WS: Received event 'connected': <channels.message.Message object at 0x7f579c0506a0>
Media WS: Received event 'start': <channels.message.Message object at 0x7f579c067518>
2020-10-28 21:27:44,714 - ERROR - worker - Error processing message with consumer datasleek_twilio.consumers.MediaStreamConsumer:
Traceback (most recent call last):
File "/home/datasleek/trackervenv/lib/python3.6/site-packages/channels/worker.py", line 119, in run
consumer(message, **kwargs)
File "/home/datasleek/trackervenv/lib/python3.6/site-packages/channels/generic/base.py", line 32, in __init__
self.dispatch(message, **kwargs)
File "/home/datasleek/trackervenv/lib/python3.6/site-packages/channels/generic/base.py", line 70, in dispatch
return self.get_handler(message, **kwargs)(message, **kwargs)
File "/home/datasleek/tracker/datasleek_twilio/consumers.py", line 62, in raw_receive
self.bridge.add_request(chunk)
AttributeError: 'MediaStreamConsumer' object has no attribute 'bridge'
2020-10-28 21:27:44,735 - ERROR - worker - Error processing message with consumer datasleek_twilio.consumers.MediaStreamConsumer:
Traceback (most recent call last):
File "/home/datasleek/trackervenv/lib/python3.6/site-packages/channels/worker.py", line 119, in run
consumer(message, **kwargs)
File "/home/datasleek/trackervenv/lib/python3.6/site-packages/channels/generic/base.py", line 32, in __init__
self.dispatch(message, **kwargs)
File "/home/datasleek/trackervenv/lib/python3.6/site-packages/channels/generic/base.py", line 70, in dispatch
return self.get_handler(message, **kwargs)(message, **kwargs)
File "/home/datasleek/tracker/datasleek_twilio/consumers.py", line 62, in raw_receive
self.bridge.add_request(chunk)
AttributeError: 'MediaStreamConsumer' object has no attribute 'bridge'发布于 2020-10-29 09:19:40
正如@Carcigenicate和@AzyCrw4282 4282在注释中提到的那样,connect不是自动调用的。尽管我仍然不确定websockets如何连接,如果没有自动调用connect,因为我可以看到消息来了。无论如何,我做了以下更改,并在进行这些更改后,在控制台中看到了的转录。。
config = types.RecognitionConfig(
encoding=enums.RecognitionConfig.AudioEncoding.MULAW,
sample_rate_hertz=8000,
language_code='en-US'
)
streaming_config = types.StreamingRecognitionConfig(config=config,interim_results=True)
def on_transcription_response(response):
if not response.results:
return
result = response.results[0]
if not result.alternatives:
return
transcription = result.alternatives[0].transcript
print("Transcription: " + transcription)
bridge = None
def set_bridge():
global bridge
if bridge is None:
bridge = SpeechClientBridge(streaming_config,on_transcription_response)
class MediaStreamConsumer(WebsocketConsumer):
def connect(self, message, **kwargs):
self.message.reply_channel.send({"accept": True})
def raw_receive(self, message, **kwargs):
set_bridge()
data = json.loads(message['text'])
if data["event"] in ("connected", "start"):
print(f"Media WS: Received event '{data['event']}': {message}")
if data["event"] == "media":
media = data["media"]
chunk = base64.b64decode(media["payload"])
bridge.add_request(chunk)
if data["event"] == "stop":
print(f"Media WS: Received event 'stop': {message}")
print("Stopping...")
def disconnect(self, message, **kwargs):
bridge.terminate()https://stackoverflow.com/questions/64576423
复制相似问题