首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >属性错误--尽管属性被赋值

属性错误--尽管属性被赋值
EN

Stack Overflow用户
提问于 2020-10-28 15:47:52
回答 1查看 57关注 0票数 0
代码语言:javascript
复制
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()

在消息接收和断开事件上,我得到了相同的错误。

代码语言:javascript
复制
AttributeError: 'MediaStreamConsumer' object has no attribute 'bridge'

我已在connect事件中分配了桥属性

代码语言:javascript
复制
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方法。

做改变后的追踪。

代码语言:javascript
复制
[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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-29 09:19:40

正如@Carcigenicate和@AzyCrw4282 4282在注释中提到的那样,connect不是自动调用的。尽管我仍然不确定websockets如何连接,如果没有自动调用connect,因为我可以看到消息来了。无论如何,我做了以下更改,并在进行这些更改后,在控制台中看到了的转录。

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64576423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档