9. Future Study
Various sections of the recognizer could be distributed into Digital Signal Processors (DSPs) on the Voice Browser/Gateway or IP Phones. For instance, the gateway might perform voice activity detection to reduce network bandwidth and CPU requirement of the automatic speech recognition (ASR) server. Such extensions are deferred for further study and will not be addressed in this document.10. Security Considerations
The MRCP protocol may carry sensitive information such as account numbers, passwords, etc. For this reason it is important that the client have the option of secure communication with the server for both the control messages as well as the media, though the client is not required to use it. If all MRCP communications happens in a trusted domain behind a firewall, this may not be necessary. If the client or server is deployed in an insecure network, communication happening across this insecure network needs to be protected. In such cases, the following additional security functionality MUST be supported on the MRCP server. MRCP servers MUST implement Transport Layer Security (TLS) to secure the RTSP communication, i.e., the RTSP stack SHOULD support the rtsps: URI form. MRCP servers MUST support Secure Real-Time Transport Protocol (SRTP) as an option to send and receive media.11. RTSP-Based Examples
The following is an example of a typical session of speech synthesis and recognition between a client and the server. Opening the synthesizer. This is the first resource for this session. The server and client agree on a single Session ID 12345678 and set of RTP/RTCP ports on both sides. C->S:SETUP rtsp://media.server.com/media/synthesizer RTSP/1.0 CSeq:2 Transport:RTP/AVP;unicast;client_port=46456-46457 Content-Type:application/sdp
Content-Length:190 v=0 o=- 123 456 IN IP4 10.0.0.1 s=Media Server p=+1-888-555-1212 c=IN IP4 0.0.0.0 t=0 0 m=audio 0 RTP/AVP 0 96 a=rtpmap:0 pcmu/8000 a=rtpmap:96 telephone-event/8000 a=fmtp:96 0-15 S->C:RTSP/1.0 200 OK CSeq:2 Transport:RTP/AVP;unicast;client_port=46456-46457; server_port=46460-46461 Session:12345678 Content-Length:190 Content-Type:application/sdp v=0 o=- 3211724219 3211724219 IN IP4 10.3.2.88 s=Media Server c=IN IP4 0.0.0.0 t=0 0 m=audio 46460 RTP/AVP 0 96 a=rtpmap:0 pcmu/8000 a=rtpmap:96 telephone-event/8000 a=fmtp:96 0-15 Opening a recognizer resource. Uses the existing session ID and ports. C->S:SETUP rtsp://media.server.com/media/recognizer RTSP/1.0 CSeq:3 Transport:RTP/AVP;unicast;client_port=46456-46457; mode=record;ttl=127 Session:12345678 S->C:RTSP/1.0 200 OK CSeq:3 Transport:RTP/AVP;unicast;client_port=46456-46457; server_port=46460-46461;mode=record;ttl=127 Session:12345678
An ANNOUNCE message with the MRCP SPEAK request initiates speech. C->S:ANNOUNCE rtsp://media.server.com/media/synthesizer RTSP/1.0 CSeq:4 Session:12345678 Content-Type:application/mrcp Content-Length:456 SPEAK 543257 MRCP/1.0 Kill-On-Barge-In:false Voice-gender:neutral Voice-category:teenager Prosody-volume:medium Content-Type:application/synthesis+ssml Content-Length:104 <?xml version="1.0"?> <speak> <paragraph> <sentence>You have 4 new messages.</sentence> <sentence>The first is from <say-as type="name">Stephanie Williams</say-as> <mark name="Stephanie"/> and arrived at <break/> <say-as type="time">3:45pm</say-as>.</sentence> <sentence>The subject is <prosody rate="-20%">ski trip</prosody></sentence> </paragraph> </speak> S->C:RTSP/1.0 200 OK CSeq:4 Session:12345678 RTP-Info:url=rtsp://media.server.com/media/synthesizer; seq=9810092;rtptime=3450012 Content-Type:application/mrcp Content-Length:456 MRCP/1.0 543257 200 IN-PROGRESS The synthesizer hits the special marker in the message to be spoken and faithfully informs the client of the event. S->C:ANNOUNCE rtsp://media.server.com/media/synthesizer RTSP/1.0 CSeq:5 Session:12345678
Content-Type:application/mrcp Content-Length:123 SPEECH-MARKER 543257 IN-PROGRESS MRCP/1.0 Speech-Marker:Stephanie C->S:RTSP/1.0 200 OK CSeq:5 The synthesizer finishes with the SPEAK request. S->C:ANNOUNCE rtsp://media.server.com/media/synthesizer RTSP/1.0 CSeq:6 Session:12345678 Content-Type:application/mrcp Content-Length:123 SPEAK-COMPLETE 543257 COMPLETE MRCP/1.0 C->S:RTSP/1.0 200 OK CSeq:6 The recognizer is issued a request to listen for the customer choices. C->S:ANNOUNCE rtsp://media.server.com/media/recognizer RTSP/1.0 CSeq:7 Session:12345678 RECOGNIZE 543258 MRCP/1.0 Content-Type:application/grammar+xml Content-Length:104 <?xml version="1.0"?> <!-- the default grammar language is US English --> <grammar xml:lang="en-US" version="1.0"> <!-- single language attachment to a rule expansion --> <rule id="request"> Can I speak to <one-of xml:lang="fr-CA"> <item>Michel Tremblay</item> <item>Andre Roy</item> </one-of> </rule> </grammar>
S->C:RTSP/1.0 200 OK CSeq:7 Content-Type:application/mrcp Content-Length:123 MRCP/1.0 543258 200 IN-PROGRESS The client issues the next MRCP SPEAK method in an ANNOUNCE message, asking the user the question. It is generally RECOMMENDED when playing a prompt to the user with kill-on-barge-in and asking for input, that the client issue the RECOGNIZE request ahead of the SPEAK request for optimum performance and user experience. This way, it is guaranteed that the recognizer is online before the prompt starts playing and the user's speech will not be truncated at the beginning (especially for power users). C->S:ANNOUNCE rtsp://media.server.com/media/synthesizer RTSP/1.0 CSeq:8 Session:12345678 Content-Type:application/mrcp Content-Length:733 SPEAK 543259 MRCP/1.0 Kill-On-Barge-In:true Content-Type:application/synthesis+ssml Content-Length:104 <?xml version="1.0"?> <speak> <paragraph> <sentence>Welcome to ABC corporation.</sentence> <sentence>Who would you like Talk to.</sentence> </paragraph> </speak> S->C:RTSP/1.0 200 OK CSeq:8 Content-Type:application/mrcp Content-Length:123 MRCP/1.0 543259 200 IN-PROGRESS Since the last SPEAK request had Kill-On-Barge-In set to "true", the message synthesizer is interrupted when the user starts speaking, and the client is notified. Now, since the recognition and synthesizer resources are in the same session, they worked with each other to deliver kill-on-barge-in. If the resources were in different sessions, it would have taken a few more messages before the client got the SPEAK-COMPLETE event from the
synthesizer resource. Whether the synthesizer and recognizer are in the same session or not, the recognizer MUST generate the START-OF- SPEECH event to the client. The client should have then blindly turned around and issued a BARGE-IN-OCCURRED method to the synthesizer resource. The synthesizer, if kill-on-barge-in was enabled on the current SPEAK request, would have then interrupted it and issued SPEAK-COMPLETE event to the client. In this example, since the synthesizer and recognizer are in the same session, the client did not issue the BARGE-IN-OCCURRED method to the synthesizer and assumed that kill- on-barge-in was implemented between the two resources in the same session and worked. The completion-cause code differentiates if this is normal completion or a kill-on-barge-in interruption. S->C:ANNOUNCE rtsp://media.server.com/media/recognizer RTSP/1.0 CSeq:9 Session:12345678 Content-Type:application/mrcp Content-Length:273 START-OF-SPEECH 543258 IN-PROGRESS MRCP/1.0 C->S:RTSP/1.0 200 OK CSeq:9 S->C:ANNOUNCE rtsp://media.server.com/media/synthesizer RTSP/1.0 CSeq:10 Session:12345678 Content-Type:application/mrcp Content-Length:273 SPEAK-COMPLETE 543259 COMPLETE MRCP/1.0 Completion-Cause:000 normal C->S:RTSP/1.0 200 OK CSeq:10 The recognition resource matched the spoken stream to a grammar and generated results. The result of the recognition is returned by the server as part of the RECOGNITION-COMPLETE event. S->C:ANNOUNCE rtsp://media.server.com/media/recognizer RTSP/1.0 CSeq:11 Session:12345678 Content-Type:application/mrcp
Content-Length:733 RECOGNITION-COMPLETE 543258 COMPLETE MRCP/1.0 Completion-Cause:000 success Waveform-URL:http://web.media.com/session123/audio.wav Content-Type:application/x-nlsml Content-Length:104 <?xml version="1.0"?> <result x-model="http://IdentityModel" xmlns:xf="http://www.w3.org/2000/xforms" grammar="session:request1@form-level.store"> <interpretation> <xf:instance name="Person"> <Person> <Name> Andre Roy </Name> </Person> </xf:instance> <input> may I speak to Andre Roy </input> </interpretation> </result> C->S:RTSP/1.0 200 OK CSeq:11 C->S:TEARDOWN rtsp://media.server.com/media/synthesizer RTSP/1.0 CSeq:12 Session:12345678 S->C:RTSP/1.0 200 OK CSeq:12 We are done with the resources and are tearing them down. When the last of the resources for this session are released, the Session-ID and the RTP/RTCP ports are also released. C->S:TEARDOWN rtsp://media.server.com/media/recognizer RTSP/1.0 CSeq:13 Session:12345678 S->C:RTSP/1.0 200 OK CSeq:13
12. Informative References
[1] Fielding, R., Gettys, J., Mogul, J., Frystyk. H., Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext transfer protocol -- HTTP/1.1", RFC 2616, June 1999. [2] Schulzrinne, H., Rao, A., and R. Lanphier, "Real Time Streaming Protocol (RTSP)", RFC 2326, April 1998 [3] Crocker, D. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", RFC 4234, October 2005. [4] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A., Peterson, J., Sparks, R., Handley, M., and E. Schooler, "SIP: Session Initiation Protocol", RFC 3261, June 2002. [5] Handley, M. and V. Jacobson, "SDP: Session Description Protocol", RFC 2327, April 1998. [6] World Wide Web Consortium, "Voice Extensible Markup Language (VoiceXML) Version 2.0", W3C Candidate Recommendation, March 2004. [7] Resnick, P., "Internet Message Format", RFC 2822, April 2001. [8] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997. [9] World Wide Web Consortium, "Speech Synthesis Markup Language (SSML) Version 1.0", W3C Candidate Recommendation, September 2004. [10] World Wide Web Consortium, "Natural Language Semantics Markup Language (NLSML) for the Speech Interface Framework", W3C Working Draft, 30 May 2001. [11] World Wide Web Consortium, "Speech Recognition Grammar Specification Version 1.0", W3C Candidate Recommendation, March 2004. [12] Yergeau, F., "UTF-8, a transformation format of ISO 10646", STD 63, RFC 3629, November 2003. [13] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types", RFC 2046, November 1996.
[14] Levinson, E., "Content-ID and Message-ID Uniform Resource Locators", RFC 2392, August 1998. [15] Schulzrinne, H. and S. Petrack, "RTP Payload for DTMF Digits, Telephony Tones and Telephony Signals", RFC 2833, May 2000. [16] Alvestrand, H., "Tags for the Identification of Languages", BCP 47, RFC 3066, January 2001.
Appendix A. ABNF Message Definitions
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z CHAR = %x01-7F ; any 7-bit US-ASCII character, ; excluding NUL CR = %x0D ; carriage return CRLF = CR LF ; Internet standard newline DIGIT = %x30-39 ; 0-9 DQUOTE = %x22 ; " (Double Quote) HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" HTAB = %x09 ; horizontal tab LF = %x0A ; linefeed OCTET = %x00-FF ; 8 bits of data SP = %x20 ; space WSP = SP / HTAB ; white space LWS = [*WSP CRLF] 1*WSP ; linear whitespace SWS = [LWS] ; sep whitespace UTF8-NONASCII = %xC0-DF 1UTF8-CONT / %xE0-EF 2UTF8-CONT / %xF0-F7 3UTF8-CONT / %xF8-Fb 4UTF8-CONT / %xFC-FD 5UTF8-CONT UTF8-CONT = %x80-BF param = *pchar quoted-string = SWS DQUOTE *(qdtext / quoted-pair ) DQUOTE qdtext = LWS / %x21 / %x23-5B / %x5D-7E / UTF8-NONASCII
quoted-pair = "\" (%x00-09 / %x0B-0C / %x0E-7F) token = 1*(alphanum / "-" / "." / "!" / "%" / "*" / "_" / "+" / "`" / "'" / "~" ) reserved = ";" / "/" / "?" / ":" / "@" / "&" / "=" / "+" / "$" / "," mark = "-" / "_" / "." / "!" / "~" / "*" / "'" / "(" / ")" unreserved = alphanum / mark char = unreserved / escaped / ":" / "@" / "&" / "=" / "+" / "$" / "," alphanum = ALPHA / DIGIT escaped = "%" HEXDIG HEXDIG absoluteURI = scheme ":" ( hier-part / opaque-part ) relativeURI = ( net-path / abs-path / rel-path ) [ "?" query ] hier-part = ( net-path / abs-path ) [ "?" query ] net-path = "//" authority [ abs-path ] abs-path = "/" path-segments rel-path = rel-segment [ abs-path ] rel-segment = 1*( unreserved / escaped / ";" / "@" / "&" / "=" / "+" / "$" / "," ) opaque-part = uric-no-slash *uric uric = reserved / unreserved / escaped uric-no-slash = unreserved / escaped / ";" / "?" / ":" / "@" / "&" / "=" / "+" / "$" / "," path-segments = segment *( "/" segment ) segment = *pchar *( ";" param )
scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) authority = srvr / reg-name srvr = [ [ userinfo "@" ] hostport ] reg-name = 1*( unreserved / escaped / "$" / "," / ";" / ":" / "@" / "&" / "=" / "+" ) query = *uric userinfo = ( user ) [ ":" password ] "@" user = 1*( unreserved / escaped / user-unreserved ) user-unreserved = "&" / "=" / "+" / "$" / "," / ";" / "?" / "/" password = *( unreserved / escaped / "&" / "=" / "+" / "$" / "," ) hostport = host [ ":" port ] host = hostname / IPv4address / IPv6reference hostname = *( domainlabel "." ) toplabel [ "." ] domainlabel = alphanum / alphanum *( alphanum / "-" ) alphanum toplabel = ALPHA / ALPHA *( alphanum / "-" ) alphanum IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT IPv6reference = "[" IPv6address "]" IPv6address = hexpart [ ":" IPv4address ] hexpart = hexseq / hexseq "::" [ hexseq ] / "::" [ hexseq ] hexseq = hex4 *( ":" hex4) hex4 = 1*4HEXDIG
port = 1*DIGIT generic-message = start-line message-header CRLF [ message-body ] message-body = *OCTET start-line = request-line / status-line / event-line request-line = method-name SP request-id SP mrcp-version CRLF status-line = mrcp-version SP request-id SP status-code SP request-state CRLF event-line = event-name SP request-id SP request-state SP mrcp-version CRLF message-header = 1*(generic-header / resource-header) generic-header = active-request-id-list / proxy-sync-id / content-id / content-type / content-length / content-base / content-location / content-encoding / cache-control / logging-tag ; -- content-id is as defined in RFC 2392 and RFC 2046 mrcp-version = "MRCP" "/" 1*DIGIT "." 1*DIGIT request-id = 1*DIGIT status-code = 1*DIGIT active-request-id-list = "Active-Request-Id-List" ":" request-id *("," request-id) CRLF proxy-sync-id = "Proxy-Sync-Id" ":" 1*ALPHA CRLF content-length = "Content-Length" ":" 1*DIGIT CRLF content-base = "Content-Base" ":" absoluteURI CRLF
content-type = "Content-Type" ":" media-type media-type = type "/" subtype *( ";" parameter ) type = token subtype = token parameter = attribute "=" value attribute = token value = token / quoted-string content-encoding = "Content-Encoding" ":" *WSP content-coding *(*WSP "," *WSP content-coding *WSP ) CRLF content-coding = token content-location = "Content-Location" ":" ( absoluteURI / relativeURI ) CRLF cache-control = "Cache-Control" ":" *WSP cache-directive *( *WSP "," *WSP cache-directive *WSP ) CRLF cache-directive = "max-age" "=" delta-seconds / "max-stale" "=" delta-seconds / "min-fresh" "=" delta-seconds logging-tag = "Logging-Tag" ":" 1*ALPHA CRLF resource-header = recognizer-header / synthesizer-header method-name = synthesizer-method / recognizer-method event-name = synthesizer-event / recognizer-event
request-state = "COMPLETE" / "IN-PROGRESS" / "PENDING" synthesizer-method = "SET-PARAMS" / "GET-PARAMS" / "SPEAK" / "STOP" / "PAUSE" / "RESUME" / "BARGE-IN-OCCURRED" / "CONTROL" synthesizer-event = "SPEECH-MARKER" / "SPEAK-COMPLETE" synthesizer-header = jump-target / kill-on-barge-in / speaker-profile / completion-cause / voice-parameter / prosody-parameter / vendor-specific / speech-marker / speech-language / fetch-hint / audio-fetch-hint / fetch-timeout / failed-uri / failed-uri-cause / speak-restart / speak-length recognizer-method = "SET-PARAMS" / "GET-PARAMS" / "DEFINE-GRAMMAR" / "RECOGNIZE" / "GET-RESULT" / "RECOGNITION-START-TIMERS" / "STOP" recognizer-event = "START-OF-SPEECH" / "RECOGNITION-COMPLETE" recognizer-header = confidence-threshold / sensitivity-level / speed-vs-accuracy / n-best-list-length
/ no-input-timeout / recognition-timeout / waveform-url / completion-cause / recognizer-context-block / recognizer-start-timers / vendor-specific / speech-complete-timeout / speech-incomplete-timeout / dtmf-interdigit-timeout / dtmf-term-timeout / dtmf-term-char / fetch-timeout / failed-uri / failed-uri-cause / save-waveform / new-audio-channel / speech-language jump-target = "Jump-Size" ":" speech-length-value CRLF speech-length-value = numeric-speech-length / text-speech-length text-speech-length = 1*ALPHA SP "Tag" numeric-speech-length =("+" / "-") 1*DIGIT SP numeric-speech-unit numeric-speech-unit = "Second" / "Word" / "Sentence" / "Paragraph" delta-seconds = 1*DIGIT kill-on-barge-in = "Kill-On-Barge-In" ":" boolean-value CRLF boolean-value = "true" / "false" speaker-profile = "Speaker-Profile" ":" absoluteURI CRLF completion-cause = "Completion-Cause" ":" 1*DIGIT SP 1*ALPHA CRLF voice-parameter = "Voice-" voice-param-name ":" voice-param-value CRLF
voice-param-name = 1*ALPHA voice-param-value = 1*alphanum prosody-parameter = "Prosody-" prosody-param-name ":" prosody-param-value CRLF prosody-param-name = 1*ALPHA prosody-param-value = 1*alphanum vendor-specific = "Vendor-Specific-Parameters" ":" vendor-specific-av-pair *[";" vendor-specific-av-pair] CRLF vendor-specific-av-pair = vendor-av-pair-name "=" vendor-av-pair-value vendor-av-pair-name = 1*ALPHA vendor-av-pair-value = 1*alphanum speech-marker = "Speech-Marker" ":" 1*ALPHA CRLF speech-language = "Speech-Language" ":" 1*ALPHA CRLF fetch-hint = "Fetch-Hint" ":" 1*ALPHA CRLF audio-fetch-hint = "Audio-Fetch-Hint" ":" 1*ALPHA CRLF fetch-timeout = "Fetch-Timeout" ":" 1*DIGIT CRLF failed-uri = "Failed-URI" ":" absoluteURI CRLF failed-uri-cause = "Failed-URI-Cause" ":" 1*ALPHA CRLF speak-restart = "Speak-Restart" ":" boolean-value CRLF speak-length = "Speak-Length" ":" speech-length-value CRLF confidence-threshold = "Confidence-Threshold" ":" 1*DIGIT CRLF sensitivity-level = "Sensitivity-Level" ":" 1*DIGIT CRLF speed-vs-accuracy = "Speed-Vs-Accuracy" ":" 1*DIGIT CRLF n-best-list-length = "N-Best-List-Length" ":" 1*DIGIT CRLF
no-input-timeout = "No-Input-Timeout" ":" 1*DIGIT CRLF recognition-timeout = "Recognition-Timeout" ":" 1*DIGIT CRLF waveform-url = "Waveform-URL" ":" absoluteURI CRLF recognizer-context-block = "Recognizer-Context-Block" ":" 1*ALPHA CRLF recognizer-start-timers = "Recognizer-Start-Timers" ":" boolean-value CRLF speech-complete-timeout = "Speech-Complete-Timeout" ":" 1*DIGIT CRLF speech-incomplete-timeout = "Speech-Incomplete-Timeout" ":" 1*DIGIT CRLF dtmf-interdigit-timeout = "DTMF-Interdigit-Timeout" ":" 1*DIGIT CRLF dtmf-term-timeout = "DTMF-Term-Timeout" ":" 1*DIGIT CRLF dtmf-term-char = "DTMF-Term-Char" ":" CHAR CRLF save-waveform = "Save-Waveform" ":" boolean-value CRLF new-audio-channel = "New-Audio-Channel" ":" boolean-value CRLFAppendix B. Acknowledgements
Andre Gillet (Nuance Communications) Andrew Hunt (SpeechWorks) Aaron Kneiss (SpeechWorks) Kristian Finlator (SpeechWorks) Martin Dragomirecky (Cisco Systems, Inc.) Pierre Forgues (Nuance Communications) Suresh Kaliannan (Cisco Systems, Inc.) Corey Stohs (Cisco Systems, Inc.) Dan Burnett (Nuance Communications)
Authors' Addresses
Saravanan Shanmugham Cisco Systems, Inc. 170 W. Tasman Drive San Jose, CA 95134 EMail: sarvi@cisco.com Peter Monaco Nuasis Corporation 303 Bryant St. Mountain View, CA 94041 EMail: peter.monaco@nuasis.com Brian Eberman Speechworks, Inc. 695 Atlantic Avenue Boston, MA 02111 EMail: brian.eberman@speechworks.com
Full Copyright Statement Copyright (C) The Internet Society (2006). This document is subject to the rights, licenses and restrictions contained in BCP 78 and at www.rfc-editor.org/copyright.html, and except as set forth therein, the authors retain all their rights. This document and the information contained herein are provided on an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Intellectual Property The IETF takes no position regarding the validity or scope of any Intellectual Property Rights or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; nor does it represent that it has made any independent effort to identify any such rights. Information on the procedures with respect to rights in RFC documents can be found in BCP 78 and BCP 79. Copies of IPR disclosures made to the IETF Secretariat and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this specification can be obtained from the IETF on-line IPR repository at http://www.ietf.org/ipr. The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard. Please address the information to the IETF at ietf-ipr@ietf.org. Acknowledgement Funding for the RFC Editor function is provided by the IETF Administrative Support Activity (IASA).